xzw 1 年之前
父节点
当前提交
36d266c00e

+ 5 - 12
src/ExtendPointCloudOctree.js

@@ -465,9 +465,9 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
                     if(!params.all){
                     if(!params.all){
                         if(camera.type == 'OrthographicCamera'){
                         if(camera.type == 'OrthographicCamera'){
                             let vec = new THREE.Vector3().subVectors(position, camera.position)
                             let vec = new THREE.Vector3().subVectors(position, camera.position)
-                            hit.disSquare = vec.projectOnVector( cameraDir ).lengthSq();  //只考虑到相机的垂直距离 
-                        }else{ 
-                            hit.disSquare = camera.position.distanceToSquared(position)
+                            hit.disSquare = vec.projectOnVector( cameraDir ).length();  //只考虑到相机的垂直距离 
+                        }else{  
+                            hit.disSquare = camera.position.distanceTo(position)
                         }  
                         }  
                     }
                     }
 				} else if (attributeName === 'indices') {
 				} else if (attributeName === 'indices') {
@@ -513,15 +513,8 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
                 let sorted1 = hits.sort( (a, b) => a.disSquare - b.disSquare  ).slice();
                 let sorted1 = hits.sort( (a, b) => a.disSquare - b.disSquare  ).slice();
                 
                 
                 let nearest = sorted1[0]  //return nearest.point;  //直接用最近点 在点云稀疏时不太跟手,如地面上,最近点往往在鼠标下方
                 let nearest = sorted1[0]  //return nearest.point;  //直接用最近点 在点云稀疏时不太跟手,如地面上,最近点往往在鼠标下方
-                 
-                let r  
-                if(camera.type != 'OrthographicCamera'){ 
-                    let ratio = 0.1 //系数越大越不跟手,但更容易pick近处的。 (当pick的点较远时,获取框内的点距离可能差别很大,就要所以除以disSquare)
-                    r = rSquare/Math.max(nearest.disSquare,0.001) * ratio
-                }else{ 
-                    r = 10      //大一点才能pick到表面的点,但太大了有时不跟手,且总容易吸附到近点
-                }
-                
+                let r = 10      
+                  
                 hits.forEach( hit=>{
                 hits.forEach( hit=>{
                     let disDiff = hit.disSquare - nearest.disSquare //和最近点的偏差 
                     let disDiff = hit.disSquare - nearest.disSquare //和最近点的偏差 
                     hit.disDiff = disDiff 
                     hit.disDiff = disDiff 

+ 1 - 1
src/PotreeRendererNew.js

@@ -911,7 +911,7 @@ export class Renderer {
 			//shader.setUniformMatrix4("modelMatrix", world);
 			//shader.setUniformMatrix4("modelMatrix", world);
 			//shader.setUniformMatrix4("modelViewMatrix", worldView);
 			//shader.setUniformMatrix4("modelViewMatrix", worldView);
 			shader.setUniform1f("uLevel", level);
 			shader.setUniform1f("uLevel", level);
-            //shader.setUniform1f("levelPercent", octree.nodeMaxLevel ? level / octree.nodeMaxLevel : 0.5);//xzw add
+            shader.setUniform1f("levelPercent", octree.nodeMaxLevel ? level / octree.nodeMaxLevel : 0.5);//xzw add
             
             
 			shader.setUniform1f("uNodeSpacing", node.geometryNode.estimatedSpacing);
 			shader.setUniform1f("uNodeSpacing", node.geometryNode.estimatedSpacing);
 
 

+ 24 - 0
src/custom/modules/panos/Images360.js

@@ -1397,6 +1397,30 @@ export class Images360 extends THREE.EventDispatcher{
                 callback: deferred.resolve.bind(deferred, !0)
                 callback: deferred.resolve.bind(deferred, !0)
             }  );
             }  );
         } else {
         } else {
+            //如果离数据集较远,转动也很难找到点云,就飞到就近点:
+            let po = viewer.scene.pointclouds.find(e=>e.visibleNodes.some(a=>a.getLevel() > Math.ceil(e.maxLevel * 0.15) )) //虽然当点云在前方很远的地方也可能符合
+             
+            if(!po){//无可见点云
+                //console.log('no visi cloud')
+                
+                if(!this.panos.length){//如果场景中没有漫游点,如SG-t-XPf1k9pv3Zg 点击后回到可见区域
+                    let map = new Map() 
+                    let clouds = viewer.scene.pointclouds.filter(e=>e.root.geometryNode)
+                    clouds.forEach(e=>map.set(e, e.bound.distanceToPoint(this.position))) 
+                    clouds.sort((a,b)=>map.get(a) - map.get(b)) 
+                    
+                    viewer.flyToDataset({focusOnPoint:true, pointcloud:clouds[0] })//飞最近的一个点云
+                    return deferred.promise();
+                }
+                 
+                this.flyToPano({
+                    pano: this.findNearestPano(),
+                    callback: deferred.resolve.bind(deferred, !0)
+                });
+                return deferred.promise();
+                 
+            }
+             
             this.bump(direction);
             this.bump(direction);
             deferred.resolve(!1);
             deferred.resolve(!1);
         }
         }

+ 2 - 1
src/custom/objects/tool/ctrlPolygon.js

@@ -481,6 +481,7 @@ export class ctrlPolygon extends THREE.Object3D {
     
     
      
      
     getFacePlane(){//最普通一种get方法,根据顶点。且假设所有点已经共面,且不重合
     getFacePlane(){//最普通一种get方法,根据顶点。且假设所有点已经共面,且不重合
+    
         if(/* !this.atPlane ||  */this.points.length<3) return
         if(/* !this.atPlane ||  */this.points.length<3) return
         /* this.facePlane = new THREE.Plane().setFromCoplanarPoints(...this.points.slice(0,3) ) */ 
         /* this.facePlane = new THREE.Plane().setFromCoplanarPoints(...this.points.slice(0,3) ) */ 
         let facePlane = this.facePlane
         let facePlane = this.facePlane
@@ -493,7 +494,7 @@ export class ctrlPolygon extends THREE.Object3D {
                 normal.add(nor)
                 normal.add(nor)
             }
             }
             normal.normalize(); 
             normal.normalize(); 
-            facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal, center)  
+            facePlane = new THREE.Plane().setFromNormalAndCoplanarPoint(normal,  this.points[0])  
         } 
         } 
         return facePlane
         return facePlane
     
     

