xzw 1 year ago
parent
commit
d3b013b991

+ 1 - 0
libs/three.js/lines/LineMaterial.js

@@ -860,6 +860,7 @@ class LineMaterial extends ShaderMaterial {
         this.events = {
             setSize:(e)=>{//如果出现横条状的异常,往往是viewportOffset出错  //地图不需要
                 let viewport = e.viewport 
+                //console.log(viewport.name, viewport.resolution2)
                 this.uniforms.resolution.value.copy(viewport.resolution2)  
                 this.uniforms.devicePixelRatio.value = window.devicePixelRatio 
                 this.lineWidth = this.lineWidth_ //update

+ 7 - 4
src/custom/materials/DepthBasicMaterial.js

@@ -63,12 +63,12 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
             render:(e)=>{//before render  如果有大于两个viewport的话,不同viewport用不同的depthTex
                 this.updateDepthParams(e)
             },
-            cameraChange:(e)=>{
+            /* cameraChange:(e)=>{
                 if(e.changeInfo.projectionChanged){//resize时也会触发。虽然保守起见的话加上resize比较好//所以当时为何不用resize
                     //console.log('projectionChanged')
                     this.events.setSize(e)  
                 }
-            }
+            } */
             
         }
         
@@ -104,12 +104,15 @@ export default class DepthBasicMaterial extends THREE.ShaderMaterial{
              
             if(value){
                 viewer.addEventListener("render.begin",  this.events.render) 
-                viewer.addEventListener('camera_changed', this.events.cameraChange)  
+                //viewer.addEventListener('camera_changed', this.events.cameraChange) 
+                viewer.addEventListener('resize', this.events.setSize) 
+
+                
                 this.events.setSize( {viewport:viewer.mainViewport} )  
                 this.updateDepthParams() 
             }else{
                 viewer.removeEventListener("render.begin",  this.events.render)  
-                viewer.removeEventListener('camera_changed', this.events.cameraChange)
+                viewer.removeEventListener('resize', this.events.setSize)
             }
         }
         

+ 21 - 11
src/custom/modules/route/RouteGuider.js

@@ -110,8 +110,11 @@ export class RouteGuider extends THREE.EventDispatcher{
         
         
         viewer.scene.scene.add(this.sceneMeshGroup);
-        this.sceneMeshGroup.visible = /* this.poleStart.visibile = this.poleEnd.visibile = */ false
-       
+        this.sceneMeshGroup.visible = false
+        this.poleStart.visible = false
+        this.poleEnd.visible = false
+        
+        
         //-------------map---------------------
         
         /* this.mapMarkStart = new THREE.Mesh( planeGeo, new THREE.MeshBasicMaterial({
@@ -197,12 +200,12 @@ export class RouteGuider extends THREE.EventDispatcher{
             var sphere = new Sprite({mat: polesMats.sphereMat, renderOrder:3}) 
             sphere.position.set(0,0,sliceDis*(i+1))
             sphere.scale.set(sphereSize,sphereSize,sphereSize);
-            sphere.visible = false
+            //sphere.visible = false
             group.add(sphere)
         }
         
         var hatSphere = new Sprite({mat: polesMats.hatMats[name], sizeInfo:sphereSizeInfo, renderOrder:4}) 
-        sphere.visible = false
+        //sphere.visible = false
         hatSphere.position.set(0,0,height)
         hatSphere.scale.copy(shadow.scale)
         group.add(hatSphere)
@@ -254,9 +257,10 @@ export class RouteGuider extends THREE.EventDispatcher{
         this.datasetIds[0] = datasetId
         
         //this.setStartPole(pos)
-        
+        this.poleStart.visible = !!pos 
+        pos && this.poleStart.position.copy(this.routeStart)
         this.generateRoute()
-        
+        viewer.dispatchEvent('content_changed')
         
     }
     
@@ -275,9 +279,12 @@ export class RouteGuider extends THREE.EventDispatcher{
         }
         console.log('setRouteEnd',this.routeEnd&&this.routeEnd.toArray())        
         this.datasetIds[1] = datasetId
-        //this.setEndPole(pos)
-        this.generateRoute()
+        //this.setEndPole(pos) 
+        this.poleEnd.visible = !!pos 
+        pos && this.poleEnd.position.copy(this.routeEnd)
         
+        this.generateRoute()
+        viewer.dispatchEvent('content_changed')
     }
     
     
@@ -313,6 +320,9 @@ export class RouteGuider extends THREE.EventDispatcher{
     }
     
     generateRoute(){
+        
+        this.sceneMeshGroup.visible = true
+        
         if(!this.routeStart || !this.routeEnd){ 
             
             return
@@ -588,7 +598,7 @@ export class RouteGuider extends THREE.EventDispatcher{
             this.scenePoints.forEach(e=>this.addArrow(e))
             this.arrows.children.forEach((e,i)=>this.setArrowDir(this.arrows.children,i));
         }
-        this.sceneMeshGroup.traverse(e=>e.visible = true)  
+        this.sceneMeshGroup.visible = true//.traverse(e=>e.visible = true)  
         this.mapMeshGroup.visible = true
         this.mapPoints.forEach(e=>this.addMapArrow(e))
         this.mapArrows.children.forEach((e,i)=>this.setArrowDir(this.mapArrows.children,i));
@@ -612,8 +622,8 @@ export class RouteGuider extends THREE.EventDispatcher{
         mapArrows.forEach(e=>{
             this.mapArrows.remove(e)
         })
-        
-        this.sceneMeshGroup.traverse(e=>e.visible = false)  //包括sprite也要设置,防止update
+        this.sceneMeshGroup.visible = false
+        //this.sceneMeshGroup.traverse(e=>e.visible = false)  //包括sprite也要设置,防止update
         this.mapMeshGroup.visible = false
         viewer.mapViewer.dispatchEvent({'type':'content_changed'})
         viewer.dispatchEvent('content_changed') 

+ 34 - 48
src/custom/modules/siteModel/BuildingBox.js

@@ -50,32 +50,16 @@ let getFaceMat = (name)=>{
                 transparent:true,
                 depthTest:true, 
             }),
-             
-            /* floorSelect: new THREE.MeshStandardMaterial({
-                color:16707151,  metalness: 0, roughness:1,
-                side:THREE.DoubleSide,
-                opacity:1,
-                transparent:true,
-                depthTest:true,
-                polygonOffset : true,//是否开启多边形偏移 
-				polygonOffsetFactor : -0.75,//多边形偏移因子
-				polygonOffsetUnits : -4.0,//多边形偏移单位 
-                map: gridTex,
-            }),  */ 
+        
             floorSelect: new DepthBasicMaterial({
                 map: gridTex,
                 color:16707151,  
                 side:THREE.DoubleSide,//BackSide, 
                 opacity:1,
                 transparent:true, 
-                useDepth : true,
-                /* polygonOffset : true,//是否开启多边形偏移 
-				polygonOffsetFactor : -0.75,//多边形偏移因子
-				polygonOffsetUnits : -4.0,//多边形偏移单位  */
-                
+                useDepth : true, 
                 clipDistance : 1, occlusionDistance:1, /* occlusionDistance:变为backColor距离, clipDistance:opacity到达0或者1-maxClipFactor时的距离 */  
-                maxClipFactor:0.4, backColor:'#efe' //backColor:"#669988"  ,
-                  
+                maxClipFactor:0.9, backColor:'#efe' //backColor:"#669988"  ,
             }),
             
             room: new THREE.MeshStandardMaterial({
@@ -85,30 +69,16 @@ let getFaceMat = (name)=>{
                 transparent:true, 
                 depthTest:false, 
             }), 
-            /* roomSelect: new THREE.MeshStandardMaterial({
-                color:"#ff44ee",  metalness: 0.3, roughness:1,
-                side:THREE.DoubleSide,//BackSide,
-                opacity:1,
-                transparent:true,
-                depthTest:true,
-                polygonOffset : true,//是否开启多边形偏移.(开启是因为和floor重叠了会闪烁)
-				polygonOffsetFactor : -0.75,//多边形偏移因子
-				polygonOffsetUnits : -4.0,//多边形偏移单位  
-                map: gridTex,
-            }), */
+         
             roomSelect: new DepthBasicMaterial({  
                 map: gridTex,
                 color:"#ff44ee", 
                 side:THREE.DoubleSide,//BackSide, 
                 opacity:1,
                 transparent:true, 
-                useDepth : true,
-                /* polygonOffset : true,//是否开启多边形偏移 
-				polygonOffsetFactor : -0.75,//多边形偏移因子
-				polygonOffsetUnits : -4.0,//多边形偏移单位  */
-                
+                useDepth : true, 
                 clipDistance : 1, occlusionDistance:0.5, /* occlusionDistance:变为backColor距离, clipDistance:opacity到达0或者1-maxClipFactor时的距离 */  
-                maxClipFactor:0.6, backColor:'#ff88dd'//"#cc99c2"  ,
+                maxClipFactor:0.8, backColor:'#ff88dd'//"#cc99c2"  ,
                  
             })
         }
@@ -200,17 +170,28 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
     } 
     
     intersectPointcloudVolume(pointcloud){//和pointcloud的重叠体积
-        var bound = this.getBound()
+        return this.intersectPointcloudArea(pointcloud) * this.coverPointcloudHeight(pointcloud)
+    }
+     
+    
+    coverPointcloudHeight(pointcloud, getPercent){
         let bound2 = pointcloud.bound;
-        if(!bound.intersectsBox(bound2)) return 0;
-        
-        
         let {zMin , zMax} =  this.getRealZ()
         let min = Math.min(zMin, bound2.min.z);
         let max = Math.max(zMax, bound2.max.z); 
         let height1 = zMax - zMin
         let height2 = bound2.max.z-bound2.min.z
-        let coverHeight = height1 + height2 - (max-min)//重叠高度 <=0是没重叠
+        let coverHeight = height1 + height2 - (max-min)//重叠高度 <=0是没重叠 
+        if(getPercent){
+            return coverHeight / height1
+        }
+        return coverHeight
+    }
+    
+    intersectPointcloudArea(pointcloud, getPercent){//和pointcloud的重叠面积
+        var bound = this.getBound()
+        let bound2 = pointcloud.bound;
+        if(!bound.intersectsBox(bound2)) return 0;
          
         let boxPoints = pointcloud.getUnrotBoundPoint() //获取tightBound的四个点。 如果是有旋转角度的点云,这个和pointcloud.bound的四个点是不一致的,覆盖面积小于pointcloud.bound
        
@@ -262,14 +243,18 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
             }
              
         }
-        
-        
+         
         let coverArea = area1 + area2 - areaWhole - coverHoleArea; //重叠面积
          
-        return coverArea * coverHeight
+        if(getPercent){
+            return { 
+                toEntity:coverArea / this.getArea(true), //占entity
+                toPointcloud:coverArea / area2  //占点云
+            }
+        }
+        return coverArea  
     }
     
-    
     addHole(points=[]){  
         let prop = {
             buildType : 'hole',
@@ -639,10 +624,10 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
     getRealZ(){//求真实高度时用到的
         let zMin , zMax
         if (this.buildType == 'building') {
-            //building的zMax和zMin一样的所以要算
+            //因为building只有一个地基平面 所以自身的zMin == 自身的zMax 所以要算 
             let top = this.buildChildren[this.buildChildren.length - 1]
             let btm = this.buildChildren[0] 
-            zMin = btm ? btm.zMin : 0  //建好的建筑不加楼的话是0
+            zMin = btm ? btm.zMin : 0  //建好的建筑不加楼的话是0
             zMax = top ? top.zMax : 0
         }else if(this.buildType == 'hole'){
             return this.buildParent.getRealZ()
@@ -651,7 +636,8 @@ export class BuildingBox extends ctrlPolygon{//建筑实体,包括building, fl
         }
         return {zMin,zMax}
     }
-    
+    //架站式多楼层SG-t-ihjV2cDVFlE 有初始的z, 但是总高度范围小于数据集。 不允许修改高度。
+
     
     /* getDrawZ(){ //画线和box时用到的z
         let zMin , zMax

+ 2 - 1
src/custom/objects/Magnifier.js

@@ -199,7 +199,7 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
             /* if(Potree.settings.displayMode == 'showPanos') && e.value){
                 Potree.settings.pointDensity = 'magnifier'
             }else if() */
-            
+            viewer.dispatchEvent('content_changed')
         })
          
          
@@ -212,6 +212,7 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
             })
             viewer.addEventListener("endMeasureMove",()=>{
                 Potree.Utils.updateVisible(this, "measure", false) 
+                viewer.dispatchEvent('content_changed')
             })
         }
         

