xzw 1 year ago
parent
commit
1c01cf4976

+ 2 - 1
src/custom/modules/panos/Images360.js

@@ -1409,12 +1409,13 @@ export class Images360 extends THREE.EventDispatcher{
                     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] })//飞最近的一个点云
+                    viewer.flyToDataset({focusOnPoint:true, pointcloud:clouds[0], duration:500 })//飞最近的一个点云
                     return deferred.promise();
                 }
                  
                 this.flyToPano({
                     pano: this.findNearestPano(),
+                    duration:500,
                     callback: deferred.resolve.bind(deferred, !0)
                 });
                 return deferred.promise();

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

@@ -178,13 +178,13 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
                 this.update(e.intersect && e.intersect.location)
             }else{
                 Potree.Utils.updateVisible(this,"atViewport", false) //小地图不显示
-            } 
+            }  
             
         }
         
         viewer.addEventListener('global_mousemove', updateVisi)
         viewer.addEventListener('global_touchstart', updateVisi)
-        
+        viewer.addEventListener('updateMagnifier', updateVisi)
         
         /* viewer.addEventListener("beginSplitView",()=>{
             this.updateVisible("splitView", false) 

+ 5 - 4
src/custom/objects/TextSprite.js

@@ -115,13 +115,13 @@ export class TextSprite extends THREE.Object3D{
         //canvas原点在左上角
         context.textBaseline = 'alphabetic' //  "middle"  //设置文字基线。当起点y设置为0时,只有该线以下的部分被绘制出来。middle时文字显示一半(但是对该字体所有字的一半,有的字是不一定显示一半的,尤其汉字),alphabetic时是英文字母的那条基线。
         
-        let actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent; // 当前文本字符串在这个字体下用的实际高度
+        //let actualHeight = metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent; // 当前文本字符串在这个字体下用的实际高度
         
         //文字y向距离从textBaseline向上算
-        let y = metrics.actualBoundingBoxAscent + margin.y + expand 
+        let actualBoundingBoxAscent = metrics.actualBoundingBoxAscent == void 0 ? this.fontsize * 0.8 : metrics.actualBoundingBoxAscent //有的流览器没有。只能大概给一个
+        let y = actualBoundingBoxAscent + margin.y + expand 
         //console.log(this.text, 'y' , y, 'actualBoundingBoxAscent', metrics.actualBoundingBoxAscent,'expand',expand )
-        
-                                                  
+                                  
         // border color
         context.strokeStyle = 'rgba(' + this.borderColor.r + ',' + this.borderColor.g + ',' +
             this.borderColor.b + ',' + this.borderColor.a + ')';
@@ -144,6 +144,7 @@ export class TextSprite extends THREE.Object3D{
 		context.fillStyle = 'rgba(' + this.textColor.r + ',' + this.textColor.g + ',' +
 			this.textColor.b + ',' + this.textColor.a + ')';
 		context.fillText(this.text , this.rectBorderThick + margin.x,  y/* spriteHeight/2  + diff */ );//x,y
+ 
 
 		let texture = new THREE.Texture(canvas);
 		texture.minFilter = THREE.LinearFilter;

+ 41 - 40
src/custom/start.js

@@ -132,47 +132,48 @@ export function start(dom, mapDom, number ){ //t-Zvd3w0m
                         viewer.fixCamFar = true //不允许修改camera.far
                           
                         //等有点云加载出来后,再去focus其中一个,使camera.far不超过最大值
-                        
-                        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)
-                                
+                        let count_ = 0;
+                        let done = ()=>{
+                            viewer.fixCamFar = false
+                            viewer.mainViewport.camera.far = Potree.settings.cameraFar; 
+                            viewer.mainViewport.camera.updateProjectionMatrix() 
+                            viewer.removeEventListener('pageVisible', focusPoint )
+                        }
+                        let focusPoint = (e)=>{//拉近到某个点
+                            if(e && e.v === false)return
+                            viewer.removeEventListener('pageVisible', focusPoint )
+                       
+                            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', focusPoint )
+                                    }
+                                    count_ ++ //如果在别的
+                                    setTimeout(focusPoint, 200) 
+                                }else{ //放弃
+                                    console.log('初始加载focus点云 放弃')
+                                    done()
+                                }    
+                                return console.warn('no!!!!!!!!!!!!!!')
+                            }  
+                            viewer.flyToDataset({focusOnPoint:true, pointcloud, duration:0, })
                             
