|
@@ -9,67 +9,66 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
super()
|
|
|
this.settings = {
|
|
|
durations : {flyToPano:1000, dolly:20, bimAniOrigin:1000},
|
|
|
- checkModeDelay : 1000,
|
|
|
-
|
|
|
-
|
|
|
+ checkModeDelay : 1000,
|
|
|
}
|
|
|
-
|
|
|
+ this.convertInfo //包含转换信息
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
- bindWithSameFakeType(sourceFakeApp, targetApp){//for mobile 实际只有一个场景,未分屏,和上一个场景相比
|
|
|
- let sourceApp = {sceneType: sourceFakeApp.sceneType, fakeApp:sourceFakeApp}
|
|
|
-
|
|
|
- this.createFakeApp(targetApp, true)
|
|
|
-
|
|
|
- let convertInfo = this.computeAveDiffLon(sourceFakeApp, targetApp.fakeApp)
|
|
|
-
|
|
|
+ bindWithSameFakeType(sourceFakeApp, targetApp){//和另一个虚拟场景数据相配。 用于手机未分屏,切换场景;或者pc和bim对比时切换场景。
|
|
|
+ let sourceApp = {sceneType: sourceFakeApp.sceneType, fakeApp:sourceFakeApp} //上一个场景
|
|
|
+ this.createFakeApp(targetApp, true)//当前场景
|
|
|
sourceApp.sceneName = 'sourceApp'
|
|
|
targetApp.sceneName = 'targetApp'
|
|
|
|
|
|
-
|
|
|
+ let convertInfo = this.computeAveDiffLon(sourceFakeApp, targetApp.fakeApp)
|
|
|
+
|
|
|
if(sourceApp.sceneType == 'laser'){
|
|
|
let data = this.computeShift({sourceApp,targetApp, convertInfo}) //因为有点云模式自由移动所以需要计算
|
|
|
- convertInfo.convertMatrix = data.convertMatrix
|
|
|
- convertInfo.convertMatrixInvert = data.convertMatrixInvert
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- this.syncView(sourceApp, targetApp, convertInfo)
|
|
|
+
|
|
|
if(sourceApp.sceneType == 'kankan' || sourceFakeApp.viewInfo.isAtPano){
|
|
|
- this.flyToPano(targetApp, sourceFakeApp.viewInfo.currentPano,{duration:0})
|
|
|
+ this.flyToPano(targetApp, sourceFakeApp.viewInfo.currentPano,{duration:0, zoomLevel:sourceFakeApp.viewInfo.zoomLevel})
|
|
|
}
|
|
|
-
|
|
|
+ this.syncView(sourceApp, targetApp, convertInfo)
|
|
|
|
|
|
if(sourceApp.sceneType == 'laser'){
|
|
|
targetApp.viewer.mainViewport.view.applyToCamera(targetApp.viewer.mainViewport.camera)//使获得的cameraInfo正确
|
|
|
}else if(sourceApp.sceneType == 'kankan'){
|
|
|
targetApp.app.core.get('Player').cameraControls.activeControl.locked = false //怎么刚加载时lock了
|
|
|
targetApp.app.core.get('Player').update()//cameraControls.activeControl.update() //使获得的cameraInfo正确
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ return convertInfo
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
bindWithSameType(sourceApp,targetApp, isSwitchScene){ //左右分屏 同类型
|
|
|
|
|
|
- this.sourceApp = sourceApp
|
|
|
- this.targetApp = targetApp
|
|
|
- this.createFakeApp(sourceApp)
|
|
|
- this.createFakeApp(targetApp)
|
|
|
+
|
|
|
+ let reverse = isSwitchScene == 'source' //如果是左屏被换,则是左屏要跟右屏同步
|
|
|
+
|
|
|
+ let master = reverse ? targetApp : sourceApp
|
|
|
+ let customer = reverse ? sourceApp : targetApp
|
|
|
+ this.createFakeApp(master,true)
|
|
|
+ this.convertInfo = this.bindWithSameFakeType(master.fakeApp, customer) //先同步第一个画面
|
|
|
+
|
|
|
+ //-------------------
|
|
|
|
|
|
- this.convertInfo = this.computeAveDiffLon(sourceApp.fakeApp, targetApp.fakeApp)
|
|
|
|
|
|
+
|
|
|
+ this.sourceApp = sourceApp
|
|
|
+ this.targetApp = targetApp
|
|
|
sourceApp.sceneName = 'sourceApp'
|
|
|
targetApp.sceneName = 'targetApp'
|
|
|
|
|
|
- if(sourceApp.sceneType == 'laser'){
|
|
|
- {
|
|
|
- let data = this.computeShift({sourceApp,targetApp, convertInfo:this.convertInfo}) //因为有点云模式自由移动所以需要计算
|
|
|
- this.convertInfo.convertMatrix = data.convertMatrix
|
|
|
- this.convertInfo.convertMatrixInvert = data.convertMatrixInvert
|
|
|
- }
|
|
|
+
|
|
|
+ //后续的同步
|
|
|
+
|
|
|
+ if(sourceApp.sceneType == 'laser'){
|
|
|
//只监听左边
|
|
|
let displayMode = (e)=>{
|
|
|
targetApp.Potree.settings.displayMode = e.mode
|
|
@@ -98,7 +97,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
var cameraMove = (e)=>{
|
|
|
if(master != this.masterApp || !customer.viewer )return
|
|
|
|
|
|
- this.fakeAppUpdateView(master)
|
|
|
+ this.fakeAppUpdateInfo(master)
|
|
|
|
|
|
master.fakeApp.viewInfo.quaternionChanged = e.changeInfo && e.changeInfo.quaternionChanged
|
|
|
this.syncView(master, customer)
|
|
@@ -131,7 +130,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
var cameraMove = (e)=>{//暂时只有漫游模式
|
|
|
if(!e.hasChanged.cameraChanged || !customer.app || !customer.app.core)return
|
|
|
|
|
|
- this.fakeAppUpdateView(master)
|
|
|
+ this.fakeAppUpdateInfo(master)
|
|
|
this.syncView(master, customer)
|
|
|
}
|
|
|
player1.on("update",cameraMove)
|
|
@@ -171,35 +170,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
bind(sourceApp, targetApp)
|
|
|
bind(targetApp, sourceApp)
|
|
|
|
|
|
-
|
|
|
- //切换其中一个场景后同步初始漫游点
|
|
|
- if(isSwitchScene){
|
|
|
-
|
|
|
- setTimeout(()=>{
|
|
|
- let master = isSwitchScene == 'target' ? sourceApp : targetApp
|
|
|
- let customer = isSwitchScene == 'target' ? targetApp : sourceApp
|
|
|
- this.masterApp = master
|
|
|
-
|
|
|
- this.fakeAppUpdateView(master)
|
|
|
- this.syncView(master, customer)
|
|
|
-
|
|
|
-
|
|
|
- if(master.sceneType == 'laser'){
|
|
|
-
|
|
|
- let pano = master.viewer.images360.nextPano || master.viewer.images360.currentPano
|
|
|
-
|
|
|
- pano && this.flyToPano(customer, pano.id, { duration: 0, callback:()=>{
|
|
|
- customer.Potree.settings.displayMode = master.Potree.settings.displayMode
|
|
|
- }})
|
|
|
- //master.viewer.dispatchEvent({type:'camera_changed',changeInfo:{quaternionChanged:true},viewport:master.viewer.mainViewport }) //朝向位置同步
|
|
|
- }else{
|
|
|
- //master.app.core.get('Player').emit("update",{ hasChanged:{cameraChanged:true} })//朝向同步
|
|
|
- let pano = master.app.core.get('Player').nextPano || master.app.core.get('Player').currentPano
|
|
|
-
|
|
|
- pano && this.flyToPano(customer, pano.id, { duration: 0 })
|
|
|
- }
|
|
|
- },1)//要延迟,否则角度和pano都不成功
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
this.loaded = true
|
|
|
}
|
|
@@ -207,8 +178,6 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
bindFakeWithBim(sourceFakeApp, targetApp, panoData ){// bim和其他类型互转(mobile)
|
|
|
if(!panoData)return
|
|
|
|
|
@@ -219,15 +188,15 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
let {sourcePano, targetPano} = this.bimGetPanoData(sourceApp, targetApp, panoData)
|
|
|
|
|
|
let convertAxis = sourceApp.sceneType == 'kankan' ? 'YupToZup' : targetApp.sceneType == 'kankan' ? 'ZupToYup' : null
|
|
|
-
|
|
|
- let convertInfo = this.computeShift({sourcePano, targetPano, convertAxis})
|
|
|
+ let convertInfo = {convertAxis}
|
|
|
+ this.computeShift({sourcePano, targetPano, convertInfo})
|
|
|
|
|
|
- console.log('convertInfo', convertInfo, sourcePano, targetPano)
|
|
|
+ //console.log('convertInfo', convertInfo, sourcePano, targetPano)
|
|
|
|
|
|
|
|
|
let selectBestPose = ()=>{
|
|
|
|
|
|
- let data = this.getTranPosData(sourceFakeApp.viewInfo, convertInfo )
|
|
|
+ let data = this.getTranPosData(sourceFakeApp.viewInfo, convertInfo, convertInfo.targetFakeApp == targetApp.fakeApp)
|
|
|
|
|
|
let panos = targetApp.fakeApp.panos;
|
|
|
|
|
@@ -259,7 +228,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
|
|
|
|
|
|
if(targetApp.sceneType == 'bim' ){
|
|
|
-
|
|
|
+ sourceFakeApp.viewInfo.fov = null; //暂不改变bim单屏的fov,因为bim变不回来
|
|
|
this.syncPosRot(sourceFakeApp.viewInfo, targetApp, convertInfo)
|
|
|
|
|
|
}else if(targetApp.sceneType == 'laser' ){
|
|
@@ -311,13 +280,11 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
|
|
|
|
|
|
var convertAxis = sourceApp.sceneType == 'kankan' && targetApp.sceneType == 'bim' && 'YupToZup'// Y朝上需要转换
|
|
|
+
|
|
|
+ this.convertInfo = this.computeShift({sourcePano, targetPano, convertInfo:{convertAxis}})
|
|
|
|
|
|
this.lastCamStatus = bimViewer.getCameraStatus()
|
|
|
|
|
|
- this.convertInfo = this.computeShift({sourcePano, targetPano, convertAxis})
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
bimViewer.addEventListener('Rendered', (e)=>{//反向改变左侧相机
|
|
|
|
|
|
let info = bimViewer.getCameraStatus()
|
|
@@ -326,8 +293,13 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
|| !math.closeTo(this.lastCamStatus.fov, info.fov)
|
|
|
|
|
|
if(poseChanged){
|
|
|
- if(this.ifCanChangePos(this.sourceApp)){
|
|
|
- this.send(info)
|
|
|
+ if(this.ifCanChangePos(this.sourceApp)){
|
|
|
+
|
|
|
+ let data = this.getTranPosData(info, this.convertInfo, true )
|
|
|
+
|
|
|
+ this.laserSyncView(this.sourceApp, data)
|
|
|
+
|
|
|
+
|
|
|
this.lastCamStatus = info
|
|
|
}
|
|
|
}
|
|
@@ -335,7 +307,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
})
|
|
|
|
|
|
if(needBindEvent){
|
|
|
- this.bindCamEvent()
|
|
|
+ this.bimBindCamEvent()
|
|
|
}else{//替换的左侧的,需要使左侧和右侧同步, 其实是左侧要和上一个左侧先同步,再让右侧和左侧同步
|
|
|
|
|
|
this.bindWithSameFakeType(this.lastFakeApp, sourceApp)
|
|
@@ -389,7 +361,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
this.syncPosRot(data)
|
|
|
this.loaded = true
|
|
|
}else{
|
|
|
- //分屏 不同步
|
|
|
+ //分屏 不同步(设置点位绑定页面)
|
|
|
|
|
|
let data = this.getCameraData(sourceApp)
|
|
|
let camera = bimViewer.getViewer().camera
|
|
@@ -508,30 +480,36 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
return {
|
|
|
diffLon : diffLonAve,
|
|
|
diffQua ,
|
|
|
- diffQuaInvert : diffQua.clone().invert()
|
|
|
+ diffQuaInvert : diffQua.clone().invert(),
|
|
|
+ sourceFakeApp,
|
|
|
+ targetFakeApp
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
- computeShift(o={}/* sourcePano, targetPano */) { //获取两个场景的旋转和位移偏差值
|
|
|
+
|
|
|
+
|
|
|
+ computeShift(o={} ) { //获取两个可自由移动的场景的旋转和位移偏差值
|
|
|
//需要点的个数>1, 且两个场景点一一对应,位置接近且顺序一致
|
|
|
|
|
|
- let panoPos1, panoPos2
|
|
|
+ let panoPos1, panoPos2, convertInfo = o.convertInfo || {}
|
|
|
|
|
|
if(o.sourceApp && o.targetApp && o.sourceApp.sceneType == o.targetApp.sceneType){
|
|
|
- var angle = o.convertInfo.diffLon; //直接使用 更精准
|
|
|
+ var angle = convertInfo.diffLon; //直接使用 更精准
|
|
|
panoPos1 = o.sourceApp.fakeApp.panos.map(e=>{
|
|
|
return e.position
|
|
|
})
|
|
|
panoPos2 = o.targetApp.fakeApp.panos.map(e=>{
|
|
|
return e.position
|
|
|
})
|
|
|
+ convertInfo.sourceFakeApp = o.sourceApp.fakeApp
|
|
|
+ convertInfo.targetFakeApp = o.targetApp.fakeApp
|
|
|
}else{
|
|
|
panoPos1 = o.sourcePano.map(e=>e.position) //pick两个点来计算
|
|
|
panoPos2 = o.targetPano.map(e=>e.position)
|
|
|
|
|
|
- if(o.convertAxis){
|
|
|
- panoPos1 = panoPos1.map(e=>math.convertVector[o.convertAxis](e))
|
|
|
+ if(convertInfo.convertAxis){
|
|
|
+ panoPos1 = panoPos1.map(e=>math.convertVector[convertInfo.convertAxis](e))
|
|
|
}
|
|
|
var vec1 = new THREE.Vector3().subVectors(panoPos1[0], panoPos1[1]) //旧的向量
|
|
|
var vec2 = new THREE.Vector3().subVectors(panoPos2[0], panoPos2[1])//新的向量
|
|
@@ -547,9 +525,13 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
matrix.premultiply(rotateMatrix)//和旋转
|
|
|
var moveBackMatrix = new THREE.Matrix4().setPosition(panoPos2[0])
|
|
|
matrix.premultiply(moveBackMatrix)//再移动到realPosition的点0处
|
|
|
-
|
|
|
-
|
|
|
- return { convertMatrix: matrix, convertMatrixInvert:matrix.clone().invert(), convertAxis:o.convertAxis}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ convertInfo.convertMatrix = matrix
|
|
|
+ convertInfo.convertMatrixInvert = matrix.clone().invert()
|
|
|
+ return convertInfo
|
|
|
+ //return { convertMatrix: matrix, convertMatrixInvert:matrix.clone().invert(), convertAxis:o.convertAxis}
|
|
|
|
|
|
|
|
|
}
|
|
@@ -563,7 +545,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
return this.firstData = data
|
|
|
} */
|
|
|
convertInfo = convertInfo || this.convertInfo
|
|
|
- let {position,target} = this.getTranPosData(data, convertInfo )
|
|
|
+ let {position,target} = this.getTranPosData(data, convertInfo, customer && customer.fakeApp == convertInfo.sourceFakeApp )
|
|
|
|
|
|
|
|
|
if(customer && customer.sceneType == 'laser'){
|
|
@@ -581,7 +563,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
this.lastCamStatus = msg //记录下来,防止反向传输
|
|
|
|
|
|
let camera = bimViewer.getViewer().camera
|
|
|
- if(camera.fov != data.fov){
|
|
|
+ if(data.fov && camera.fov != data.fov){
|
|
|
camera.fov = data.fov
|
|
|
camera.updateProjectionMatrix()
|
|
|
}
|
|
@@ -597,12 +579,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
|
|
|
|
|
|
|
|
|
- send(info){
|
|
|
- //let camera = bimViewer.getViewer().camera
|
|
|
- let data = this.getTranPosData(info, this.convertInfo, true )
|
|
|
-
|
|
|
- this.laserSyncView(this.sourceApp, data) //左侧只有laser点云模式才能接收到
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
/*
|
|
|
laser暂时做成这样: 全景模式时不跟踪pos,跟踪pano变化。点云模式时也跟踪pano变化,但移动时完全跟踪位置变化 ,所以会有左边marker在脚下,右边marker不在脚下的情况。
|
|
@@ -627,7 +604,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
}
|
|
|
|
|
|
if( !sourcePano[0] || !sourcePano[1] || !targetPano[0] || !targetPano[1] ){
|
|
|
- console.error('!sourcePano[0] || !sourcePano[1] || !targetPano[0] || !targetPano[1]')
|
|
|
+ console.error('场景绑定有误 !sourcePano[0] || !sourcePano[1] || !targetPano[0] || !targetPano[1]')
|
|
|
}
|
|
|
|
|
|
|
|
@@ -636,7 +613,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
}
|
|
|
|
|
|
|
|
|
- getTranPosData(data, convertInfo, ifRevert ){
|
|
|
+ getTranPosData(data, convertInfo, ifRevert ){//根据convertInfo获得转换的数据
|
|
|
let position = new THREE.Vector3, target = new THREE.Vector3
|
|
|
|
|
|
if(data.position){
|
|
@@ -677,13 +654,14 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
position: camera.position.clone(),
|
|
|
quaternion: camera.quaternion.clone(),
|
|
|
fov: camera.fov,
|
|
|
+ zoomLevel: app.viewer.images360.zoomLevel,
|
|
|
}
|
|
|
}else if(app.sceneType == 'kankan'){
|
|
|
let player = app.app.core.get('Player')
|
|
|
return {
|
|
|
position: player.position.clone(),
|
|
|
- quaternion: player.quaternion.clone(),
|
|
|
- fov: player.zoomFov,
|
|
|
+ quaternion: player.quaternion.clone(),
|
|
|
+ zoomLevel: player.zoomLevel,//fov: player.zoomFov,
|
|
|
}
|
|
|
}else{
|
|
|
let bimViewer = app.viewer
|
|
@@ -697,28 +675,29 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
}
|
|
|
|
|
|
|
|
|
- createFakeApp(app, addsubInfo){//for mobile
|
|
|
-
|
|
|
- let fakeApp = {
|
|
|
- isFake : true, //标志是虚拟的app。每个真实的app都要带一个这个。在移动端如果大的销毁了还有小的
|
|
|
- sceneType : app.sceneType
|
|
|
- }
|
|
|
- if(app.sceneType != 'bim'){
|
|
|
- function getPanos(panos){ // only data
|
|
|
- return panos.map(e=>{return {id:e.id, position:e.position, quaternion:e.quaternion}})
|
|
|
- }
|
|
|
- fakeApp.panos = app.sceneType == 'laser' ? getPanos(app.viewer.images360.panos) : getPanos(app.app.core.get('Player').model.panos.list)
|
|
|
+ createFakeApp(app, addsubInfo){ //为每个app创建fakeApp, 里面包含了基本信息。
|
|
|
+ if(!app.fakeApp){//不能重复建立,因为可能绑定在了convertInfo里
|
|
|
+ let fakeApp = {
|
|
|
+ isFake : true, //标志是虚拟的app。每个真实的app都要带一个这个。在移动端如果大的销毁了还有小的
|
|
|
+ sceneType : app.sceneType
|
|
|
+ }
|
|
|
+ if(app.sceneType != 'bim'){
|
|
|
+ function getPanos(panos){ // only data
|
|
|
+ return panos.map(e=>{return {id:e.id, position:e.position, quaternion:e.quaternion}})
|
|
|
+ }
|
|
|
+ fakeApp.panos = app.sceneType == 'laser' ? getPanos(app.viewer.images360.panos) : getPanos(app.app.core.get('Player').model.panos.list)
|
|
|
+ }
|
|
|
+
|
|
|
+ app.fakeApp = fakeApp
|
|
|
}
|
|
|
-
|
|
|
- app.fakeApp = fakeApp
|
|
|
|
|
|
if(addsubInfo){
|
|
|
- this.fakeAppUpdateView(app)
|
|
|
+ this.fakeAppUpdateInfo(app)
|
|
|
}
|
|
|
- return fakeApp
|
|
|
+ return app.fakeApp
|
|
|
}
|
|
|
|
|
|
- fakeAppUpdateView(app){
|
|
|
+ fakeAppUpdateInfo(app){ //更新表现信息
|
|
|
let viewInfo
|
|
|
let cameraData = this.getCameraData(app)
|
|
|
if(app.sceneType == 'laser'){
|
|
@@ -757,11 +736,11 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
return app.sceneType == 'laser' ? app.viewer.images360.getPano(id) : app.app.core.get('Player').panos.index[id]
|
|
|
} */
|
|
|
|
|
|
- syncView(master, customer, convertInfo ){//同类型 相当于moveCamera的函数
|
|
|
+ syncView(master, customer, convertInfo ){//同类型的同步( 相当于moveCamera的函数 ),但不包括点位的同步
|
|
|
let fakeApp = master.fakeApp;
|
|
|
convertInfo = convertInfo || this.convertInfo
|
|
|
if(fakeApp.sceneType == 'laser'){
|
|
|
- customer.Potree.settings.displayMode = fakeApp.viewInfo.displayMode
|
|
|
+ //customer.Potree.settings.displayMode = fakeApp.viewInfo.displayMode
|
|
|
if(fakeApp.viewInfo.isAtPano || fakeApp.viewInfo.displayMode == 'showPanos'){ //不改变漫游点,仅转换朝向
|
|
|
if( fakeApp.viewInfo.quaternionChanged){
|
|
|
|
|
@@ -772,10 +751,16 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
//console.log('cameraMove',customer == this.targetApp)
|
|
|
}
|
|
|
if(fakeApp.viewInfo.displayMode == 'showPanos' ){
|
|
|
- if(customer.viewer.mainViewport.camera.fov != fakeApp.viewInfo.fov){
|
|
|
+ /* if(customer.viewer.mainViewport.camera.fov != fakeApp.viewInfo.fov){
|
|
|
customer.viewer.mainViewport.camera.fov = fakeApp.viewInfo.fov
|
|
|
customer.viewer.mainViewport.camera.updateProjectionMatrix()
|
|
|
- }
|
|
|
+ } */
|
|
|
+
|
|
|
+ if(customer.viewer.images360.zoomLevel != fakeApp.viewInfo.zoomLevel){
|
|
|
+ customer.viewer.images360.zoomTo(fakeApp.viewInfo.zoomLevel , !0)
|
|
|
+ //customer.viewer.mainViewport.camera.updateProjectionMatrix()
|
|
|
+ }
|
|
|
+ customer.Potree.settings.zoom.max = Math.max(fakeApp.viewInfo.zoomLevel, customer.Potree.settings.zoom.max);//防止最大只有2
|
|
|
}
|
|
|
}else{//转换朝向和位置
|
|
|
this.syncPosRot(fakeApp.viewInfo, customer , convertInfo)
|
|
@@ -789,8 +774,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
if(player.zoomLevel != fakeApp.viewInfo.zoomLevel){
|
|
|
player.zoomTo(fakeApp.viewInfo.zoomLevel)
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
@@ -799,13 +783,44 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
app.viewer.mainViewport.view.lookAt(data.target)
|
|
|
}
|
|
|
|
|
|
- laserCancelFly(app){
|
|
|
+ laserCancelFly(app){//laser清除移动到下一个位置的动画
|
|
|
app.viewer.images360.cancelFlyToPano()
|
|
|
app.viewer.mainViewport.view.cancelFlying()
|
|
|
}
|
|
|
|
|
|
+ laserInit(app, mode){//加载完laser后立即初始化
|
|
|
+ if(!app.viewer){
|
|
|
+ return console.error('!app.viewer', app.viewer)
|
|
|
+ }
|
|
|
+ this.laserMode = mode
|
|
|
+ app.Potree.settings.displayMode = this.laserMode == 0 ? "showPanos" : "showPointCloud" //先修改否则一开始不一样后面位置同步不了
|
|
|
+
|
|
|
+
|
|
|
+ app.viewer.images360.baseFov = app.Potree.config.view.fov //暂时加这一句,过后删除
|
|
|
+
|
|
|
+ this.laserCancelFly(app)//app.viewer.images360.cancelFlyToPano()
|
|
|
+ app.viewer.mainViewport.view.minPitch += 0.01 //防止bim垂直视角上的闪烁(似乎是因 up 要乘以某矩阵导致微小偏差所致)
|
|
|
+ app.viewer.mainViewport.view.minPitch -= 0.01
|
|
|
+ /* app.viewer.images360.panos.forEach(pano=>{
|
|
|
+ app.viewer.updateVisible(pano.label2, 'notDisplay', true)
|
|
|
+ pano.dispatchEvent({type:'changeMarkerTex',name:'ring'})
|
|
|
+ }) */
|
|
|
+ //app.Potree.settings.pointDensity = 'high'
|
|
|
+ app.Potree.settings.UserDensityPercent = 1 ; //因为nodeMaxLevel不同,感觉只有最高质量能看起来一样
|
|
|
+ app.viewer.setPointLevels()
|
|
|
+ app.Potree.settings.rotAroundPoint = false //去除原因:比较好同步,尤其当左边在当前点位,右边同步后却离开当前点位的话拖拽就会绕点旋转了
|
|
|
+ setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它,再确保一次
|
|
|
+ if(app.Potree){
|
|
|
+ app.Potree.settings.displayMode = this.laserMode == 0 ? "showPanos" : "showPointCloud"
|
|
|
+ }
|
|
|
+ }, this.settings.checkModeDelay)
|
|
|
+
|
|
|
+ }
|
|
|
+ laserChangeMode(mode){//整个页面的mode是统一的
|
|
|
+ this.laserMode = mode
|
|
|
+ }
|
|
|
|
|
|
- bimFlyTo(data){
|
|
|
+ bimFlyTo(data){//bim修改位置,可渐变
|
|
|
let info = bimViewer.getCameraStatus()
|
|
|
|
|
|
let vec = new THREE.Vector3().subVectors(info.target, info.position)
|
|
@@ -861,12 +876,12 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
this.updateCtrlEnable()
|
|
|
}
|
|
|
|
|
|
- updateCtrlEnable(){
|
|
|
+ updateCtrlEnable(){//是否禁止bim响应操作
|
|
|
this.bimViewer.camera3D.enableRotate(this.locked ? false : true)
|
|
|
this.bimViewer.enableShortcutKey((this.locked || this.isPanoMode) ? false : true) //键盘移动
|
|
|
}
|
|
|
|
|
|
- bindCamEvent(){//传递到另一边的dom
|
|
|
+ bimBindCamEvent(){//bim的分屏 是由另一方的camera带动bim的camera,故需要将bim的鼠标事件传递到另一边
|
|
|
this.lockCamera(true)
|
|
|
|
|
|
|
|
@@ -936,15 +951,15 @@ export default class ConvertViews extends THREE.EventDispatcher{
|
|
|
|
|
|
}
|
|
|
|
|
|
- clear(o={}){
|
|
|
+
|
|
|
+
|
|
|
+ clear(o={}){//加载新场景前清除一下
|
|
|
this.loaded = false;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
if(o.dontClearTarget){
|
|
|
if(this.sourceApp){
|
|
|
this.lastFakeApp = this.sourceApp.fakeApp //记住当前左屏
|
|
|
- this.fakeAppUpdateView(this.sourceApp)
|
|
|
+ this.fakeAppUpdateInfo(this.sourceApp)
|
|
|
}
|
|
|
}else{
|
|
|
this.targetApp = null
|