+ 1 - 1
src/custom/settings.js

@@ -289,7 +289,7 @@ const config = {//配置参数   不可修改
     ,
     axis : {   'x':{color:'#ea3f3f'/* '#d0021b' */  /* 'red' */}, 'y':{ color:'#86c215' /* '#86c542'  *//* 'green' */},  'z': {color:'#3396f8'/* '#3399c8' */ /* 'blue' */}, 'xyz':{color:'#ccc',}},  
     
-    shelterMargin:0.1,  //多少米内不算遮挡
+    shelterMargin:0.15,  //多少米内不算遮挡 (有的场景深度图不准,和点云差别蛮大如SG-t-24F0iT3pKAO)
     highQualityMaxZoom: 2,
     ultraHighQualityMaxZoom: 3,
     panoFieldRadius : 10, //当前位置多远范围内可以切全景模式

+ 9 - 0
src/custom/utils/math.js

@@ -312,6 +312,15 @@ var math = {
 			i += ring[n].x * ring[r].y - ring[r].x * ring[n].y;
 		return -.5 * i
 	},
+    
+    
+    getVolume:function(faceArr){//求三角多面体的体积。和求面积同理都用鞋带计算法 https://blog.csdn.net/weixin_43414513/article/details/123758897
+        //问题:怎么确定方向
+        //每个三角形的顺序必须是右手螺旋法则指向物体外(外向里看为逆时针),分别为ABC,则每个三角形和原点O构成的三棱锥体积为 (OA cross OB) dot(OC) / 6 .  结果一般朝向原点的为负,反之为正
+   
+    },
+    
+    
 	isInBetween : function(a, b, c, precision) {
         // 如果b几乎等于a或c,返回false.为了避免浮点运行时两值几乎相等,但存在相差0.00000...0001的这种情况出现使用下面方式进行避免
 

+ 90 - 20
src/custom/viewer/ViewerNew.js

@@ -463,6 +463,7 @@ export class Viewer extends ViewerBase{
                 }
                 
                 this.inputHandler = new InputHandler(this, this.scene.scene);
+                this.inputHandler.containsMouse = true//初始化,使键盘事件在mainViewer有效
                 //this.inputHandler.setScene(this.scene);
                 //this.inputHandler.addInputListener(this);//add
                 
@@ -963,7 +964,7 @@ export class Viewer extends ViewerBase{
             if(panoId != void 0){
                 let pano = this.images360.getPano(panoId)
                 if((soon || this.shelterCount.byTex<this.shelterCount.maxByTex) && pano.depthTex){
-                    ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d, margin:Potree.config.shelterMargin, useDepthTex:true, pano, viewport:this.mainViewport , viewport:this.mainViewport}  ) 
+                    ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d, margin:Potree.config.shelterMargin, useDepthTex:true, pano, viewport:this.mainViewport  }  ) 
                     history.panos[panoId] = ifShelter
                     this.shelterCount.byTex ++ ;
                     //console.log('computeByTex direct', panoId, pos3d, ifShelter)
@@ -1221,7 +1222,7 @@ export class Viewer extends ViewerBase{
             
             this.updateCadVisibles(Clip.selectedDatasets)
               
-        }else  */if(this.selectedFloorplan){//平面图设置中
+        }else  */if(this.selectedFloorplan){//平面图设置中  或 地理设置
             let pointclouds = [this.selectedFloorplan]
             this.updateCadVisibles(pointclouds)
         }else if(SiteModel.editing || Alignment.editing){//只显示勾选的,也就是显示的点云的
@@ -1231,18 +1232,22 @@ export class Viewer extends ViewerBase{
         }else{ 
             let pointclouds = currentFloor ? this.findPointcloudsAtFloor(currentFloor) : []
              
+            if(pointclouds.length == 0){
+                if(this.focusDatasets){
+                    pointclouds = this.focusDatasets  
+                }  
+            }
             if(pointclouds.length == 0){//如果当前不在任何楼层或楼层中无数据集,就用当前所在数据集
                 pointclouds = this.atDatasets
             }
              
-             
             this.updateCadVisibles(pointclouds)
             //this.updatePanosVisibles(currentFloor/* , pointclouds */)
         }
     }
     
  
-    findPointcloudsAtFloor(entity){//找当前楼层需要显示哪些数据集。
+    /* findPointcloudsAtFloor(entity){//找当前楼层需要显示哪些数据集。
         //数据集的belongToEntity 在这个entity内(否则会出现点击数据集飞过去平面图却不显示)。or 如果数据集有漫游点的话,需要包含>20%的漫游点。   (防止重叠体积很大但其实一个漫游点都不包含)
         //重叠体积>50%   或   包含>50%的漫游点 
          
@@ -1263,10 +1268,8 @@ export class Viewer extends ViewerBase{
                 let panoCountRatio = insidePanos.length / e.panos.length
                  
                 if(panoCountRatio > ratio2)return true 
-                if(panoCountRatio < ratio1){ 
-                    score += panoCountRatio//return false
-                }
                 
+                score += panoCountRatio 
             } 
              
             //条件3
@@ -1290,9 +1293,63 @@ export class Viewer extends ViewerBase{
         
         
         return pointclouds
-    }
-    
+    } */
     
+    findPointcloudsAtFloor(entity){//找当前楼层需要显示哪些数据集。
+        //数据集的belongToEntity 在这个entity内(否则会出现点击数据集飞过去平面图却不显示)。or 如果数据集有漫游点的话,需要包含>20%的漫游点。   (防止重叠体积很大但其实一个漫游点都不包含)
+        //重叠体积>50%   或   包含>50%的漫游点 
+          
+        
+        const ratio1 = 0.2, ratio2 = 0.5, ratio3 = 0.95
+         
+        var lowScores = []
+         
+        var pointclouds = viewer.scene.pointclouds.filter(e=>{
+            let score = 0
+            
+            if(e.belongToEntity && (e.belongToEntity == entity || e.belongToEntity.buildParent == entity)){//条件1   若该数据集挂载到该楼层 或 该数据集挂载到的房间属于该楼层(这样能显示该层所有房间)
+                return true
+            }
+            
+            if(e.panos.length){//条件2
+                var insidePanos = e.panos.filter(a=>entity.ifContainsPoint(a.position));
+                let panoCountRatio = insidePanos.length / e.panos.length
+                 
+                if(panoCountRatio > ratio2)return true 
+                score += panoCountRatio * 2 
+            } 
+             
+            //条件3
+             
+            let coverHeightRatio = entity.coverPointcloudHeight(e,true)//重叠高度占楼层高度的比率。
+            if(coverHeightRatio < 0.2) return 
+              
+              
+              
+            let {toEntity,toPointcloud} = entity.intersectPointcloudArea(e,true);  //重叠面积占比 
+            let coverAreaRatio = Math.max(toEntity,toPointcloud);//占数据集俯视面积的比率 和 占楼层的面积比率,挑一个大的。 (有的数据集被划分多个楼层,所以每层都应该显示该数据集的图。还有的数据集比较大,可能包含多个建筑,则看占楼层面积)
+            if(coverAreaRatio < 0.2) return    
+            score += coverAreaRatio * coverHeightRatio
+            
+            
+            lowScores.push({score, pointcloud:e})
+        })
+        
+        /* if(pointclouds.length == 0){//从低分项挑一个出来。 
+            lowScores.sort((a,b)=>{return a.score - b.score})
+            if(lowScores[0].score > 0.4){
+                pointclouds = [lowScores[0].pointcloud]
+            } 
+        } */
+        lowScores.forEach(e=>{//一个楼层里可以包含许多个数据集  调试SG-t-ds27ym7xzjJ
+            if(e.score > 0.5){
+                pointclouds.push(e.pointcloud)
+            }
+        })
+        
+        
+        return pointclouds
+    }
     
     
     
@@ -3102,7 +3159,7 @@ export class Viewer extends ViewerBase{
            
         
         
-        let needSResize = viewports.length > 1 || params_.resize  
+        ///let needsResize = viewports.length > 1 || params_.resize   //去掉原因:因为不需要渲染的viewport不在此中所以无法判断几个viewport
         
         
         
@@ -3152,10 +3209,10 @@ export class Viewer extends ViewerBase{
                 } 
             } 
             
-            if(needSResize){
+            //if(needsResize){
                 this.ifEmitResize( { viewport:view} )
-            } 
-             
+            //} 
+              
             viewer.dispatchEvent({type: "render.begin",  viewer: viewer, viewport:view, params });
              
           
@@ -3422,8 +3479,8 @@ export class Viewer extends ViewerBase{
         let SiteModel = viewer.modules.SiteModel 
         
         
-        Potree.settings.useRTPoint = !(SiteModel.editing && SiteModel.selected && SiteModel.selected.buildType == 'room' )//空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
-        
+        Potree.settings.useRTPoint = !(SiteModel.editing && SiteModel.selected && (SiteModel.selected.buildType == 'room' || SiteModel.selected.buildType == 'floor'))//空间模型的房间选中材质是需要depth的,这时候需要绘制两次点云
+         
         Potree.settings.pointEnableRT = !this.screenshoting && (this.scene.measurements.length > 0 || !Potree.settings.useRTPoint )
         
          
@@ -3506,7 +3563,8 @@ export class Viewer extends ViewerBase{
             }else{ 
                 
                 //直接渲染 会改变canvas大小
-                let canvas = this.renderArea.getElementsByTagName('canvas')[0] 
+                let canvas = this.renderArea.getElementsByTagName('canvas')[0]  
+                //canvas.width = width, canvas.height = height //不需要改canvas大小, 只需要 this.renderer.setSize(width, height ); 前面updateScreenSize已经执行
                 this.render({  screenshot : true,   width , height,   resize :true  }); //需要resize
                 var dataUrl = canvas.toDataURL('image/jpeg',compressRatio) 
             }
@@ -3566,6 +3624,7 @@ export class Viewer extends ViewerBase{
                 
                 if(info.type == 'measure'){
                     this.modules.SiteModel.pauseUpdateEntity = false
+                    this.focusDatasets = null
                     this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true))
                     info.measurement.setSelected(false, 'screenshot')
                 }
@@ -3673,7 +3732,7 @@ export class Viewer extends ViewerBase{
                 viewer.scene.pointclouds[0].material.size *= 1.5 */
             }
             if(Potree.settings.displayMode == 'showPointCloud'){
-                viewer.updateScreenSize({forceUpdateSize:true, width, height})//需要先setSize才能加载范围内的点云
+                viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget})//需要先setSize才能加载范围内的点云
             }
             
             
