Переглянути джерело

Merge branch 'dev' of http://192.168.0.115:3000/4dkankan/4dkankan_bim into dev

rindy 2 роки тому
батько
коміт
9882926f27

+ 68 - 83
public/static/lib/potree/potree.js

@@ -762,8 +762,7 @@
         zoom:{
             enabled : true,
             min:1,
-            max: config$1.highQualityMaxZoom,
-            activationThreshold: 1.1,
+            max: config$1.highQualityMaxZoom 
         },
         navConstantly:true,
         navTileClass: browser.isMobile() ? '1k' : '2k',  //默认加载到
@@ -64997,11 +64996,12 @@ void main() {
 
     const Buttons = {// MouseEvent.buttons
         //buttons,设置按下了鼠标哪些键,是一个3个比特位的二进制值,默认为0。1表示按下主键(通常是左键),2表示按下次要键(通常是右键),4表示按下辅助键(通常是中间的键)。
-    	NONE:0,//add
-        
+    	NONE:0,//add 
         LEFT: 0b0001,
     	RIGHT: 0b0010,
-    	MIDDLE: 0b0100
+    	MIDDLE: 0b0100,
+        'L+R': 0b0011
+        
     };
     /*  如果访问的是button, 用THREE.MOUSE来判断:
         button,设置按下了哪一个鼠标按键,默认为0。-1表示没有按键,0表示按下主键(通常是左键),1表示按下辅助键(通常是中间的键),2表示按下次要键(通常是右键)
@@ -68253,7 +68253,7 @@ void main() {
                 this.nodeMaxLevel = level; 
                 //viewer.dispatchEvent({type:'updateNodeMaxLevel', pointcloud: this, nodeMaxLevel:level}) 
                  
-                 console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel);                
+                //console.log('updateNodeMaxLevel ' + this.dataset_id + " : "+ this.nodeMaxLevel)                
                   
                 this.setPointLevel();//重新计算
                  
@@ -84427,8 +84427,8 @@ void main() {
                     } 
                 }else {
                     //mode = e.buttons === Buttons.LEFT && (!e.dragViewport || e.dragViewport.name == 'MainView') ? 'rotate' : 'pan'
-                    mode = e.buttons === Buttons.LEFT && camera.type != 'OrthographicCamera' ? 'rotate' : 'pan';
-                }
+                    mode = (e.buttons === Buttons.LEFT || e.buttons === Buttons['L+R']) && camera.type != 'OrthographicCamera' ? 'rotate' : 'pan';
+                }//加'L+R'是因鼠标有时候出问题
                 //console.log('mode  ', mode )
                 let moveSpeed = this.currentViewport.getMoveSpeed();
                 if (e.drag.startHandled === undefined) {///???????
@@ -85091,9 +85091,9 @@ void main() {
                 this.yawDelta = 0;
                 this.pitchDelta = 0; 
     		}
-            if(this.translationWorldDelta.length()>0) {
+            /* if(this.translationWorldDelta.length()>0) {
                // console.log('translationDelta')
-            }
+            } */
 
     		{ // apply translation
     			view.translate(
@@ -86151,7 +86151,10 @@ void main() {
         
         
         onMouseMove (e) { 
-            return this.dealPointerMove( e )
+            /* if(e.buttons != 1&&e.buttons != 0){
+                console.log(e.buttons)
+            } */
+            return this.dealPointerMove(  e )
         }
 
         dealPointerMove(e, isTouch){ 
@@ -88511,8 +88514,11 @@ void main() {
             return this.getPanoSize(e)
         }
 
-        detectMaxZoomPanoSize() { 
-            if(this.zoomLevelResolution){
+        detectMaxZoomPanoSize() { //获取当前zoomRenderTarget应下载的最高级别
+        
+            //若是有三个级别,每次只需要加载到当前的zoomLevel;而两级时因为有zoomed来判断是使用基本贴图还是zoomRenderTarget,所以只需要返回最大的即可
+                
+            if(this.zoomLevelResolution){//有三个级别
                 if(this.zoomLevelResolution == '4k' && this.useUltraHighResolutionPanos){
                     return this.getPanoSize(PanoSizeClass.ULTRAHIGH);
                 }else if(this.zoomLevelResolution == '1k' || !this.useHighResolutionPanos){
@@ -90323,7 +90329,7 @@ void main() {
                 r && this.deactiveDescripor(r.renderTarget); 
                 r = this.activeDescripor(l);  
                 if (!r) { 
-                    var ren = this.initTiledPano(l, true); 
+                    var ren = this.initTiledPano(l, !browser.isMobile()); 
                     r = this.initDescriptor(ren.width);
                     r.renderTarget = ren;
                 }
@@ -90448,7 +90454,7 @@ void main() {
             texture.minFilter = LinearFilter);   
             
             //平时还是直接用LinearMipMapLinearFilter,其实并非不清晰,只是没有加锐化,像加了层柔光和抗锯齿,观感更好。放大后使用LinearFilter
-            
+            // 如果抗锯齿的话,采用mipmap,会增加一倍的存储消耗。原版本都是不抗锯齿的。但是抗锯齿效果更柔和
             
             
             renderTarget.texture = texture; //居然漏了一句,2022.10.9补
@@ -90931,7 +90937,7 @@ void main() {
                 if(targets[size]){
                     this.zoomRenderTarget = targets[size];
                 }else {
-                    this.zoomRenderTarget = this.initTiledPano(size, false  );
+                    this.zoomRenderTarget = this.initTiledPano(size, false  ); //放大后不使用抗锯齿,否则消
                     targets[size] = this.zoomRenderTarget;
                 }
                 
@@ -91959,7 +91965,8 @@ void main() {
                             
                                 
                             if(config2.showSkybox || config2.pointUsePanoTex){ 
-                                let wait = ()=> {
+                                let wait = (e)=> {
+                                    if(e.pano && e.pano != this.currentPano)return//loadedDepthImg
                                     setTimeout( ()=>{
                                         if(latestRequestMode == mode ){
                                             Potree.settings.displayMode = mode; 
@@ -92309,7 +92316,7 @@ void main() {
                 this.dispatchEvent({type:'flyToPano', toPano});
                 return done(true);
             }
-            if(this.latestToPano && this.latestToPano != toPano){
+            if(this.latestToPano && this.latestToPano != toPano){//还在飞
                 return done(false)
             }
             
@@ -92335,7 +92342,8 @@ void main() {
             
             {//不飞的话是否不要执行这段?
                 
-                let wait = ()=> {
+                let wait = (e)=> {
+                    if(e.pano && this.latestToPano && e.pano != this.latestToPano.pano)return//loadedDepthImg
                     if(this.latestToPano != toPano)return Potree.Log('已经取消')//如果取消了
                     setTimeout(()=>{ 
                         if(this.latestToPano != toPano)return
@@ -93376,7 +93384,7 @@ void main() {
                     });
                     
                     //剔除那些突然间离相机很近的dir。有可能是拍摄的人、或者杆子、树
-                    const maxRatio = 8;  
+                    
                     /* dirs2.forEach((e,i)=>{
                         console.log(i,  e.dis)
                         let smallThanBefore = ()=>{
@@ -93398,6 +93406,7 @@ void main() {
                         }                        
                         
                     }) */
+                    const maxRatio1 = 3  , maxRatio2 = 8;  //超过maxRatio1就要加入判断,而最终结果的设限其实是maxRatio2 
                     const minWidth = 0.5; 
                     let computeWidth = (start,end)=>{
                         start+=1; //不包含start和end
@@ -93415,21 +93424,28 @@ void main() {
                         start+=1; //不包含start和end
                         for(let m=start;m<end;m++){ 
                             dirs2[m].disB = dirs2[end].dis * 0.8;
-                            console.log('changeDis', m, dirs2[m].disB); 
+                            //console.log('changeDis', m, dirs2[m].disB) 
                         }
                     };
                     let start = -1; 
                     for(let i=0;i<count1;i++){//遍历时将左边dis比之小很多且宽度较小的改大 
                         //console.log(i, dirs2[i].dis) 
                         let j = i-1;
-                        while(j>start && dirs2[i].dis / dirs2[j].dis > maxRatio){
-                            j--;    
-                        } 
-                        let count = i-j;
-                        if(count > 1 && (count == 2 || computeWidth(j,i)<minWidth)){//若只有一个不用判断宽度直接修改,count == 2 即只有一个
+                        let ratios = 0;
+                        while(j>start && dirs2[i].dis / dirs2[j].dis > maxRatio1){
+                            ratios += dirs2[i].dis / dirs2[j].dis; 
+                            j--;  
+                        }  
+                        let count = i-j-1;
+                        ratios /= count;
+                        if(count > 0 && computeWidth(j,i)< minWidth * ratios / maxRatio2  ){
                             changeDis(j,i);  
                             start = i;  //在此之前的修改过,之后不用再判断
                         }
+                        /* if(count > 0  && (count == 1 || computeWidth(j,i)<minWidth)){//若只有一个不用判断宽度直接修改
+                            changeDis(j,i)  
+                            start = i  //在此之前的修改过,之后不用再判断
+                        } */
                     } 
                      
                      
@@ -94274,50 +94290,34 @@ void main() {
     	}
         
         
-        /* zoomDefault{
-            this.zoomTo(1, !0)
-        } 
-        smoothZoomToDefault(e, t) {
-            var i, n = this.zoomLevel,
-                r = function(e) {
-                    e > 1 && (e = 1),
-                        i = n * (1 - e) + e,
-                        this.zoomTo(i, !0)
-                }
-                .bind(this),
-                o = function() {
-                    this.zoomDefault(),
-                        t && window.setTimeout(t, 50)
-                }
-                .bind(this);
-            transitions.start(r, e, o, null, 0, easing[settings.transition.blendEasing])
-        } */
-
+      
         
 
         updateZoomPano() { 
             if (!this.panoRenderer.zoomPanoRenderingDisabled && Potree.settings.displayMode == 'showPanos') {
                 var currentPano = this.currentPano;
                 if (currentPano) {
-                    var activationThreshold =  Potree.settings.navTileClass == '2k' && Potree.settings.tileClass == '4k' ? 1.7 : Potree.settings.zoom.activationThreshold;//1.1
-                    var t = this.zoomLevel > activationThreshold,
+                    
+                    let levelThreshold1 = Potree.settings.navTileClass == '1k' ? 1.3 : 1.7 , levelThreshold2 = 2;
+                     
+                    var t = this.zoomLevel > levelThreshold1,
                         n = !(this.flying && this.nextPano && this.nextPano !== this.currentPano),
                         r = t && n;
                     this.tileDownloader.tilePrioritizer.setZoomingActive(r);
                     this.panoRenderer.setZoomingActive(r, currentPano, !0);
                     
-                    var o = (pano, zoomedFlag)=>{
+                    var o = (pano, ifZoom)=>{
                         this.panoRenderer.resetRenderStatus(pano.id, !1, !0, this.qualityManager.getMaxNavPanoSize());
                         this.panoRenderer.clearAllQueuedUploadsForPano(pano.id);
                         this.panoRenderer.renderPanoTiles(pano.id, null, !1, !1);
-                        pano.setZoomed(zoomedFlag);
+                        pano.setZoomed(ifZoom);
                     };
                       
                     
-                    if (r && (!currentPano.zoomed || this.qualityManager.zoomLevelResolution && this.qualityManager.zoomLevelResolution != '4k')) {
+                    if (r && (!currentPano.zoomed || this.qualityManager.zoomLevelResolution && this.qualityManager.zoomLevelResolution != '4k')) {//needZoom
                         currentPano.zoomed || o(currentPano, !0); 
                         
-                        if(Potree.settings.navTileClass == '1k' && Potree.settings.tileClass != '1k' && this.zoomLevel < 2){
+                        if(Potree.settings.navTileClass == '1k' && Potree.settings.tileClass != '1k' && this.zoomLevel < levelThreshold2){
                             this.panoRenderer.enableHighQuality( function() {//开启2k 
                                 if(Potree.settings.tileClass != '4k')  o(currentPano, !0); 
                             }.bind(this));
@@ -94333,23 +94333,23 @@ void main() {
                     
                     
                     
-                    if(r && Potree.settings.navTileClass == '1k' && Potree.settings.tileClass == '4k'  ){ //目前只有手机端navTileClass == '1k'
+                    if(r && Potree.settings.navTileClass == '1k' && Potree.settings.tileClass == '4k'  ){ //目前只有手机端navTileClass == '1k' (分三个梯度)
                         var change = (zoomedFlag)=>{ 
                             this.qualityManager.updateMaximums();//更新maxZoomPanoSize
                             this.panoRenderer.setupZoomRenderTarget(); //更新renderTarget  
                             //currentPano.setZoomed(t);//更新uniforms贴图 
                         };
-                        this.qualityManager.zoomLevelResolution = this.zoomLevel >= 2 ? '4k' : this.zoomLevel > 1.1 ? '2k' : '1k';
+                        this.qualityManager.zoomLevelResolution = this.zoomLevel >= levelThreshold2 ? '4k' : this.zoomLevel > levelThreshold1 ? '2k' : '1k';
                         
-                        if(this.oldZoomLevel < 2 && this.zoomLevel >= 2){//1k/2k-4k
+                        if(this.oldZoomLevel < levelThreshold2 && this.zoomLevel >= levelThreshold2){//1k/2k-4k
                             change();
                             o(currentPano, t);
-                        }else if(this.oldZoomLevel <= Potree.settings.zoom.activationThreshold && this.zoomLevel > Potree.settings.zoom.activationThreshold){//1k-2k
+                        }else if(this.oldZoomLevel <= levelThreshold1 && this.zoomLevel > levelThreshold1){//1k-2k
                             change();
-                        }else if(this.oldZoomLevel > 2 && this.zoomLevel <= 2){//4k-2k/1k
+                        }else if(this.oldZoomLevel > levelThreshold2 && this.zoomLevel <= levelThreshold2){//4k-2k/1k
                             change();
                             o(currentPano, t);
-                        }else if(this.oldZoomLevel > Potree.settings.zoom.activationThreshold && this.zoomLevel <= Potree.settings.zoom.activationThreshold){//2k-1k
+                        }else if(this.oldZoomLevel > levelThreshold1 && this.zoomLevel <= levelThreshold1){//2k-1k
                             change(); 
                         } 
                         this.oldZoomLevel = this.zoomLevel;  
@@ -94387,7 +94387,7 @@ void main() {
                             
                             if(Potree.settings.isTest){
                                 var colorHue = Math.random();
-                                tile.material.color = (new Color()).setHSL(colorHue, 0.5, 0.9);  
+                                tile.material.color = (new Color()).setHSL(colorHue, 0.6, 0.7);  
                             }
                             
                             tile.visible = false; 
@@ -94428,7 +94428,11 @@ void main() {
                 cube.name = 'highMapCube';
                 this.highMapCube = cube;
                 viewer.scene.scene.add(cube);
-                //cube.scale.set(0.01,0.01,0.01)
+                
+                {
+                    let s = 0.1;
+                    cube.scale.set(s,s,s);
+                }//注:由于原本的mesh上加了深度贴图,可能距离镜头比这里的近。凡是在cube以内的部分都会挡住cube导致模糊。但是应该不常见吧。
                 
                 this.highMapCube.visible = false; 
                 viewer.setObjectLayers(this.highMapCube, 'sceneObjects'/* 'skybox' */); //如果是skybox层,点云可见时会被遮住,depthTest为false呢? 但不会遮住场景物体
@@ -94505,6 +94509,7 @@ void main() {
             if(!this.highMapCube)   return 
             //console.warn('showHighMap')
             this.highMapCube.visible = true; 
+             
         } 
         hideHighMap(){ 
             if(!this.highMapCube)   return
@@ -94527,10 +94532,7 @@ void main() {
                 //} 
                 let pano = new Panorama( info, this   );
                 
-                /* pano.mesh.layers.set(Potree.config.renderLayers.marker)
-                pano.marker.layers.set(Potree.config.renderLayers.marker)  */
-                
-                
+              
                 pano.addEventListener('dispose',(e)=>{
                     if(this.closestPano == pano) this.closestPano = null;
                 });
@@ -94556,29 +94558,12 @@ void main() {
             
             this.tileDownloader.setPanoData(this.panos, [] /* , Potree.settings.number */);
 
-            {
-                /* var panosBound = new THREE.Box3
-                this.panos.forEach(pano=>{
-                    panosBound.expandByPoint(pano.position)
-                }) 
-                let center = panosBound.getCenter(new THREE.Vector3)
-                let minBound = (new THREE.Box3()).setFromCenterAndSize(center, new THREE.Vector3(1,1,1))
-                panosBound.union(minBound)
-               
-                this.bound = {
-                    bounding:panosBound,
-                    size: panosBound.getSize(new THREE.Vector3),
-                    center,
-                } */
-                
+            { 
                 let minSize = new Vector3(1,1,1);
                 this.bound = math.getBoundByPoints(this.panos.map(e=>e.position), minSize);
-                
-                
+                 
                 viewer.scene.pointclouds.forEach(pointcloud=>pointcloud.getPanosBound()); 
-                
                  
-                
             }
             
             
@@ -94656,7 +94641,7 @@ void main() {
                 throw msg;
             }
         }
-    }();
+    }();//加载全景图的流程:请求下载当前点的最低分辨率图(不过有可能已经下载了),并且请求uploadTile渲染当前漫游点,若tile都upload完(先6个)会发送消息,LoadComplete 从而回调成功。
 
 
 

Різницю між файлами не показано, бо вона завелика
+ 1 - 1
public/static/lib/potree/potree.js.map


+ 5 - 25
src/pages/SViewer.vue

@@ -59,25 +59,10 @@ const scenes = computed(() => {
     })
 })
 const sourceURL = computed(() => {
-     
-    /*if (source.value.type < 2) {
-        let pose = ''
-        // 获取当前点位旋转值
-        if (sourceFrame.value && sourceFrame.value.contentWindow.app && sourceFrame.value.contentWindow.app.Camera) {
-            let sdk = sourceFrame.value.contentWindow.app
-            lastFakeApp = sync.views.createFakeApp(sourceFrame.value.contentWindow, true);
-              
-            //pose = '&'+sdk.Camera.getPoseUrlParams()
-        }
-        // 看看、看见场景
-        return `smart-kankan.html?m=${source.value.num}`//`smart-kankan.html?m=${source.value.num}${pose}`
-    } else {
-        // 深时场景
-        return `smart-kankan.html?m=${source.value.num}`//`smart-laser.html?m=${source.value.num}&dev`
-    }*/ 
-    
-    if(lastFakeApp/*sourceFrame.value && (bimChecked.value || sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.loaded)*/){
-        sync.views.fakeAppUpdateInfo(sourceFrame.value.contentWindow)  //这两个怎么都会报错? bim的得不到app.viewer
+      
+    if(lastFakeApp && sourceFrame.value.contentWindow.fakeApp/* && sourceFrame.value && ( sourceFrame.value.contentWindow.app || sourceFrame.value.contentWindow.viewer)*/){//fakeApp代表已经初始化完毕
+         
+        sync.views.fakeAppUpdateInfo(sourceFrame.value.contentWindow)  
     }
     if(bimChecked.value){
         return `smart-bim.html?m=${project.value.bimData.bimOssFilePath}`
@@ -98,7 +83,7 @@ const onLoadSource = () => {
         
     let loaded = ()=>{
         if (lastFakeApp) {
-            if(bimChecked.value || lastFakeApp.sceneType == 'bim'){//->bim
+            if(bimChecked.value || lastFakeApp.sceneType == 'bim'){//->bim   也可能是bim和bim转,当快速点击按钮,其他类型的没加载好就跳回bim 
                 sync.views.bindFakeWithBim(lastFakeApp, win, panoData) 
             }else{
                 sync.views.bindWithSameFakeType(lastFakeApp,win) 
@@ -130,11 +115,6 @@ const onLoadSource = () => {
             sync.views.laserInit(win, mode.value)
             loaded();
             
-            /*setTimeout(()=>{//laser的代码中莫名会请求showPointCloud,所以尽量晚一点覆盖它
-                if(win.Potree){
-                    win.Potree.settings.displayMode = mode.value == 0 ? "showPanos" : "showPointCloud"
-                }
-            }, sync.views.settings.checkModeDelay)*/
             
          }) 
     }

+ 70 - 37
src/utils/ConvertViews.js

@@ -2,7 +2,7 @@ import math from './math.js'
 
 let bimViewer
 
- 
+
 
 export default class ConvertViews extends THREE.EventDispatcher{
     constructor( ) {
@@ -12,6 +12,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
             checkModeDelay : 1000,  
         }
         this.convertInfo //包含转换信息
+        
     }
 
      
@@ -178,7 +179,21 @@ export default class ConvertViews extends THREE.EventDispatcher{
     
     
     
-    bindFakeWithBim(sourceFakeApp, targetApp, panoData ){// bim和其他类型互转(mobile)
+    bindFakeWithBim(sourceFakeApp, targetApp, panoData ){// bim和其他类型互转(mobile), bim不一定是target
+        if(targetApp.sceneType == 'bim'){
+            bimViewer = targetApp.viewer
+            bimViewer.getViewer().setTransitionAnimationState(false)
+            targetApp.CLOUD.GlobalData.WalkRotationSpeed = -0.2 //反向一下
+        }
+        if(sourceFakeApp.sceneType == 'bim' && targetApp.sceneType == 'bim' ){
+            console.log('还是bim')
+            this.syncPosRot(sourceFakeApp.viewInfo, targetApp  ) 
+            return;
+        }
+        
+        
+        
+        
         if(!panoData)return
     
     
@@ -220,11 +235,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
             
         } 
         
-        if(targetApp.sceneType == 'bim'){
-            bimViewer = targetApp.viewer
-            bimViewer.getViewer().setTransitionAnimationState(false)
-            targetApp.CLOUD.GlobalData.WalkRotationSpeed = -0.2 //反向一下
-        }
+        
         
         
         if(targetApp.sceneType == 'bim'  ){
@@ -233,7 +244,9 @@ export default class ConvertViews extends THREE.EventDispatcher{
             
         }else if(targetApp.sceneType == 'laser' ){
             selectBestPose() //刚好在点位上的话这句设置完就正确了
-            setTimeout(()=>{ //刚开始总是showPointCloud  (且稍后会自动飞到某点)所以需要延时 
+            let currFakeApp = targetApp.fakeApp
+            setTimeout(()=>{ //刚开始总是showPointCloud  (且稍后会自动飞到某点)所以需要延时
+                if(targetApp.fakeApp != currFakeApp)return //已经加载别的场景
                 this.laserCancelFly(targetApp)
                 if(this.ifCanChangePos(targetApp)){//点云模式的话
                     this.syncPosRot(sourceFakeApp.viewInfo, targetApp, convertInfo) 
@@ -451,9 +464,15 @@ export default class ConvertViews extends THREE.EventDispatcher{
         })
         let panoPos2 = targetFakeApp.panos.map(e=>{
             return e.position
-        })    
-             
+        }) 
+        
         length = panoPos1.length
+        
+        if(panoPos1.length!=panoPos2.length){
+            console.error('两个场景漫游点数量不同!',panoPos1,panoPos2)
+             
+        }
+        
 
         //挑选连续的两个点为向量来计算,如有123个漫游点,则选取12 23 31作为向量
 
@@ -544,7 +563,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
         if(!this.loaded){
             return this.firstData = data
         } */
-        convertInfo = convertInfo || this.convertInfo
+        convertInfo = convertInfo || this.convertInfo || {}
         let {position,target} = this.getTranPosData(data, convertInfo, customer && customer.fakeApp == convertInfo.sourceFakeApp  ) 
  
 
@@ -613,7 +632,7 @@ export default class ConvertViews extends THREE.EventDispatcher{
     }
     
     
-    getTranPosData(data, convertInfo, ifRevert ){//根据convertInfo获得转换的数据
+    getTranPosData(data, convertInfo={}, ifRevert ){//根据convertInfo获得转换的数据
         let position = new THREE.Vector3, target = new THREE.Vector3
         
         if(data.position){
@@ -628,21 +647,24 @@ export default class ConvertViews extends THREE.EventDispatcher{
             target.copy(data.target) 
         } 
         
-        if(ifRevert){
-            position.applyMatrix4(convertInfo.convertMatrixInvert)
-            target.applyMatrix4(convertInfo.convertMatrixInvert)
-            if(convertInfo.convertAxis){
-                position = math.convertVector[convertInfo.convertAxis](position)
-                target = math.convertVector[convertInfo.convertAxis](target)
-            }
-        }else{
-            if(convertInfo.convertAxis){
-                position = math.convertVector[convertInfo.convertAxis](position)
-                target = math.convertVector[convertInfo.convertAxis](target)
-            }
+        
+        if(convertInfo.convertMatrix){
+            if(ifRevert){
+                position.applyMatrix4(convertInfo.convertMatrixInvert)
+                target.applyMatrix4(convertInfo.convertMatrixInvert)
+                if(convertInfo.convertAxis){
+                    position = math.convertVector[convertInfo.convertAxis](position)
+                    target = math.convertVector[convertInfo.convertAxis](target)
+                }
+            }else{
+                if(convertInfo.convertAxis){
+                    position = math.convertVector[convertInfo.convertAxis](position)
+                    target = math.convertVector[convertInfo.convertAxis](target)
+                }
 
-            position.applyMatrix4(convertInfo.convertMatrix)
-            target.applyMatrix4(convertInfo.convertMatrix)
+                position.applyMatrix4(convertInfo.convertMatrix)
+                target.applyMatrix4(convertInfo.convertMatrix)
+            }
         }
         return {position, target}
     }
@@ -675,22 +697,27 @@ export default class ConvertViews extends THREE.EventDispatcher{
     }
     
     
-    createFakeApp(app, addsubInfo){  //为每个app创建fakeApp, 里面包含了基本信息。
-        if(!app.fakeApp){//不能重复建立,因为可能绑定在了convertInfo里
+    createFakeApp(app, addsubInfo){  //为每个app创建fakeApp, 里面包含了场景基本信息。
+        if(!app.fakeApp){//不能重复建立,作为唯一标识 
             let fakeApp = {
                 isFake : true, //标志是虚拟的app。每个真实的app都要带一个这个。在移动端如果大的销毁了还有小的
-                sceneType : app.sceneType 
+                sceneType : app.sceneType,
+                id : getId(),
+                
             }
             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
+            } 
+            
+            Object.defineProperty(app,'fakeApp',{
+                value: fakeApp, 
+                Configurable : false, //不可替换和删除
+            })
+            
         }
-        
         if(addsubInfo){
             this.fakeAppUpdateInfo(app) 
         } 
@@ -885,9 +912,9 @@ export default class ConvertViews extends THREE.EventDispatcher{
         this.lockCamera(true)
         
         
-        /* this.targetApp.addEventListener(this.targetApp.Glodon.Bimface.Viewer.Viewer3DEvent.MouseClicked,(e)=>{
-            console.log('MouseClicked',e)
-        }); */
+        /* this.targetApp.viewer.addEventListener(this.targetApp.Glodon.Bimface.Viewer.Viewer3DEvent.MouseClicked,(e)=>{
+            console.log('MouseClicked',e)//
+        });  */ 
         let dom1 = this.bimViewer.getDomElement() 
         
         let getEvent = (type, e)=>{
@@ -973,13 +1000,19 @@ export default class ConvertViews extends THREE.EventDispatcher{
  
 }
 
+let num = 0
+function getId(){
+    return num++
+}
 
-
+ 
 /* 
 
 note:
 
 
+访问:window[0].fakeApp, window[1].fakeApp
+
 旋转只能通过target设置, 不能直接改camera.quaternion
 当且仅当发送方相机属性变化后才传递过来,就不在这里判断是否变化了。
 (所以只需要实时检测相机是否改变, hasChanged后发送)

+ 4 - 4
src/utils/sync.js

@@ -72,13 +72,13 @@ export function loadSourceScene(sourceFrame,type,mode) {
     } */
     
     Log('loadSourceScene, ' + type)
-    sourceApp = window.app1 = null 
+    sourceApp = null 
     let win = sourceFrame.value.contentWindow  
     win.sceneType = type
     
     
     let loaded = ()=>{ 
-        sourceApp = window.app1 = win
+        sourceApp = win
         initConvertView(isSwitchScene && 'source')  
     }
     
@@ -111,14 +111,14 @@ export function loadTargetScene(targetFrame, type, mode) {
         
         views.clear( )
     }
-    targetApp = window.app2 = null 
+    targetApp = null 
     
     
     let win = targetFrame.value.contentWindow   //其实只用赋值一次
     win.sceneType = type
     
     let loaded = ()=>{
-        targetApp = window.app2 = win
+        targetApp = win
          
        
         initConvertView( 'target')