+ 1 - 1
src/custom/potree.shim.js

@@ -1486,7 +1486,7 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
             //console.log('load done!')
             //console.log('load done!')
             setTimeout(()=>{
             setTimeout(()=>{
                 Potree.pointsLoading || viewer.dispatchEvent('pointsLoaded')
                 Potree.pointsLoading || viewer.dispatchEvent('pointsLoaded')
-            },document.hidden ? 100 : 50) 
+            },document.hidden ? 3000 : 50) //hidden时可能好几秒才更新一次,所以这个并不准
         } 
         } 
     }
     }
     
     

+ 53 - 20
src/custom/start.js

@@ -32,13 +32,11 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
     let viewer = new Potree.Viewer(dom , mapDom);
     let viewer = new Potree.Viewer(dom , mapDom);
     
     
     let Alignment = viewer.modules.Alignment
     let Alignment = viewer.modules.Alignment
-    
-    
-  
+     
 	viewer.setEDLEnabled(false);
 	viewer.setEDLEnabled(false);
     viewer.setFOV(Potree.config.view.fov); 
     viewer.setFOV(Potree.config.view.fov); 
     //viewer.loadSettingsFromURL(); 
     //viewer.loadSettingsFromURL(); 
-    
+    Potree.settings.cameraFar = Potree.config.view.far
     
     
      if(!Potree.settings.isOfficial){ 
      if(!Potree.settings.isOfficial){ 
         viewer.loadGUI(() => {
         viewer.loadGUI(() => {
@@ -119,26 +117,61 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
                             pano,  duration:0,
                             pano,  duration:0,
                             target : viewer.images360.bound.center.setZ(pano.position.z)    //平视中心区域(但也不能保证这个方向一定能看到点云密集区,如果在边缘的话)  
                             target : viewer.images360.bound.center.setZ(pano.position.z)    //平视中心区域(但也不能保证这个方向一定能看到点云密集区,如果在边缘的话)  
                         }) 
                         }) 
-                    }else{//SG-t-DXmdymgZ2sX 无漫游点
-                        //从bounding的外部看向中心 
-                        /* let bound = viewer.bound.boundingBox.clone()  
-                        let hopeSize = new THREE.Vector3(30,30,20).min(viewer.bound.boundSize)//希望看到的范围 
-                        bound.expandByVector(new THREE.Vector3().subVectors(hopeSize,viewer.bound.boundSize).multiplyScalar(0.5))
-                        bound.min.z = viewer.bound.boundingBox.min.z+0.5//z集中于地面
-                        bound.max.z = bound.min.z+hopeSize.z 
-                        viewer.focusOnObject({boundingBox:bound},'boundingBox',0,{dontChangeCamDir:true}) */
+                    }else{// 无漫游点  避免加载时看不到点云 SG-t-DXmdymgZ2sX  SG-t-rVB03a5GXr8 
                         //SG-t-XPf1k9pv3Zg 总有极端的场景,如这是倾斜的桥 - -, 只能调整为看到全局了
                         //SG-t-XPf1k9pv3Zg 总有极端的场景,如这是倾斜的桥 - -, 只能调整为看到全局了
-                        const far = 20
-                        viewer.mainViewport.camera.far = 10000
-                        let bound = viewer.bound.boundingBox.clone()
-                        // bound.expandByVector(new THREE.Vector3().subVectors(hopeSize,viewer.bound.boundSize).multiplyScalar(0.5))                        
+                        
+                        viewer.mainViewport.view.pitch = -0.7 //相对俯视
+                        
+                        let bound = viewer.bound.boundingBox.clone() 
                         viewer.focusOnObject({boundingBox:bound},'boundingBox',0,{dontChangeCamDir:true})
                         viewer.focusOnObject({boundingBox:bound},'boundingBox',0,{dontChangeCamDir:true})
+                        if(viewer.bound.boundSize.length() < 20)return //否则有可能超出far范围
+                        
+                        
+                        viewer.mainViewport.camera.far = 10000;
+                        viewer.mainViewport.camera.updateProjectionMatrix() 
+                        viewer.fixCamFar = true //不允许修改camera.far
+                          
                         //等有点云加载出来后,再去focus其中一个,使camera.far不超过最大值
                         //等有点云加载出来后,再去focus其中一个,使camera.far不超过最大值
                         
                         
-                        viewer.addEventListener('pointcloud_changed',()=>{
-                            setTimeout(()=>{
-                                console.log(viewer.visibleNodes)
-                            },50)
+                        viewer.addEventListener('pointcloud_changed',()=>{ 
+                            let count_ = 0;
+                            let done = ()=>{
+                                viewer.fixCamFar = false
+                                viewer.mainViewport.camera.far = Potree.settings.cameraFar; 
+                                viewer.mainViewport.camera.updateProjectionMatrix() 
+                            }
+                            let focus = (e)=>{//拉近到某个点
+                                if(e && e.v === false)return
+                                viewer.removeEventListener('pageVisible', focus )
+                           
+                                let pointcloud = viewer.scene.pointclouds.find(e=>e.root.geometryNode)
+                                 
+                                console.log('初始加载focus点云', e , pointcloud)
+                                 
+                                if(!pointcloud){  
+                                    if(count_ < 10 ){//可能没加载到,可能被隐藏
+                                        if(document.hidden){//等回到页面再focus
+                                            console.log('focus hidden')
+                                            return viewer.addEventListener('pageVisible', focus )
+                                        }
+                                        count_ ++ //如果在别的
+                                        setTimeout(focus, 200) 
+                                    }else{ //放弃
+                                        console.log('初始加载focus点云 放弃')
+                                        done()
+                                    }    
+                                    return console.warn('no!!!!!!!!!!!!!!')
+                                }  
+                                viewer.flyToDataset({focusOnPoint:true, pointcloud, duration:0, })
+                                
+                                console.warn('ok!!!!!!!!!!!!!!!!')
+                                done()
+                            }
+                        
+                        
+                            setTimeout(focus, 300)
+                                
+                            
                         },{once:true})
                         },{once:true})
                         
                         
                         
                         

+ 1 - 1
src/custom/utils/SplitScreen4Views.js

@@ -146,7 +146,7 @@ SplitScreen4Views.split = function(o={}){
                 Potree.settings.pointDensity = 'fourViewports' //强制降低点云质量
                 Potree.settings.pointDensity = 'fourViewports' //强制降低点云质量
                 
                 
                 //侧面重叠概率更大,所以透明度调小
                 //侧面重叠概率更大,所以透明度调小
-                e.changePointOpacity(this.name == "mapViewport" ? 0.2 : 0.06/* newOpacityMap.get(e).get(viewport), true */);  //多数据集有的数据集很小,放大后显示特别淡
+                e.changePointOpacity(this.name == "mapViewport" ? 0.5 : 0.1/* newOpacityMap.get(e).get(viewport), true */);  //多数据集有的数据集很小,放大后显示特别淡
                 //console.log(e.name, viewport.name, e.temp.pointOpacity, e.material.opacity)
                 //console.log(e.name, viewport.name, e.temp.pointOpacity, e.material.opacity)
             } 
             } 
             
             

+ 42 - 13
src/custom/viewer/ViewerNew.js

@@ -659,7 +659,7 @@ export class Viewer extends ViewerBase{
                 },
                 },
                 set: (far)=>{
                 set: (far)=>{
                     if(far != cameraFar){
                     if(far != cameraFar){
-                        if(Potree.settings.displayMode != 'showPanos'){
+                        if(Potree.settings.displayMode != 'showPanos' && !this.fixCamFar){
                             this.mainViewport.camera.far = far;
                             this.mainViewport.camera.far = far;
                             this.mainViewport.camera.updateProjectionMatrix()
                             this.mainViewport.camera.updateProjectionMatrix()
                         }
                         }
@@ -806,12 +806,13 @@ export class Viewer extends ViewerBase{
                 console.warn('visibilitychange', v )
                 console.warn('visibilitychange', v )
                 this.dispatchEvent({type:'pageVisible', v } )
                 this.dispatchEvent({type:'pageVisible', v } )
                 
                 
-                if(this.screenshoting && !v){
+                if(this.screenshoting && !v){//截图过程中离开页面需要照常loop。但是尽量别离开页面,效果只能达到90%
                     interval = setInterval(()=>{
                     interval = setInterval(()=>{
+                        //console.log('force loop', Date.now())
                         if(this.screenshoting){ //截图完成时如果还没回来就不loop
                         if(this.screenshoting){ //截图完成时如果还没回来就不loop
                             this.loop(Date.now()) 
                             this.loop(Date.now()) 
                         }
                         }
-                    },30)  
+                    },50)  //实际>1000, 浏览器会放慢定时器,放慢多少不确定
                 }else if(v && interval){
                 }else if(v && interval){
                     clearInterval(interval)
                     clearInterval(interval)
                 }   
                 }   
@@ -3675,20 +3676,25 @@ export class Viewer extends ViewerBase{
             }
             }
             
             
             
             
-            let maxTime = 1000
+            let maxTime = document.hidden ? 6000 : 1000 //离开页面后会变成1秒1帧   
+            
             setTimeout(()=>{
             setTimeout(()=>{
                 if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载 
                 if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载 
                     
                     
                     viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确) 
                     viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确) 
-                        //if(!finish)console.warn('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints)                         
+                         if(!finish)console.warn('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints)                         
                         dealDone()
                         dealDone()
                     },{once:true})
                     },{once:true})
                      
                      
-                     
-                    setTimeout(()=>{//超时不候(其实之后等待地图还会再加载几秒)
-                        //if(!finish)console.warn('超时, numVisiblePoints', Potree.numVisiblePoints)  
+                    let overTime = ()=>{//超时不候(其实之后等待地图还会再加载几秒)
+                        if(document.hidden){
+                            return setTimeout(overTime, maxTime)  
+                        }
+                        if(!finish)console.warn('超时, numVisiblePoints', Potree.numVisiblePoints)  
                         dealDone()
                         dealDone()
-                    },maxTime)
+                    }
+                     
+                    setTimeout(overTime, maxTime)
                 }else{
                 }else{
                     dealDone()
                     dealDone()
                 } 
                 } 
@@ -4233,6 +4239,23 @@ export class Viewer extends ViewerBase{
         else pointcloud = this.scene.pointclouds.find(p => p.dataset_id == o.id);
         else pointcloud = this.scene.pointclouds.find(p => p.dataset_id == o.id);
          
          
         let duration = o.duration == void 0 ? 1000 : o.duration
         let duration = o.duration == void 0 ? 1000 : o.duration
+        if(o.focusOnPoint){//focus点云上一点,避免center区域刚好没有点
+            if(pointcloud.root.geometryNode){ 
+                let posArr = pointcloud.root.geometryNode.geometry.attributes.position.array
+                
+                let count = pointcloud.root.geometryNode.geometry.attributes.position.count
+                let index = Math.ceil(count / 2) //随便取一个点 
+                let point = new THREE.Vector3(posArr[index*3+0],posArr[index*3+1],posArr[index*3+2]) 
+                //point.applyMatrix4(pointcloud.root.pointcloud.matrixWorld)
+                point.applyMatrix4(pointcloud.root.sceneNode.matrixWorld)
+                viewer.focusOnObject({position:point},'point',duration,{dontChangeCamDir:true, distance:15})
+
+                o.dontMoveMap || viewer.mapViewer.fitToPointcloud(pointcloud, duration)           
+                console.log('flyToDataset focusOnPoint done')
+                return
+            }   
+        }
+         
         var center = pointcloud.bound.getCenter(new THREE.Vector3);
         var center = pointcloud.bound.getCenter(new THREE.Vector3);
         let position
         let position
         let getPano = ()=>{//获取离中心最近的pano
         let getPano = ()=>{//获取离中心最近的pano
@@ -4450,10 +4473,10 @@ export class Viewer extends ViewerBase{
 
 
 	loop(timestamp){
 	loop(timestamp){
         //let startTime = performance.now()
         //let startTime = performance.now()
-        console.log('间隔:' /*, parseInt((startTime - this.lastEndTime)*100 )/100 */)
-        if(this.paused)return
+        //console.log('间隔:' /*, parseInt((startTime - this.lastEndTime)*100 )/100 */)
+        if(this.paused)return 
         if(performance.getEntriesByName("loopWaitNext-start").length)viewer.addTimeMark('loopWaitNext','end') 
         if(performance.getEntriesByName("loopWaitNext-start").length)viewer.addTimeMark('loopWaitNext','end') 
-        
+         
          
          
 		if(this.stats){
 		if(this.stats){
 			this.stats.begin();
 			this.stats.begin();
@@ -5112,7 +5135,13 @@ export class Viewer extends ViewerBase{
         this.paused = !state  
         this.paused = !state  
     }
     }
      
      
-        
+      
+
+
+     
+
+
+      
     addFire(){   
     addFire(){   
   
   
         if(Potree.settings.number == 't-CwfhfqJ'){
         if(Potree.settings.number == 't-CwfhfqJ'){

+ 1 - 1
src/custom/viewer/map/Map.js

@@ -966,7 +966,7 @@ export class TiledMapFromEntity extends TiledMapBase{
  
  
  
  
  
  
- https://lbs.amap.com/tools/picker  高德坐标拾取器,但和这里展示的不一样, 要用AMapWith84.aMapToWgs84({x: ,y: })转成84。  (qq or 手机登录)
+ https://lbs.amap.com/tools/picker  高德坐标拾取器,但和这里展示的不一样, 要用AMapWith84.aMapToWgs84({x: ,y: })转成84。  (qq or 手机登录)  所以potree本地和有AMapWith84函数的laser地图展现不一样
  https://www.google.com/maps/@77.7730021,-34.4952712,4z     google取点
  https://www.google.com/maps/@77.7730021,-34.4952712,4z     google取点
  
  
  
  

+ 2 - 2
src/custom/viewer/map/MapViewer.js

@@ -158,7 +158,7 @@ export class MapViewer extends ViewerBase{
     
     
     
     
     waitLoadDone(callback){//确保加载完后执行 
     waitLoadDone(callback){//确保加载完后执行 
-        let timer, maxWaitTime = 500; //等待一段时间看有没有新加载的tile,如果超过这个时间没有就不等了,算加载结束
+        let timer   //等待一段时间看有没有新加载的tile,如果超过这个时间没有就不等了,算加载结束
      
      
         let pauseCountDown = ()=>{//重新等待加载结束,中断倒计时 
         let pauseCountDown = ()=>{//重新等待加载结束,中断倒计时 
             clearTimeout(timer) 
             clearTimeout(timer) 
@@ -173,7 +173,7 @@ export class MapViewer extends ViewerBase{
                 this.mapLayer.removeEventListener('loadDone', freshCountDown)
                 this.mapLayer.removeEventListener('loadDone', freshCountDown)
                 this.mapLayer.removeEventListener('startLoad', pauseCountDown) 
                 this.mapLayer.removeEventListener('startLoad', pauseCountDown) 
                 callback() 
                 callback() 
-            },maxWaitTime)    
+            }, document.hidden ? 5000 : 500)    
         } 
         } 
            
            
         
         

+ 14 - 5
src/materials/shaders/pointcloud_new.vs

@@ -1013,20 +1013,29 @@ void main() {
    
    
     //-------------------        
     //-------------------        
   
   
-    if(uOpacity>=1.0){ 
+    if(uOpacity>=1.0 || uUseOrthographicCamera){ 
         vOpacity = uOpacity; 
         vOpacity = uOpacity; 
+        
+     
+        if(uOpacity<1.0){ //uUseOrthographicCamera  
+            //防止缩小后点云几乎看不见 
+            vOpacity *= 4.0-3.0 * levelPercent; 
+            
+        }
+        
     }else{                                              //#ifdef attenuated_opacity      zoom不会改变z 所以这并不是用在分屏时候的
     }else{                                              //#ifdef attenuated_opacity      zoom不会改变z 所以这并不是用在分屏时候的
         float v = -gl_Position.z-1.0 ;   // 范围从-2到0,   e的-2到0次方的范围是0.818到1 
         float v = -gl_Position.z-1.0 ;   // 范围从-2到0,   e的-2到0次方的范围是0.818到1 
-        //vOpacity = uOpacity * exp(v/ (levelPercent * 20.0 )  );  
+        //vOpacity = uOpacity * exp(v/ (levelPercent * 20.0 )  ); 
+        
         //近处加深,远处变淡  gl_Position.z似乎朝向屏幕里为正
         //近处加深,远处变淡  gl_Position.z似乎朝向屏幕里为正
         float r = clamp( pow(1.1, v/10.0    ),  0.1, 1.0  );  //除以的数字越大,近高远低的程度越小,范围越长。 程度太高远处单薄的区域看不见  pow的底数越大改变率越大
         float r = clamp( pow(1.1, v/10.0    ),  0.1, 1.0  );  //除以的数字越大,近高远低的程度越小,范围越长。 程度太高远处单薄的区域看不见  pow的底数越大改变率越大
         vOpacity = uOpacity * r  ;
         vOpacity = uOpacity * r  ;
         
         
-       // vOpacity = clamp(vOpacity, 0.001, 1.0);  
+         
     }  
     }  
     
     
-    vOpacity *= max(0.05,  pow((1.0 - normalZ),5.0));//垂直朝相机时降低透明度 
-      
+    vOpacity *= max(0.3,  pow((1.0 - normalZ),5.0));//垂直朝相机时降低透明度 
+    //vOpacity = clamp(vOpacity, 0.0, 1.0); 
 
 
 
 
 
 

+ 8 - 7
src/navigation/FirstPersonControlsNew.js

@@ -121,9 +121,11 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                 if(this.rotateStartInfo.rotAroundPoint){//定点旋转:   以当前intersect的点为target旋转,不改点在屏幕中的位置
                 if(this.rotateStartInfo.rotAroundPoint){//定点旋转:   以当前intersect的点为target旋转,不改点在屏幕中的位置
                      
                      
                     let distance = camera.position.distanceTo(this.rotateStartInfo.rotCenter/* this.intersectStart.location */)                                               //不按下ctrl的话                 
                     let distance = camera.position.distanceTo(this.rotateStartInfo.rotCenter/* this.intersectStart.location */)                                               //不按下ctrl的话                 
-                      
-                    if(this.rotateStartInfo.rotCenter2d.z>1)distance *= -1 //在背面  
-                      
+                     
+                    let posDir = new THREE.Vector3().subVectors(this.rotateStartInfo.rotCenter, view.position)
+                    if(posDir.dot(view.direction) < 0 )distance *= -1 //在背面  
+                     
+                     
                     //按照orbitControl的方式旋转:
                     //按照orbitControl的方式旋转:
                     let rotationSpeed = 2;   
                     let rotationSpeed = 2;   
                     this.yawDelta -= e.drag.pointerDelta.x * rotationSpeed;
                     this.yawDelta -= e.drag.pointerDelta.x * rotationSpeed;
@@ -147,8 +149,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     //立即更新下,防止因update和此drag频率不同而打滑。
                     //立即更新下,防止因update和此drag频率不同而打滑。
                     this.update()
                     this.update()
                     view.applyToCamera(camera)
                     view.applyToCamera(camera)
-                    
-               
+                     
                 }else{
                 }else{
                   
                   
                     
                     
@@ -182,7 +183,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                      
                      
                     camera.matrixWorld = _matrixWorld ;
                     camera.matrixWorld = _matrixWorld ;
                     
                     
-                
+                      
                 
                 
                 } 
                 } 
 			} 
 			} 
@@ -501,7 +502,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                 let pivotType = this.target ? 'target' : viewer.atDatasets.length > 0 ? 'intersect' :  viewer.inputHandler.selection.length ? 'selection' : this.target2 ? 'target2' : 'boundCenter'  
                 let pivotType = this.target ? 'target' : viewer.atDatasets.length > 0 ? 'intersect' :  viewer.inputHandler.selection.length ? 'selection' : this.target2 ? 'target2' : 'boundCenter'  
                 rotCenter = pivotType == 'target'? this.target :pivotType == 'intersect' ? intersect.location : pivotType == 'selection' ? viewer.inputHandler.selection[0].position : pivotType == 'target2' ? this.target2 :viewer.bound.center
                 rotCenter = pivotType == 'target'? this.target :pivotType == 'intersect' ? intersect.location : pivotType == 'selection' ? viewer.inputHandler.selection[0].position : pivotType == 'target2' ? this.target2 :viewer.bound.center
                 if(rotCenter){
                 if(rotCenter){
-                    rotCenter2d = rotCenter.clone().project(e.dragViewport.camera) //点在屏幕中的位置
+                    rotCenter2d = rotCenter.clone().project(e.dragViewport.camera) //点在屏幕中的位置。   若z>1 则在背面 或 超出far范围 
                 }else{
                 }else{
                     rotAroundPoint = false
                     rotAroundPoint = false
                 } 
                 } 

+ 2 - 2
src/viewer/ExtendView.js

@@ -136,7 +136,7 @@ class ExtendView extends View {
         
         
 		this.position = this.position.add(t);
 		this.position = this.position.add(t);
          
          
-        if((!math.closeTo(x, 0, 1e-4) || !math.closeTo(y, 0, 1e-4) || !math.closeTo(z, 0, 1e-4)) && Potree.settings.displayMode != 'showPanos'){
+        if((!math.closeTo(x, 0, 1e-2) || !math.closeTo(y, 0, 1e-2) || !math.closeTo(z, 0, 1e-2)) && Potree.settings.displayMode != 'showPanos'){
             this.cancelFlying('pos')
             this.cancelFlying('pos')
         }
         }
         
         
@@ -146,7 +146,7 @@ class ExtendView extends View {
 	translateWorld (x, y, z) { 
 	translateWorld (x, y, z) { 
 		super.translateWorld(x, y, z)
 		super.translateWorld(x, y, z)
         
         
-        if((!math.closeTo(x, 0, 1e-4) || !math.closeTo(y, 0, 1e-4) || !math.closeTo(z, 0, 1e-4)) && Potree.settings.displayMode != 'showPanos'){
+        if((!math.closeTo(x, 0, 1e-2) || !math.closeTo(y, 0, 1e-2) || !math.closeTo(z, 0, 1e-2)) && Potree.settings.displayMode != 'showPanos'){
             this.cancelFlying('pos')
             this.cancelFlying('pos')
         }
         }