@@ -3713,7 +3772,7 @@ export class Viewer extends ViewerBase{
                 oldStates.oldSplitDir = this.mapViewer.splitDir
                 this.mapViewer.attachToMainViewer(true, 'measure', 0.5 ,  {dir:'leftRight'} ) 
             }  
-            viewer.updateScreenSize({forceUpdateSize:true, width, height}) //更新viewports相机透视 使focusOnObject在此窗口大小下
+            viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视 使focusOnObject在此窗口大小下
              
             let begin = ()=>{
                 useMap = this.mapViewer.attachedToViewer 
@@ -3740,15 +3799,26 @@ export class Viewer extends ViewerBase{
                  
                 this.updateDatasetAt(true)  
                 this.modules.SiteModel.updateEntityAt(true, {measure:info.measurement}) //更新测量线所在楼层,展示俯视图
+                if(!this.modules.SiteModel.inEntity){
+                    this.focusDatasets = []
+                    info.measurement.points_datasets.forEach(e=>{
+                        let p = viewer.scene.pointclouds.find(a=>a.dataset_id == e)
+                        if(p && !this.focusDatasets.includes(p)){
+                            this.focusDatasets.push(p)
+                        } 
+                    })
+                    this.updateFpVisiDatasets()
+                }
+                
                 this.modules.SiteModel.pauseUpdateEntity = true
-                //this.updateFpVisiDatasets() 
+                
                 
                 //console.log('currentFloor', this.modules.SiteModel.currentFloor, 'currentDataset', this.atDatasets )    
            
                 let floorplanShowed = this.mapViewer.mapLayer.maps.some(e => e.name.includes('floorplan') && e.objectGroup.visible)//如果没有floorplan展示就不分屏(如果focus时飞出数据集从而不展示怎么办。尤其是俯瞰比较长的线时容易这样,或许要根据其所在数据集强制显示)
                 if(!floorplanShowed && this.mapViewer.attachedToViewer){ 
                     this.mapViewer.attachToMainViewer(false) //取消分屏
-                    viewer.updateScreenSize({forceUpdateSize:true, width, height}) //更新viewports相机透视
+                    viewer.updateScreenSize({forceUpdateSize:true, width, height, forTarget:info.useRenderTarget}) //更新viewports相机透视
                     let {promise} = this.focusOnObject(info.measurement, 'measure', 0,     {basePanoSize:1024,gotoBestView:true,}  )//因画面比例更改,重新focus
                     promise.done(()=>{ 
                         begin()  

+ 7 - 5
src/custom/viewer/viewerBase.js

@@ -137,9 +137,9 @@ export class ViewerBase extends THREE.EventDispatcher{
             }     
         }
         if (render) { 
-            this.setSize(w, h, ratio); 
+            this.setSize(w, h, ratio, o.forTarget  ); 
         } 
-    }   
+    }    
 
 
  
@@ -196,9 +196,10 @@ export class ViewerBase extends THREE.EventDispatcher{
             this.ifEmitResize({viewport:this.viewports[0],  deviceRatio:devicePixelRatio})
         }  
          
-    } 
+    }  
     
     ifEmitResize(e){//切换viewport渲染时, 若这些viewport大小不同就发送一次, 通知一些材质更新resolution。  
+        //console.log('ifEmitResize',e.viewport.name,e.viewport.resolution2 )
         if(!e.viewport.resolution.equals(this.oldResolution)||!e.viewport.resolution2.equals(this.oldResolution2)){ 
             this.dispatchEvent($.extend(e, {type:'resize'})) 
             this.oldResolution.copy(e.viewport.resolution)
@@ -232,8 +233,8 @@ export class ViewerBase extends THREE.EventDispatcher{
                 //}
                 viewport.needRender = true  //直接写这咯  
                 if(changeInfo.resolutionChanged){
-                    this.dispatchEvent( {type:'resize', viewport})  
-                } 
+                    this.ifEmitResize({viewport}) //for map
+                }  
                   
             }                
         }
