Parcourir la source

fix: 没改好

xzw il y a 2 ans
Parent
commit
7c169a0f19

+ 11 - 4
src/custom/modules/panos/Images360.js

@@ -639,8 +639,8 @@ export class Images360 extends THREE.EventDispatcher{
         
         if(!toPano.pano.enabled)return done(false,true);
         
-        
-        if(this.latestToPano && this.latestToPano != toPano){//还在飞
+                 
+        if(this.latestToPano && this.latestToPano != toPano && !this.latestToPano.pano.position.equals(this.position)){//还在飞//如果旧的toPano只是旋转镜头,就直接取消旧的
             return done(false)
         }
         
@@ -1949,6 +1949,7 @@ export class Images360 extends THREE.EventDispatcher{
 			force = o.force,
 			getAll = o.getAll,  
             bestDistance = o.bestDistance || 0,
+            maxDis = o.maxDis,
             dir = o.dir
             
         let camera = viewer.scene.getActiveCamera()
@@ -1963,7 +1964,6 @@ export class Images360 extends THREE.EventDispatcher{
         
         
         
-        
         if(o.boundSphere){//只接受boundSphere
             let aspect = 1//size.x / size.y
             let dis
@@ -1980,6 +1980,8 @@ export class Images360 extends THREE.EventDispatcher{
         let disSquareMap = new Map()
         
         let bestDisSquared = bestDistance * bestDistance
+        let maxDisSquared = maxDis && maxDis * maxDis
+        
         rank.push((pano)=>{
             let dis1 = Math.abs(pano.position.distanceToSquared(point) - bestDisSquared); //距离最佳位置
             disSquareMap.set(pano, dis1)
@@ -1993,8 +1995,13 @@ export class Images360 extends THREE.EventDispatcher{
                 
                 let result =  (dis1 + dis2*0.3) * ( -1 + cos*0.9 ) //尽量贴近最佳位置的角度, 或贴近相机原来的角度 。尽量靠近最佳观测点,并且优先选择靠近目标点的位置.(注意cos的乘数不能太接近1,否则容易只考虑角度)
                 Potree.Log(pano.id, dis1, dis2,  cos,  result,{font:{toFixed:2,fontSize:10}}) 
+                
+                if(maxDisSquared && dis2 > maxDisSquared){
+                    result -= maxDisSquared*3 ;//尽量不要超过可视距离
+                }
                 return result
             } 
+            
             //注:热点最好加上法线信息,这样可以多加一个限制,尽量顺着热点像展示的方向。 
         },) 
      
@@ -2012,7 +2019,7 @@ export class Images360 extends THREE.EventDispatcher{
                     }else { 
                         score = 1000  
                     }
-                    console.log('intersect score ', pano.id, score) 
+                    //console.log('intersect score ', pano.id, score) 
                 }else{
                     score = 900  //没加载好的话,不管了 , 几乎当做无遮挡,否则容易到不了最近点
                 } 

+ 5 - 1
src/custom/objects/tool/Measure.js

@@ -437,6 +437,7 @@ export class Measure extends ctrlPolygon{
         marker.selected = absoluteState
         
         viewer.mapViewer && viewer.mapViewer.dispatchEvent('content_changed') 
+        viewer.dispatchEvent('content_changed')
     }
     
     
@@ -489,11 +490,14 @@ export class Measure extends ctrlPolygon{
         }
            
         this.selected = absoluteState
-        viewer.mapViewer && viewer.mapViewer.dispatchEvent('content_changed')
+        
         if(hoverObject != 'byList'){
             //this.bus && this.bus.emit('highlight', this.selected)
             this.dispatchEvent({type:'highlight',state:this.selected})//列表高亮
         }
+        
+        viewer.dispatchEvent('content_changed')
+        viewer.mapViewer && viewer.mapViewer.dispatchEvent('content_changed')
     }
     
 	removeMarker(index ){  

+ 2 - 2
src/custom/settings.js

@@ -155,7 +155,7 @@ const config = {//配置参数   不可修改
         color: '#FFC266', //map
         
     },
-    panoFieldRadius : 10, //当前位置多远范围内可以切全景模式
+    
     
     measure:{
         color:'#00C8AF',
@@ -282,7 +282,7 @@ const config = {//配置参数   不可修改
     
     highQualityMaxZoom: 2,
     ultraHighQualityMaxZoom: 3,
-    
+    panoFieldRadius : 10, //当前位置多远范围内可以切全景模式
     clickMaxDragDis:5,
     clickMaxPressTime:500, //ms
     doubleClickTime:200,//双击间隔时间

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

@@ -742,6 +742,8 @@ export class Viewer extends ViewerBase{
             
             
         } 
+        
+        
          
 	}
     
@@ -3562,7 +3564,7 @@ export class Viewer extends ViewerBase{
                 if(viewer.images360.currentPano == pano){ 
                     let dis1 = viewer.images360.currentPano.position.distanceTo(target)
                     let dis2 = position.distanceTo(target)
-                    console.log('dis1 / dis2',dis1 / dis2, 'dis1-dis2', dis1-dis2)
+                    //console.log('dis1 / dis2',dis1 / dis2, 'dis1-dis2', dis1-dis2)
                     return {msg: (dis1 / dis2 > 1.5 && dis1-dis2>10)? 'tooFar' : 'posNoChange',  promise : deferred.promise()  }
                   
                 }else{
@@ -3608,10 +3610,10 @@ export class Viewer extends ViewerBase{
             
             }else if(Potree.settings.displayMode == 'showPanos'){
                 let pano = viewer.images360.fitPanoTowardPoint({
-                    point : target,  
+                    point : target,    
                     dir :  this.scene.view.direction, //尽量不改相机方向,避免镜头晃动
                     checkIntersect: true,
-                    bestDistance  //越近越好,但不要太近,bestDistance左右差不多
+                    bestDistance,   maxDis:  o.maxDis   //越近越好,但不要太近,bestDistance左右差不多
                 })
                 pano && viewer.images360.flyToPano({pano, target, duration, deferred, dontMoveMap:true , basePanoSize:o.basePanoSize })
                 return {promise:deferred.promise() }               

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

@@ -532,7 +532,7 @@ export class MapTile{
             }
         }
         
-        h.map = texLoader.load(p, (tex)=>{
+        h.map = texLoader.load(p, (tex)=>{      //如果一直加载不了会影响其他的加载,如google地图没有vpn会使全景图一直加载不了
             if(this.mesh){//如果还要显示的话
                 this.textureLoaded = true
                 this.mesh.material.opacity = 1

+ 7 - 3
src/navigation/FirstPersonControlsNew.js

@@ -253,9 +253,11 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     if(e.drag.intersectStart){//如果拖拽着点云 
                         let ifInit = e.drag.z == void 0
                         let pointerStartPos2d = e.drag.intersectStart.location.clone().project(camera);//识别到的点云点的位置
-                            e.drag.z = pointerStartPos2d.z //记录z,保持拖拽物体到屏幕距离不变,所以z深度不变(如果拖拽过程中没有缩放,这个z其实不变)
+                        e.drag.z = pointerStartPos2d.z //记录z,保持拖拽物体到屏幕距离不变,所以z深度不变(如果拖拽过程中没有缩放,这个z其实不变)
                         
                         if(ifInit){//拖拽开始 
+                        
+                        
                             e.drag.projectionMatrixInverse = camera.projectionMatrixInverse.clone()
                             //防止吸附到最近点上(因为鼠标所在位置并非识别到的点云点的位置,需要得到鼠标所在位置的3d坐标。)
                             let pointerStartPos2dReal = new THREE.Vector3(this.pointerDragStart.x,this.pointerDragStart.y, e.drag.z);
@@ -273,7 +275,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                         
                       
                         camera.projectionMatrixInverse = _projectionMatrixInverse
-                        this.translationWorldDelta.add(moveVec.negate())  //这里没法用add,原因未知,会跳动
+                        this.translationWorldDelta.copy(moveVec.negate())  //这里没法用add,原因未知,打开console时会跳动
                         //console.log('pan 1', this.translationWorldDelta.clone())   
                         
                          
@@ -784,7 +786,9 @@ export class FirstPersonControls extends THREE.EventDispatcher {
 
 			view.yaw = yaw;
 			view.pitch = pitch;
-            
+            if(this.yawDelta || this.pitchDelta){
+                view.cancelFlying('rotate')
+            }
 
             
             this.yawDelta = 0

+ 51 - 13
src/viewer/ExtendView.js

@@ -15,7 +15,7 @@ class ExtendView extends View {
 		 
         this.sid = sid++
         this.LookTransition = 'LookTransition'+this.sid
-        
+        this.FlyTransition = 'FlyTransition'+this.sid
 
 	}
     //add------
@@ -101,18 +101,24 @@ class ExtendView extends View {
         
         
 		this.position = this.position.add(t);
+        
+        
+        Potree.settings.displayMode != 'showPanos' && this.cancelFlying('pos')
+        
         this.restrictPos()
 	}
 
-	translateWorld (x, y, z) {
+	translateWorld (x, y, z) { 
 		super.translateWorld(x, y, z)
+        
+        Potree.settings.displayMode != 'showPanos' && this.cancelFlying('pos')
         this.restrictPos()
 	}
 
 
-    restrictPos(){//add
+    restrictPos(position){//add
         if(this.limitBound){
-            this.position.clamp(this.limitBound.min, this.limitBound.max)
+            (position || this.position).clamp(this.limitBound.min, this.limitBound.max)
         }
     }
 
@@ -150,14 +156,23 @@ class ExtendView extends View {
     
     
     
-    isFlying(){
-        return transitions.getById(this.LookTransition).length > 0 
+    isFlying(type='all'){
+        let a = transitions.getById(this.FlyTransition).length > 0
+        let b = transitions.getById(this.LookTransition).length > 0 
+       
+        return type == 'pos' ? a : type == 'rotate' ? b :  a && b
     }
     
-    cancelFlying(){//外界只能通过这个来cancel
-        transitions.cancelById(this.LookTransition, true ); 
+    cancelFlying(type='all'){//外界只能通过这个来cancel
+        type == 'pos' ? transitions.cancelById(this.FlyTransition, true )
+         : type == 'rotate' ? transitions.cancelById(this.LookTransition, true )    
+         : (transitions.cancelById(this.FlyTransition, true ), transitions.cancelById(this.LookTransition, true ))
+        
     }
     
+    
+    
+    
     setView( info = {}){
         // position, target, duration = 0, callback = null, onUpdate = null, Easing='', cancelFun
         this.cancelFlying()
@@ -185,7 +200,7 @@ class ExtendView extends View {
         let endPosition = new THREE.Vector3().copy(info.position)
         let startPosition = this.position.clone();
 		let startQuaternion, endQuaternion, endTarget = null ;
-         
+        this.restrictPos(endPosition)
         
 		if(info.target ){
 			endTarget = new THREE.Vector3().copy(info.target)  
@@ -210,8 +225,31 @@ class ExtendView extends View {
             done()
             
 		}else{
-
-            transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
+             
+            if(!this.position.equals(endPosition)){
+                transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
+                    
+                    info.onUpdate && info.onUpdate(t) 
+                    
+                }), info.duration, done, 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine /*easeInOutQuad */,null, this.FlyTransition, info.cancelFun); 
+                 
+            } 
+            
+            
+            endQuaternion && transitions.start( (progress)=>{
+                
+                let quaternion = (new THREE.Quaternion()).copy(startQuaternion) 
+                lerp.quaternion(quaternion, endQuaternion)(progress),
+                this.rotation = new THREE.Euler().setFromQuaternion(quaternion)
+                
+                posChange || info.onUpdate && info.onUpdate(t) 
+                
+            }, info.duration, posChange?done:null, 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine ,null, this.LookTransition, info.cancelFun); 
+                   
+         
+            
+            
+           /*  transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
 				let t = progress 
  
                 if(endQuaternion){  
@@ -223,8 +261,8 @@ class ExtendView extends View {
                 //console.log('setView flying')             
  
                 info.onUpdate && info.onUpdate(t)//add
-            }), info.duration, done, 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine /*easeInOutQuad */,null, this.LookTransition, info.cancelFun); 
-
+            }), info.duration, done, 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine  ,null, this.LookTransition, info.cancelFun); //easeInOutQuad
+            */
 
         }