xzw 2 سال پیش
والد
کامیت
e204fea017

+ 12 - 4
src/ExtendPointCloudOctree.js

@@ -94,12 +94,15 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
         
         
         if( this.nodeMaxLevel==0 )return true
-        if(camera.type == "OrthographicCamera"){
-            if(!Potree.Utils.isInsideFrustum(this.pcoGeometry.tightBoundingBox, camera)){
+        if(camera.type == "OrthographicCamera" || this.testMaxNodeCount < 50){
+            if(!Potree.Utils.isInsideFrustum(this.bound, camera)){
                 return true 
             }    
         }else if( !viewer.atDatasets.includes(this))return true //否则老远就count++
+          
+         
         
+         
         let levels = this.visibleNodes.map(e=>e.getLevel())
         let actMaxLevel = Math.max.apply(null, levels) //实际加载到的最高的node level
         if(actMaxLevel <  this.maxLevel)return true// 还没加载到能加载到的最高。  但在细节设置较低时,排除作用微弱。
@@ -122,8 +125,13 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
         
         this.testMaxNodeCount ++
         viewer.testMaxNodeCount ++
-        //console.log('testMaxNodeCount', this.testMaxNodeCount) 
         
+        //console.log('testMaxNodeCount', this.dataset_id,  this.testMaxNodeCount, 'nodeMaxLevel', this.nodeMaxLevel )
+        
+        
+        if( this.testMaxNodeCount == Potree.config.testNodeCount1 ){//差不多等当前所在数据集nodeMaxLevel加载出来
+            this.changePointSize()  //重新更新一下大小。因之前用的是nodeMaxLevelPredict (防止刚开始因nodeMaxLevel没涨完,导致过大的点云突然出现
+        }
         if(this.testMaxNodeCount > 100){
             console.log('testMaxNodeLevel次数超出,强制结束:',this.dataset_id,  this.nodeMaxLevel,  this.nodeMaxLevelPredict.min) 
             this.testMaxNodeLevelDone = 'moreThanMaxCount'
@@ -544,7 +552,7 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
             num_ = Math.pow(num_, 1.05) * 6 
              
             
-            nodeMaxLevel = this.testMaxNodeCount > Potree.config.testNodeCount1 ? this.nodeMaxLevel : this.nodeMaxLevelPredict.max //防止刚开始因nodeMaxLevel没涨完,导致过大的点云突然出现
+            nodeMaxLevel = this.testMaxNodeCount >= Potree.config.testNodeCount1 ? this.nodeMaxLevel : this.nodeMaxLevelPredict.max //防止刚开始因nodeMaxLevel没涨完,导致过大的点云突然出现
             
             if(sizeFitToLevel || Potree.settings.sizeFitToLevel){//按照点云质量来调整的版本:    近似将pointSizeType换成ADAPTIVE
                 let str = this.temp.pointSize+':'+this.maxLevel+':'+ nodeMaxLevel

+ 12 - 15
src/custom/objects/Magnifier.js

@@ -172,29 +172,17 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
             this.dontRender = false
         })
         
-        var updateVisi = (e)=>{
-            //if(e.hoverViewport == viewer.mainViewport){
-                Potree.Utils.updateVisible(this,"atViewport", true)
-                this.update(e.intersect && e.intersect.location)
-            /* }else{
-                Potree.Utils.updateVisible(this,"atViewport", false) //小地图不显示
-            } */ 
-            
+        var updateVisi = (e)=>{ 
+            this.update(e.intersect && e.intersect.location) 
         }
         
         //viewer.addEventListener('global_mousemove', updateVisi)
         viewer.addEventListener('global_touchstart', updateVisi) 
         viewer.addEventListener('getIntersect', updateVisi)
         
-        
-     
          
         this.addEventListener("setEnable",(e)=>{
-            Potree.Utils.updateVisible(this, "enable", e.value, 1,   e.value?'add':'cancel' ) //界面开关
-            /* if(Potree.settings.displayMode == 'showPanos') && e.value){
-                Potree.settings.pointDensity = 'magnifier'
-            }else if() */
-            
+            Potree.Utils.updateVisible(this, "enable", e.value, 1,   e.value?'add':'cancel' ) //界面开关 
         })
           
         //默认隐藏, 显示的条件:测量拖拽  或  外部消息setEnable
@@ -209,6 +197,15 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         }) 
          
         
+        this.addEventListener('isVisible',(e)=>{
+            //console.warn('isVisible',e)
+            if(e.visible && viewer.inputHandler.intersect){
+                this.update(viewer.inputHandler.intersect.location) 
+            }
+        })
+        
+        
+        
         viewer.scene.view.addEventListener('flyingDone',()=>{
             if(!this.visible)return
             let pickWindowSize = 100

+ 2 - 2
src/custom/objects/Reticule.js

@@ -69,9 +69,9 @@ export default class Reticule extends THREE.Mesh{
         viewer.addEventListener('endTagMove',endCrossStyle)
         
         viewer.addEventListener('reticule_forbit',(e)=>{
-            if(this.state.forbit != e.v){
+            /* if(this.state.forbit != e.v){
                 console.log('change forbit ',e.v)
-            }
+            } */
             this.state.forbit = e.v
             this.judgeTex() 
         })

+ 1 - 1
src/custom/objects/Sprite.js

@@ -146,7 +146,7 @@ export default class Sprite extends THREE.Mesh{
                         }
                     }else{
                         let dis = r2.pos.distanceTo(r1.pos)
-                        if(dis == 0){
+                        if(math.closeTo(dis,0)){
                             //console.log('dis == 0') 
                             Potree.Utils.updateVisible(this, 'unableCompute', false)
                             return

+ 33 - 6
src/custom/objects/tool/Measure.js

@@ -36,7 +36,7 @@ const LabelDepthInfo = {
 } */
 
 const markerSizeInfo = {
-    minSize : 25 ,  maxSize : 65,   nearBound : 0.2, farBound : 4,
+    minSize : 30*2 ,  maxSize : 65*2,   nearBound : 0.2, farBound : 4,
 }
 const labelSizeInfo = {width2d:190}
 const mainLabelProp = { 
@@ -229,12 +229,18 @@ export class Measure extends ctrlPolygon{
             }
             return 
         }
+        
          
+        /* viewer.addEventListener('camera_changed',(e)=>{
+            if(e.changeInfo.positionChanged){
+                setLabelPos()
+            } 
+        }) */
          
          
         let setEdgeLabel = (label,p1,p2,distance)=>{//设置label位置和字
-            let center = new THREE.Vector3().addVectors(p1,p2).multiplyScalar(0.5);  
-            label.setPos(center) 
+            this.setEdgeLabelPos(label,p1,p2)
+ 
             distance = distance == void 0 ? p1.distanceTo(p2) : distance; 
             var text = this.labelText || viewer.unitConvert.convert(distance, 'distance', Potree.settings.precision, this.unitSystem, 0.1 , true)//distance要传0.1 这个factor
             label.setText(text)
@@ -259,10 +265,10 @@ export class Measure extends ctrlPolygon{
                 let distance = this.labelText || point.distanceTo(nextPoint)
                 edgeLabel.shouldVisi = this.labelText || (index < lastIndex || this.isRect || this.closed && !this.isNew ) && distance>0 
                 /* this.closed || */edgeLabel.setVisible(edgeLabel.shouldVisi)  
+                edgeLabel.sprite.lineDir = new THREE.Vector3().subVectors(point,nextPoint).normalize() //[point,nextPoint]
                 if(edgeLabel.visible){
                     setEdgeLabel(edgeLabel,point,nextPoint,distance)
                 }  
-                edgeLabel.sprite.lineDir = new THREE.Vector3().subVectors(point,nextPoint).normalize() //[point,nextPoint]
             }
         } 
 
@@ -314,7 +320,28 @@ export class Measure extends ctrlPolygon{
 		
 	};
 
-  
+
+
+    setEdgeLabelPos(label,p1,p2){ //调整label的位置,使倾斜后看起来在线的中心,而不要挡住端点
+        let center = new THREE.Vector3().addVectors(p1,p2).multiplyScalar(0.5);  
+         
+        if(!label.sprite.lineDir || viewer.mainViewport.camera.type == 'OrthographicCamera'){
+            label.setPos(center)  
+        }else{ 
+            let eyePos = viewer.mainViewport.camera.position;
+            let dir = viewer.mainViewport.view.direction //new THREE.Vector3().subVectors(center,eyePos).normalize()
+            let vec = label.sprite.lineDir
+            let cos = dir.dot(vec)  
+            
+            let efficiency = 0.35; // 0-1  数值越高,r越容易接近1或-1,label越容易在倾斜后靠近近端点。 
+            let r = 0.5*efficiency*cos + 0.5
+            //console.log(r,    cos )
+            center = p1.clone().multiplyScalar(1-r).add(p2.clone().multiplyScalar(r)); //label在线上滑动,使尽量保持在视觉中心
+            label.setPos(center)  
+        } 
+    }
+
+    
       
 	addMarker (o={}) {
          
@@ -790,7 +817,7 @@ export class Measure extends ctrlPolygon{
                 replaceColor:this.color,
                 beReplacedRed: 0.184,   //0.18431372
                 mapColorReplace:true
-            }))  
+            }))   
         }  
         return markerMats[type + color] 
         

+ 45 - 1
src/custom/objects/tool/MeasuringTool.js

@@ -168,6 +168,16 @@ export class MeasuringTool extends THREE.EventDispatcher{
         
         viewer.addEventListener('resize',this.setSize.bind(this))
         
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
 	}
 
 	onSceneChange(e){
@@ -198,7 +208,41 @@ export class MeasuringTool extends THREE.EventDispatcher{
     }
     
     
-	update(){
+	update(){ 
+        //add
+        viewer.scene.measurements.forEach(measure=>{
+            
+            let lastIndex = measure.points.length - 1; 
+            for (let index = 0; index <= lastIndex; index++) {
+                
+                let nextIndex = (index + 1 > lastIndex) ? 0 : index + 1;
+                let previousIndex = (index === 0) ? lastIndex : index - 1;
+                
+                let point = measure.points[index];
+                let nextPoint = measure.points[nextIndex];
+                let previousPoint = measure.points[previousIndex];
+ 
+                if(measure.showDistances || measure.labelText){ // edge labels
+                    let edgeLabel = measure.edgeLabels[index];
+                  
+                    if(edgeLabel.visible){
+                        measure.setEdgeLabelPos(edgeLabel, point, nextPoint  )
+                    }  
+                }
+            } 
+            
+        })
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
+        
         return;
         
         

+ 8 - 6
src/custom/objects/tool/ctrlPolygon.js

@@ -222,7 +222,7 @@ export class ctrlPolygon extends THREE.Object3D {
         }
         let location = intersectPos.clone()
         
-       
+        //console.log('dragMarker', oldPoint, intersectPos) 
         
         
         if(this.faceDirection && this.maxMarkers == 2 && len == 2){//add 固定方向的点不直接拖拽
@@ -438,9 +438,12 @@ export class ctrlPolygon extends THREE.Object3D {
                 viewer.dispatchEvent({type:'reticule_forbit', v:false})
                 //console.log('reticule_forbit',false)
             }
-            this.dragMarker(e) //触屏时必须先更新下点 
+            this.isNew && this.dragMarker(e) //isNew触屏点击时必须先更新下点,因为指尖不在屏幕上时没更新。但对已经创建的marker点击时不应该更新
             
-        }
+        } 
+        
+        
+        viewer.dispatchEvent({type:'dropMarker', object:this})
          
         if (e.button != THREE.MOUSE.RIGHT && (//右键click的话继续执行,因为会停止
                 this.isIntersectSelf == 'all' && this.isNew //有线相交了
@@ -452,8 +455,7 @@ export class ctrlPolygon extends THREE.Object3D {
         ){
             return this.continueDrag(null,e)    
         } 
-         
-        //console.log('drop marker' )
+          
          
         let i = this.markers.indexOf(e.drag.object); 
         if (i !== -1) {
@@ -477,7 +479,7 @@ export class ctrlPolygon extends THREE.Object3D {
         e.drag.endDragFun && e.drag.endDragFun(e)//  addmarker
          
         //if(this.changeCallBack)this.changeCallBack()
-        viewer.dispatchEvent({type:'dropMarker', object:this})
+        
         return true
     };
     

+ 1 - 3
src/custom/viewer/ViewerNew.js

@@ -1111,9 +1111,7 @@ export class Viewer extends ViewerBase{
                         success = false; 
                     }
                 })
-                if(oldCount<=Potree.config.testNodeCount1  && this.testMaxNodeCount>Potree.config.testNodeCount1 ){//差不多等当前所在数据集nodeMaxLevel加载出来
-                    viewer.scene.pointclouds.forEach(e=>{e.changePointSize()}) //重新更新一下大小。因之前用的是nodeMaxLevelPredict (防止刚开始因nodeMaxLevel没涨完,导致过大的点云突然出现
-                } 
+                    
                 if(!success)return true //没有全部加载完,继续循环      
                 else {
                     this.removeEventListener('camera_changed',test)

+ 3 - 6
src/navigation/InputHandlerNew.js

@@ -401,11 +401,11 @@ export class InputHandler extends THREE.EventDispatcher {
       
         
         //if(isTouch || !Potree.settings.intersectWhenHover ){ 
-        if(!this.dragViewport.view.isFlying()){ 
+        if(isTouch || !this.dragViewport.view.isFlying()){ 
             this.hoveredElements = this.getHoveredElements(); 
             this.intersect = this.getIntersect(viewport) //更新intersect,避免在没有mousemove但flyToPano后intersect未更新。
             //this.intersect = this.getWholeIntersect()  
-        }
+        } //isTouch必须更新 否则是旧的
         if(!viewport)return //why add this?
         if (!this.drag) {
             let target = (isTouch||e.button == THREE.MOUSE.LEFT) && this.hoveredElements.find(el => (//只有左键能拖拽
@@ -1399,10 +1399,7 @@ export class InputHandler extends THREE.EventDispatcher {
             return order2-order1
         }) // 降序
         
-        /* if(intersections.length == 0){
-            console.log('no')
-        } */
-        //console.log('getHoveredElement ', intersections)
+       
 		return intersections;
 	}
 

+ 9 - 3
src/viewer/NavigationCube.js

@@ -592,6 +592,7 @@ class NavigationCube{
                      
                     navCubeViewer.switchView('ortho', dir, ()=>{ 
                         faceMesh.material.uniforms.faceColor.value.set(Colors.black)
+                        viewer.dispatchEvent({type:'viewChanged', name })
                     }) 
                     faceMesh.material.uniforms.faceColor.value.set(Colors.blue) 
                 }); 
@@ -725,7 +726,9 @@ class NavCubeViewer extends ViewerBase{
             this.addEventListener('enterTopView',()=>{  
                 let baseLine = viewer.scene.measurements.find(e=>e.isBaseLine && e.points.length == 2)  //使基准线在俯视图中水平
                 let yaw = baseLine ? new THREE.Vector2().subVectors(baseLine.points[0], baseLine.points[1]).angle() : 0 
-                this.switchView('ortho', {dir: new THREE.Vector3(0,0,-1),yaw,pitch: -1.5707963267948966}) 
+                this.switchView('ortho', {dir: new THREE.Vector3(0,0,-1),yaw,pitch: -1.5707963267948966}, ()=>{
+                    viewer.dispatchEvent({type:'viewChanged', name:'Top' })
+                }) 
             }) 
             this.addEventListener('leaveTopView',()=>{ 
                 if(this.lastView){
@@ -808,7 +811,7 @@ class NavCubeViewer extends ViewerBase{
             viewer.focusOnObject(viewer.bound, 'boundingBox', 1000, {
                 endPitch: pitch, endYaw: yaw , dir,  startCamera, endCamera
             }).promise.done(()=>{  
-                //viewer.dispatchEvent('reachTopView')
+                
                  
                 done && done()
                 navCubeViewer.dispatchEvent('content_changed')
@@ -839,7 +842,7 @@ class NavCubeViewer extends ViewerBase{
                 view.tranCamera(viewer.mainViewport,  { position ,   
                     callback:()=>{ 
                         done && done()
-                         
+                        viewer.dispatchEvent({type:'viewChanged', name:'perspective' })
                     }, startCamera:viewer.scene.cameraO, endCamera:viewer.scene.cameraP, midCamera:viewer.scene.cameraBasic
                 }, 500)
                  
@@ -902,6 +905,9 @@ class NavCubeViewer extends ViewerBase{
                 callback:()=>{ 
                     if(endCamera != viewer.scene.cameraO){
                         this.controls.setEnable(true)
+                        viewer.dispatchEvent({type:'viewChanged', name:'perspective' })
+                    }else{
+                        viewer.dispatchEvent({type:'viewChanged', name:'perspective' })
                     }
                 }, 
             }, 500)