-                        },{once:true})
+                            console.warn('ok!!!!!!!!!!!!!!!!')
+                            done()
+                        } 
+                        let focus = ()=>{ 
+                            setTimeout(focusPoint, 300) 
+                        }
+                        viewer.addEventListener('setPose',()=>{//设置了初始画面
+                            viewer.removeEventListener('pointcloud_changed',focus)
+                            done()
+                        })                            
+                        viewer.addEventListener('pointcloud_changed',focus,{once:true})//加载了点之后
                         
                         
                         

+ 1 - 0
src/custom/utils/SplitScreen.js

@@ -62,6 +62,7 @@ class SplitScreen extends THREE.EventDispatcher{
     
     unSplit(){
         this.unfocusViewport()
+        viewer.inputHandler.hoverViewport = null //清空
         viewer.viewports = [viewer.mainViewport] 
         viewer.mainViewport.width = 1;
         viewer.mainViewport.height = 1;

+ 7 - 6
src/custom/viewer/ViewerNew.js

@@ -710,7 +710,7 @@ export class Viewer extends ViewerBase{
                 
                 
             })
-            
+             
         }) 
         
          
@@ -803,7 +803,7 @@ export class Viewer extends ViewerBase{
             let interval 
             document.addEventListener('visibilitychange',(e)=>{ 
                 let v = !document.hidden
-                console.warn('visibilitychange', v )
+                //console.warn('visibilitychange', v )
                 this.dispatchEvent({type:'pageVisible', v } )
                 
                 if(this.screenshoting && !v){//截图过程中离开页面需要照常loop。但是尽量别离开页面,效果只能达到90%
@@ -963,7 +963,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 }  ) 
+                    ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d, margin:Potree.config.shelterMargin, useDepthTex:true, pano, viewport:this.mainViewport , viewport:this.mainViewport}  ) 
                     history.panos[panoId] = ifShelter
                     this.shelterCount.byTex ++ ;
                     //console.log('computeByTex direct', panoId, pos3d, ifShelter)
@@ -1033,7 +1033,7 @@ export class Viewer extends ViewerBase{
                              if(byTex >= maxTexCount)break
                              
                              byTex ++
-                             let ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d:history.pos3d, margin:Potree.config.shelterMargin, useDepthTex:true }  ) 
+                             let ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d:history.pos3d, margin:Potree.config.shelterMargin, useDepthTex:true, viewport:this.mainViewport }  ) 
                              history.panos[this.images360.currentPano.id] = ifShelter 
                              history.ifShelter = ifShelter
                              delete history.waitCompute  
