瀏覽代碼

tile偏移

xzw 3 年之前
父節點
當前提交
12461843ea

+ 5 - 20
note笔记笔记笔记.txt

@@ -70,6 +70,8 @@ setView 旋转改成4dkk那种
 是否可以监听到场景的变化,变化了才渲染。要监听所有材质变化、object改变。
 
 moveSpeed 、 地图的自适应缩放
+
+数据集校准最好能显示现在位移和旋转距离上次修改的总量
 ---------
 Bug	|
 ---------
@@ -201,26 +203,6 @@ click是否要判断时间,如果按下到抬起时间过长不算click,navv
 
 
 	
-关于 丽篮电脑和我的手机t-FhDWmV5xur场景在海拔模式下 某个漫游点刚进入场景全景图有一面(立方体中的一面)亮度超高的bug:
-·只有带了token才会 或许是因为token占用了什么时间?
-	https://uat-laser.4dkankan.com/uat/index.html?m=t-FhDWmV5xur&lang=zh&token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxODgxOTI3MjIwOCIsInVzZXJOYW1lIjoiMTg4MTkyNzIyMDgiLCJpYXQiOjE2NDU3NTI0MzYsImp0aSI6IjYwYTJiYjlhLTIyN2MtNGVhMi1iNWFkLWZhODIwMDk3ZDU3MSJ9.mlUUeIyPVYLGqeLGuu_gZzkDwotpgb_704BNe2kPlPY#/
-	开头多了DevTools 无法加载来源映射:无法加载 webpack:///spug/spug_api/repos/29_1660_20220224180315/node_modules/mitt/dist/mitt.mjs.map 的内容:HTTP 错误:状态代码 404,net::ERR_UNKNOWN_URL_SCHEME 等打印
-·发现此场景的部分漫游点的id和originID不一致。 且原4dkk场景漫游点id从0-24(但少一个18), 而此激光场景缺少了originId为0 的点。	
-对应: 
-	id     originID
-	 0  --  19  (多了一个19,正确应该是0。故而贴图错误)
- 	18  --  19  (对的)
- 	19  --  20
- 	20  --  21
- 	21  --  22
- 	22  --  23
- 	23  --  24
-刷新id又正常了???
-手机上看不发白了(电量原因吗) 手动改data[0].file_id = '00019' 也不发白
-手机加了test就可以,不加就会有问题。 
-我发现和海拔没有关系,只和透明度有关系。只要透明度不是1,刷新就会这样(所以之前的海拔是错误信息,为什么我没自己验证一下呜呜)
-
-
 
 
 
@@ -251,4 +233,7 @@ click是否要判断时间,如果按下到抬起时间过长不算click,navv
 
 为什么pano的label被marker遮住
  
+
+
+截图的测量线marker为何有大有小
  

+ 4 - 4
src/modules/Images360/tile/TileDownloader.js

@@ -408,7 +408,7 @@ TileDownloader.prototype.getTileUrl = function() {
                     d = 'tiles/4k/' + id + '_skybox' + h + '.jpg?x-oss-process=image/crop,w_512,h_512,';
                 }
                 //起始位置
-                /* if (t.tileX == 0) {
+                if (t.tileX == 0) {
                     d += 'x_0,';
                 } else {
                     d += 'x_' + (512 * t.tileX - 1) + ',';
@@ -418,8 +418,8 @@ TileDownloader.prototype.getTileUrl = function() {
                     d += 'y_0';
                 } else {
                     d += 'y_' + (512 * t.tileY - 1);
-                } */
-                
+                }
+                /* 
                 if (t.tileX == 0) {
                     d += 'x_1,';
                 } else {
@@ -430,7 +430,7 @@ TileDownloader.prototype.getTileUrl = function() {
                     d += 'y_1';
                 } else {
                     d += 'y_' + (512 * t.tileY);
-                }
+                } */
                 
                 
                 