@@ -244,6 +245,7 @@ export class ViewerBase extends THREE.EventDispatcher{
     
     
     
+    
     makeScreenshot( size,  viewports, compressRatio){//暂时不要指定viewports渲染,但也可以
         
        

+ 11 - 4
src/navigation/InputHandlerNew.js

@@ -67,6 +67,9 @@ export class InputHandler extends THREE.EventDispatcher {
             //window.parent.postMessage('listenMouseup', '*');
             window.addEventListener('mouseout', this.onMouseUp.bind(this), false);  //cancel drag
         } 
+        this.domElement.addEventListener('mouseout', ()=>{
+            this.containsMouse = false
+        }, false);
         
         
 		this.domElement.addEventListener('mousemove', this.onMouseMove.bind(this), false);
@@ -80,9 +83,10 @@ export class InputHandler extends THREE.EventDispatcher {
 		this.domElement.addEventListener('DOMMouseScroll', this.onMouseWheel.bind(this), false); // Firefox
         
 		//this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this));  //因为双击时间间隔是跟随系统的所以不好判断
-		
+		 
         window.addEventListener('keydown', this.onKeyDown.bind(this));//原先是this.domElement,这样的话一开始要点击屏幕后才能监听到
-		window.addEventListener('keyup', this.onKeyUp.bind(this));
+        
+        window.addEventListener('keyup', this.onKeyUp.bind(this));
          
         
         window.addEventListener('blur',this.onKeyUp.bind(this)); //add
@@ -305,7 +309,10 @@ export class InputHandler extends THREE.EventDispatcher {
 
 	onKeyDown (e) {
 		if (this.logMessages) console.log(this.constructor.name + ': onKeyDown');
-
+        
+        if(!this.containsMouse)return //在别的ui上无效
+        
+        
 		// DELETE
 		/* if (e.keyCode === KeyCodes.DELETE && this.selection.length > 0) {
 			this.dispatchEvent({ 
@@ -1117,7 +1124,7 @@ export class InputHandler extends THREE.EventDispatcher {
                 }
             ))
             
-             
+            this.containsMouse = true
         }
         
 		

+ 3 - 1
src/viewer/EDLRendererNew.js

@@ -351,7 +351,9 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
            
         visiblePointClouds2.forEach(e=>{
             e.visible = e.oldVisi
-        }) 
+        })
+
+   
         //viewer.dispatchEvent({type: "render.pass.end",viewer: viewer});
 	}
     

+ 16 - 8
src/viewer/ExtendView.js

@@ -5,6 +5,11 @@ import Common from '../custom/utils/Common.js'
 import {View} from './View.js'
 let sid = 0
  
+ 
+ 
+ 
+ 
+ 
 class ExtendView extends View {
 	constructor () {
         super()
@@ -26,9 +31,7 @@ class ExtendView extends View {
          
         camera.updateMatrix();
         camera.updateMatrixWorld();
-        //camera.matrixWorldInverse.copy(camera.matrixWorld).invert();
-           
-        
+        //camera.matrixWorldInverse.copy(camera.matrixWorld).invert(); 
     }
     
     get rotation(){
@@ -39,9 +42,14 @@ class ExtendView extends View {
         return rotation
     }
      
-    set rotation(rotation){//这个在数字很小(垂直向上看)的时候水平旋转精度可能损失,导致突变到另一个角度去了,用 set quaternion比较好
-        //因为 rotation的y不一定是0 , 所以不能直接逆着写。
-        this.direction = new THREE.Vector3(0,0,-1).applyEuler(rotation)
+    set rotation(rotation){ 
+        if(rotation.y != 0){//因为 rotation的y不一定是0 , 所以不能直接逆着get rotation写。 
+            //console.error('set rotation y不为0!!!!?', rotation ) //过渡时因为quaternion lerp所以不为0。没办法了orz
+            this.direction = new THREE.Vector3(0,0,-1).applyEuler(rotation)  //转回direction有损耗,在俯视时的(dir.x==dir.y==0), 丢失yaw信息从而 yaw无法获取(希望不要遇到这种情况,如果有的话,考虑先计算yaw,似乎好像可以算)
+        }else{//尽量不用direction
+            this.pitch = rotation.x - Math.PI / 2
+            this.yaw = rotation.z
+        } 
     }
     
    
@@ -49,8 +57,8 @@ class ExtendView extends View {
         return new THREE.Quaternion().setFromEuler(this.rotation)
     }
     
-    set quaternion(q){
-        this.direction = new THREE.Vector3(0,0,-1).applyQuaternion(q) //注意如果得到的dir.x==dir.y==0,  yaw不会变为0, 导致算的quaternion和q不一致
+    set quaternion(q){ 
+        this.rotation = new THREE.Euler().setFromQuaternion(q)
     }
     
     copy(a){