@@ -1083,7 +1083,7 @@ export class Viewer extends ViewerBase{
                 result.list.forEach(e=>{
                     let history = waitCloud2.find(a=>a.pos3d.equals(e))
                      
-                    let ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d:history.pos3d, margin: Potree.config.shelterMargin , pickWindowSize:3}  ) 
+                    let ifShelter = !!viewer.inputHandler.ifBlockedByIntersect({pos3d:history.pos3d, margin: Potree.config.shelterMargin , pickWindowSize:3, viewport:this.mainViewport}  ) 
                     
                     if(history.waitCompute.cameraPos){
                         history.notAtPano = {cameraPos: history.waitCompute.cameraPos , ifShelter }
@@ -1230,11 +1230,12 @@ export class Viewer extends ViewerBase{
             //this.updatePanosVisibles(currentFloor/* , pointclouds */)
         }else{ 
             let pointclouds = currentFloor ? this.findPointcloudsAtFloor(currentFloor) : []
-            
+             
             if(pointclouds.length == 0){//如果当前不在任何楼层或楼层中无数据集,就用当前所在数据集
                 pointclouds = this.atDatasets
             }
              
+             
             this.updateCadVisibles(pointclouds)
             //this.updatePanosVisibles(currentFloor/* , pointclouds */)
         }

+ 5 - 5
src/navigation/FirstPersonControlsNew.js

@@ -48,7 +48,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
             
             //SHIFT : [16],
             ALT : [18],
-
+            SPACE:[32],
 
             Rotate_LEFT : ['L'.charCodeAt(0)],
             Rotate_RIGHT :    ['J'.charCodeAt(0)],
@@ -395,7 +395,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                 this.translationWorldDelta.add(moveVec.negate()) 
                 this.useAttenuation = false
             }else{
-                let speed = this.currentViewport.getMoveSpeed() * 15, direction
+                let speed = this.currentViewport.getMoveSpeed() * 7, direction
                  
                 
                 if(e.delta != void 0){//滚轮缩放 
@@ -437,7 +437,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     }else{  
                         
                         this.useAttenuation = true
-                        let accelerate = 80;
+                        let accelerate = 40;
                         if(math.closeTo(e.scale,1,0.02)){//缩放小的时候很可能是双指平移时,容易抖动,所以降低移动速度
                             accelerate *= Math.min(40*Math.abs(e.scale-1), 0.8)             
                         }
@@ -603,7 +603,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
                     speed = dis <= minDis ? minSpeed : minSpeed + (dis-minDis) * multiplier
                     //console.log('dis', dis, 'speed', speed,  pano.id )
                 }  
-                viewer.setMoveSpeed(speed)
+                viewer.setMoveSpeed(speed*2)
                 
             }
             //调试场景t-FhDWmV5xur 两个数据集,大的数据集没有漫游点。
@@ -753,7 +753,7 @@ export class FirstPersonControls extends THREE.EventDispatcher {
 			let rotateDown = this.keys.Rotate_DOWN.some(e => ih.pressedKeys[e]);
 
             
-            this.lockElevation = this.lockElevationOri || this.keys.ALT.some(e => ih.pressedKeys[e]);
+            this.lockElevation = this.lockElevationOri || this.keys.SPACE.some(e => ih.pressedKeys[e]);
             
             
             

+ 3 - 3
src/navigation/InputHandlerNew.js

@@ -81,7 +81,7 @@ export class InputHandler extends THREE.EventDispatcher {
         
 		//this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this));  //因为双击时间间隔是跟随系统的所以不好判断
 		
-        this.domElement.addEventListener('keydown', this.onKeyDown.bind(this));
+        window.addEventListener('keydown', this.onKeyDown.bind(this));//原先是this.domElement,这样的话一开始要点击屏幕后才能监听到
 		window.addEventListener('keyup', this.onKeyUp.bind(this));
          
         
@@ -778,8 +778,8 @@ export class InputHandler extends THREE.EventDispatcher {
     }
 
 
-    ifBlockedByIntersect({pos3d, margin=0, cameraPos, pickWindowSize, pano, useDepthTex}={}){//某点是否被遮挡(不允许camera修改位置, 因为depthTex不好置换)
-        let viewport = this.hoverViewport || viewer.mainViewport
+    ifBlockedByIntersect({pos3d, margin=0, cameraPos, pickWindowSize, pano, useDepthTex, viewport}={}){//某点是否被遮挡(不允许camera修改位置, 因为depthTex不好置换)
+        viewport = viewport || this.hoverViewport || viewer.mainViewport
         let intersect = this.getIntersect(viewport, true, pickWindowSize, null, null, useDepthTex, {pos3d, cameraPos, pano})
         let cameraPos_ = (!cameraPos && pano) ? pano.position : (cameraPos||viewport.view.position)
         if(intersect && intersect.distance+margin <= pos3d.distanceTo(cameraPos_)){