+ 87 - 21
src/navigation/Reticule.js

@@ -18,7 +18,7 @@ export default class Reticule extends THREE.Mesh{
             opacity: defaultOpacity,
             //depthWrite: !1,
         })) 
-        
+        this.name = 'reticule'
         this.defaultTex = defaultTex
         this.crosshairTex = texLoader.load(Potree.resourcePath+'/textures/reticule_cross_hair.png') 
         this.forbitTex = texLoader.load(Potree.resourcePath+'/textures/pic-forbid.png') 
@@ -31,6 +31,11 @@ export default class Reticule extends THREE.Mesh{
         this.direction = new THREE.Vector3;
         this.hidden = !0;
         this.mouseLastMoveTime = Date.now();
+        this.hoverViewport;
+        this.matrixMap = new Map 
+        this.matrixAutoUpdate = false 
+        
+
 
 
         //viewer.inputHandler.addInputListener(this);
@@ -38,6 +43,9 @@ export default class Reticule extends THREE.Mesh{
         //viewer.addEventListener('global_click',this.move.bind(this))
         viewer.addEventListener('global_mousedown',this.move.bind(this))//主要针对触屏
         
+        
+        
+        
         this.state = {}
         
         viewer.addEventListener('measureMovePoint',()=>{
@@ -86,8 +94,8 @@ export default class Reticule extends THREE.Mesh{
         if(e.type == "global_mousemove" && (e.isTouch || e.buttons != Buttons.NONE) && this.state != 'crosshair')
             return//按下时不更新,除非拖拽测量
     
+       
         
-        this.hidden = false 
         this.mouseLastMoveTime = Date.now()
         
         this.updatePosition(e.intersectPoint, e.hoverViewport)
@@ -95,7 +103,7 @@ export default class Reticule extends THREE.Mesh{
     }
 
     hide(){
-        //console.log("hide Reticule")
+         
         this.hidden || (this.hidden = !0,
         transitions.start(lerp.property(this.material , "opacity", 0), 500))
         this.dispatchEvent({type:'update', visible:false})
@@ -115,42 +123,100 @@ export default class Reticule extends THREE.Mesh{
     updateVisible(){
         Date.now() - this.mouseLastMoveTime > 1500 && !this.hidden && this.hide()
     }
+    
+    
+    updateScale(viewport){
+        let s, camera = viewport.camera
+        if(camera.type == "OrthographicCamera"){
+            s = math.getScaleForConstantSize({width2d:400, position:this.position, camera, resolution:viewport.resolution/* 2 */} )
+            
+        }else{
+            
+            let n = camera.position.distanceTo(this.position)
+            s = 1 + .01 * n;
+            n < 1 && (s -= 1 - n)
+        }
+        this.scale.set(s, s, s);
+        
+    }
+
+    updateAtViewports(viewport){//当多个viewports时更新。更新大小等
+    
+        if(viewport.name == 'magnifier' )return
+    
+        if(this.hoverViewport && this.hoverViewport.name == 'mapViewport' && viewport != this.hoverViewport){
+            //若是在地图上更新,在其他viewport要隐藏。因为在地图上无法得知高度。     
+            viewer.updateVisible(this, 'hoverMap', false)
+            return; 
+        }
+        viewer.updateVisible(this, 'hoverMap', true)   
+    
+        var matrix = this.matrixMap.get(viewport)
+        if(!matrix){ 
+            this.updateScale(viewport)
+            this.updateMatrix(); 
+            this.matrixMap.set(viewport, this.matrix.clone())
+        }else{
+            this.matrix.copy(matrix) 
+        }
+        
+    }
+   
+    
+    
+
+    
 
     updatePosition(intersectPoint, viewport ){ //在地图(当地图融合到viewer时)和场景里都显示且完全相同(大小可能不同)
-        if (!this.hidden && this.visible) {
+        if (viewer.getObjVisiByReason(this, 'force')) {//没有被强制隐藏,如进入某个页面后强制不显示
             if (!intersectPoint /* || !intersectPoint.point.normal */)
                 return //this.hide();
             var atMap = !intersectPoint.location
-            let normal
+            let location = intersectPoint.location || intersectPoint.orthoIntersect.clone()
+            let normal  
+            
             if(atMap){ 
                 normal =  new THREE.Vector3(0,0,1)//地图无normal
+                location.setZ(0);//低于相机高度即可
+               
             }else{
                 normal = new THREE.Vector3().fromArray(intersectPoint.point.normal ).applyMatrix4(intersectPoint.pointcloud.transformMatrix);
-            }
-             
-            let s, camera
-            let location = intersectPoint.location || intersectPoint.orthoIntersect.clone()
                 
-            if(!atMap){
-                camera = viewport.camera
-                let n = camera.position.distanceTo(location)
-                s = 1 + .01 * n;
-                n < 1 && (s -= 1 - n)
-            }else{
-                camera = viewer.mapViewer.camera
-                s = math.getScaleForConstantSize({width2d:400, position:location, camera, resolution:viewport.resolution/* 2 */} )
-                location.setZ(0);//低于相机高度即可
             }
+             
             
-            
-            
+             
             this.show();
-            this.scale.set(s, s, s);
+            
             this.direction = this.direction.multiplyScalar(.8); 
             this.direction.add(normal.clone().multiplyScalar(.2));
             this.position.copy(location).add(normal.clone().multiplyScalar(.01));
             this.lookAt(this.position.clone().add(this.direction));
+            
+            
+            this.hoverViewport = viewport //记录下最近一次hover过的viewport  
+            this.updateScale(viewport)
+            
+            
+            {//存储matrix,节省计算
+                this.updateMatrix(); 
+                this.matrixMap.clear();//重新计算
+                this.matrixMap.set(viewport, this.matrix.clone())
+                //别处会updateMatrixWorld
+            }
+            
             this.dispatchEvent({type:'update'})
+            
+            //为什么navvis在校准数据集时每个viewport里reticule的朝向都刚好垂直于屏幕,似乎限定在了一定范围内,还是在pick时就只pick范围内的点?
+            
+            
         }
     }
+    
+    //navvis在地图等地方看reticule是有厚度的
+    
+    /* updateMatrixWorld(force){
+        console.log('updateMatrixWorld', force)
+        super.updateMatrixWorld(force) 
+    } */
 }

+ 7 - 1
src/utils/Measure.js

@@ -99,7 +99,13 @@ export class Measure extends ctrlPolygon{
         
         this.addEventListener('marker_dropped',(e)=>{ 
             this.updateDatasetBelong()
-        })  
+        }) 
+
+  
+        this.addEventListener('isVisible', ()=>{
+            viewer.mapViewer.dispatchEvent({type:'content_changed'})
+        })
+         
 	}
  
  

+ 3 - 2
src/utils/SplitScreen.js

@@ -94,13 +94,14 @@ var SplitScreen = {
                     e.material.activeAttributeName = SplitScreen.statesBefore.mat.colorType 
                     //e.material.color = SplitScreen.statesBefore.mat.color
                     e.material.useFilterByNormal = false
-                    e.material.opacity = SplitScreen.statesBefore.mat.opacity 
+                    //e.material.opacity = SplitScreen.statesBefore.mat.opacity 
                     Potree.settings.pointDensity = 'fourViewports' //本来想比另外三屏高一点质量,结果发现会闪烁,因为点云加载需要时间 (navvis仿版也是一样,以后看看能否优化)
                 }else{ 
                     e.material.activeAttributeName = "color"
                     //e.material.color = e.color
                     e.material.useFilterByNormal = true
-                    e.material.opacity =  /* THREE.Math.clamp( */e.material.spacing /* , 0.01,100); */   //0.09 //越稀疏给的opacity应该越高,支持超过1(隧道场景  spacing达9之多) 
+                    //e.material.opacity =  e.material.spacing    //0.09 //越稀疏给的opacity应该越高,支持超过1(隧道场景  spacing达9之多) 暂时去掉是因为opacity已经在别处算好了
+                    
                     Potree.settings.pointDensity = 'fourViewports' //强制降低点云质量
                 }                 
             })  

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

@@ -61,7 +61,7 @@ export class MapViewer extends ViewerBase{
          
         //viewer.addEventListener("global_mousemove", this.updateWhenAtViewer.bind(this))  //鼠标移动时reticule也动,所以直接就needRender
         viewer.reticule.addEventListener('update',(e)=>{
-            this.needRender = true
+            this.needRender = true 
         })
          
         
@@ -553,7 +553,7 @@ export class MapViewer extends ViewerBase{
         renderer.render(viewer.scene.scene, this.camera);
         //测量线
         //if(this.renderMeasure)viewer.dispatchEvent({type: "render.pass.perspective_overlay", viewer: viewer, camera:this.camera});
-        params.renderOverlay && params.renderOverlay({camera:this.camera, isMap:true })//其余如reticule 等场景层
+        params.renderOverlay && params.renderOverlay({camera:this.camera, isMap:true, viewport: this.viewports[0] })//其余如reticule 等场景层
         
         
         

+ 19 - 8
src/viewer/viewer.js

@@ -2448,6 +2448,7 @@ export class Viewer extends ViewerBase{
         
         viewports.forEach(view=>{
             let params = $.extend({},params_);
+            params.viewport = view
             //if(!params.target){
                 params.camera = params.camera || view.camera;
                 params.extraEnableLayers = view.extraEnableLayers
@@ -2558,7 +2559,7 @@ export class Viewer extends ViewerBase{
         
         let camera = params.camera ? params.camera : this.scene.getActiveCamera();
         
-        
+        this.reticule.updateAtViewports(params.viewport)
         
         
          //为什么要在点云之后渲染,否则透明失效 、 会被点云覆盖 
@@ -2631,7 +2632,12 @@ export class Viewer extends ViewerBase{
      
     updateVisible(object, reason, ifShow){//当所有加入的条件都不为false时才显示. reason='force'一般是强制、临时的
         if(!object.unvisibleReasons) object.unvisibleReasons = []; //如果length>0代表不可见
-           
+        /* let mapChange = ()=>{//还是算了,有时候可见性的改变 在mapViewer和mainViewer中交替,如reticule,就会频繁
+            var layers = ['measure','map','mapObjects','bothMapAndScene'] 
+            if(layers.some(e=> object.layers && (object.layers.mask == Potree.config.renderLayers[e])  )) { 
+                this.mapViewer.dispatchEvent({type:'content_changed'})
+            }
+        } */
         
         if(ifShow){
             var index = object.unvisibleReasons.indexOf(reason) 
@@ -2639,6 +2645,7 @@ export class Viewer extends ViewerBase{
                 object.unvisibleReasons.splice(index, 1);
                 if(object.unvisibleReasons.length == 0){
                     object.visible = true;
+                    //mapChange()
                     object.dispatchEvent({
                         type: 'isVisible',
                         visible:true, 
@@ -2650,12 +2657,16 @@ export class Viewer extends ViewerBase{
         }else{
             var visiBefore = object.visible
             if(!object.unvisibleReasons.includes(reason)) object.unvisibleReasons.push(reason)
-            object.visible = false    
-            visiBefore && object.dispatchEvent({
-                type: 'isVisible',
-                visible:false,
-                reason,
-            }) 
+            object.visible = false 
+            if(visiBefore) { 
+                //mapChange()        
+                object.dispatchEvent({
+                    type: 'isVisible',
+                    visible:false,
+                    reason,
+                }) 
+            }            
+            
         }
         
     }