xzw 2 years ago
parent
commit
a57e2c027d

+ 2 - 2
public/static/lib/potree/potree.js

@@ -92468,7 +92468,7 @@ void main() {
                     this.resetHighMap(); 
                 }
                 
-                this.smoothZoomTo(1, toPano.duration / 2);  
+                this.smoothZoomTo(toPano.zoomLevel || 1, toPano.duration / 2);  
             }
                  
             
@@ -94256,7 +94256,7 @@ void main() {
          
 
         zoomFovTo( fov ) { //通过fov来算zoomLevel 
-            let zoomLevel = this.baseFov / fov;
+            let zoomLevel = Potree.config.view.fov /* this.baseFov */ / fov;
             this.zoomTo( zoomLevel );
         }
     	smoothZoomTo(aimLevel, dur=0) {

File diff suppressed because it is too large
+ 1 - 1
public/static/lib/potree/potree.js.map


+ 6 - 5
src/pages/SViewer.vue

@@ -28,7 +28,7 @@ import { http } from '@/utils/request'
 import Toast from '@/components/dialog/Toast'
 import browser from '@/utils/browser'
 import Calendar from '@/components/calendar/mobile.vue'
-import sync, { loadSourceScene, loadTargetScene , setPanoWithBim} from '@/utils/sync'
+import sync, {laserChangeMode, loadSourceScene, loadTargetScene , setPanoWithBim} from '@/utils/sync'
 
 // 点位信息
 let lastFakeApp = null
@@ -75,7 +75,7 @@ const sourceURL = computed(() => {
     }*/ 
     
     if(lastFakeApp/*sourceFrame.value && (bimChecked.value || sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.loaded)*/){
-        sync.views.fakeAppUpdateView(sourceFrame.value.contentWindow)
+        sync.views.fakeAppUpdateInfo(sourceFrame.value.contentWindow)  //这两个怎么都会报错? bim的得不到app.viewer
     }
     if(bimChecked.value){
         return `smart-bim.html?m=${project.value.bimData.bimOssFilePath}`
@@ -119,14 +119,14 @@ const onLoadSource = () => {
     }else{ 
         win.sceneType = 'laser' 
         win.loaded.then(sdk => { 
-            sync.views.laserCancelFly(app)//win.viewer.images360.cancelFlyToPano() 
+            sync.views.laserInit(win, mode.value)
             loaded();
             
-            setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它
+            /*setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它
                 if(win.Potree){
                     win.Potree.settings.displayMode = mode.value == 0 ? "showPanos" : "showPointCloud"
                 }
-            }, sync.views.settings.checkModeDelay)
+            }, sync.views.settings.checkModeDelay)*/
             
          }) 
     }
@@ -175,6 +175,7 @@ const onModeChange = targetMode => {
     if (sourceFrame.value && sourceFrame.value.contentWindow.loaded) {
         sourceFrame.value.contentWindow.loaded.then(sdk => sdk.scene.changeMode(targetMode))
         mode.value = targetMode
+        sync.views.laserChangeMode(mode.value)
     }
 }
 

+ 1 - 1
src/pages/Viewer.vue

@@ -223,7 +223,7 @@ const onModeChange = targetMode => {
     if (sync.sourceInst) {
         sync.sourceInst.loaded.then(sdk => sdk.scene.changeMode(targetMode))
         mode.value = targetMode
-        laserChangeMode(mode.value)
+        sync.views.laserChangeMode(mode.value)
     }
 }
 const onPickDate = name => {

+ 145 - 130
src/utils/ConvertViews.js

@@ -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

+ 7 - 30
src/utils/sync.js

@@ -10,7 +10,7 @@ const isEdit = browser.urlHasValue('adjust')
 
 let panoData 
 let targetPano
-let laserMode  
+ 
 export function setPanoWithBim(data){
     if(!isEdit){
         panoData = data 
@@ -85,8 +85,8 @@ export function loadSourceScene(sourceFrame,type,mode) {
     
     if(type == 'laser'){
         win.loaded.then(sdk => {
-            sdk.scene.changeMode(mode)  
-            laserLoaded(win,mode)
+            //sdk.scene.changeMode(mode)  
+            views.laserInit(win,mode)
             loaded()
         })  
     }else if(type == 'kankan'){  
@@ -97,6 +97,7 @@ export function loadSourceScene(sourceFrame,type,mode) {
     }
 }
 
+ 
 /**
  * 右屏加载
  * @param {String} type kankan|laser|bim
@@ -133,7 +134,7 @@ export function loadTargetScene(targetFrame, type, mode) {
         win.loaded.then(sdk => {
             //targetApp.viewer.scene.changeMode(mode)  
             if(type == 'laser'){
-                laserLoaded(win,mode)
+                views.laserInit(win,mode)
             }else if(type == 'bim'){
             } 
           
@@ -159,33 +160,9 @@ window.Log = function(value, color, fontSize){
     console.warn(`%c${value}`, `color:${color};font-size:${fontSize}px`) 
 }
   
-function laserLoaded(app,mode){
-    if(!app.viewer){
-        return console.error('!app.viewer', app.viewer)
-    }
-    laserMode = mode
-    views.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 = laserMode == 0 ? "showPanos" : "showPointCloud"
-        }
-    }, views.settings.checkModeDelay)
-
-}
+ 
 
-export function laserChangeMode(mode){
-    laserMode = mode
-}
+ 
 
 window.addEventListener('mouseup',(e)=>{//拖拽出窗口外才执行
     //iframe的window的mouseup 在拖拽出窗口外居然不执行,只好用全局的通知它们