xzw hace 3 años
padre
commit
d4b51887d1

+ 65 - 7
note笔记笔记笔记.txt

@@ -72,6 +72,12 @@ setView 旋转改成4dkk那种
 moveSpeed 、 地图的自适应缩放
 
 数据集校准最好能显示现在位移和旋转距离上次修改的总量
+
+手机的测量线marker太小很难拖拽
+点击测量线后,或执行了setView后,如果再次移动镜头或再次setView,要取消之前的setView
+
+刚开始加载高质量点云可以在rendertarget内
+
 ---------
 Bug	|
 ---------
@@ -210,30 +216,82 @@ click是否要判断时间,如果按下到抬起时间过长不算click,navv
 
 
 
+
+ 
+
+
+
+
+
+
+
+为什么pano的label被marker遮住
+ 
+
+
+截图的测量线marker为何有大有小
+
+初始画面https://uat-laser.4dkankan.com/uat/index.html?m=t-e2Kb2iU#/coordinate
+
+ 
+
+
+触屏放大后测量很卡。
+
+
+
+
+
+
+
+
+地理位置修改了的话,没有绑定到数据集上的测量线怎么办? 要不还是默认放第一个数据集?
+
+
+
+map加updateTime
+
+
+
+
+
+全景图时放大镜里的点云稀疏了
+
+手机里测量线没marker
+
+
+
  
 有时候加载全景图一直loading。 
 
 ·六张512的有一张未打印出加载成功(但实际在网络里查看是加载了的,tileDownloader也有值),然后就去加载更高分辨率去了,没发送成功。
 ·没通知成功的原因是uploadTile那张512时已经加载好了子集1024,就跳过了。
-·原来是预加载的dir写错了。但是只是预加载的话大概率不会发生此bug而已。这依旧是个漏洞。
+·原来是预加载的dir写错了。但是只是预加载的话大概率不会发生此bug而已。
+·但万一先关闭了全景,在一个没有预加载的点位上打开全景,就可能发生bug
 
 
  试试1024加载 {basePanoSize:1024}
 
 
 
+有时候转为全景模式还是加载不出,明明加载好了
 
- 
-
-
+初始画面还是会转一下 t-1aw99jhDgB#/setup  但为何只是有时候?
 
 
 
 
 
-为什么pano的label被marker遮住
+触屏放大镜里的点云为何那么大???
+·只要一转为触屏就这样  pointsize和什么有关,会重新计算吗
+·自适应时的触屏devicePixelRatio是2!!
+·shader中计算pointsize时最关键的参数是uScreenHeight。由于我在渲染屏幕点云时乘了devicePixelRatio,所以无论devicePixelRatio多少看起来都一样大;但是放大镜也被乘了devicePixelRatio,所以放大了。它的devicePixelRatio应该永远为1
+·考虑修改uScreenHeight为resolution2.y , 并取消乘以devicePixelRatio
  
 
+低质量点云测量怎么点不上?
+·e.intersectPoint 居然没有
+·好像是因为改了shader后resolution没赋值,都是0,而电脑会给一个最小pointsize,手机可能更小吧? 所以pick不出。赋值就ok了
 
-截图的测量线marker为何有大有小
- 
+
+  

+ 13 - 9
src/PointCloudOctree.js

@@ -155,6 +155,7 @@ export class PointCloudOctree extends PointCloudTree {
         this.rotateMatrix = new THREE.Matrix4;
         this.transformMatrix = new THREE.Matrix4;// 数据集的变化矩阵
         this.transformInvMatrix = new THREE.Matrix4; 
+        this.rotateInvMatrix = new THREE.Matrix4; 
         this.material.spacing = this.pcoGeometry.spacing;//初始化一下 以便于设置pointsize
         
 		{
@@ -955,10 +956,13 @@ export class PointCloudOctree extends PointCloudTree {
 		} 
 	}
 
-	updateMaterial (material, visibleNodes, camera, renderer) {
+	updateMaterial (material, visibleNodes, camera, renderer, resolution) {
 		material.fov = camera.fov * (Math.PI / 180);
-		material.screenWidth = renderer.domElement.clientWidth;
-		material.screenHeight = renderer.domElement.clientHeight;
+		/* material.screenWidth = renderer.domElement.clientWidth;
+		material.screenHeight = renderer.domElement.clientHeight; */
+        material.resolution = resolution
+        
+        
 		//material.spacing = this.pcoGeometry.spacing; // * Math.max(this.scale.x, this.scale.y, this.scale.z);  //应该不需要
 		material.near = camera.near;
 		material.far = camera.far;
@@ -1463,10 +1467,10 @@ export class PointCloudOctree extends PointCloudTree {
 				pickMaterial.clipBoxes = [];
 			}
 
-			this.updateMaterial(pickMaterial, nodes, camera, renderer);
+			this.updateMaterial(pickMaterial, nodes, camera, renderer, new THREE.Vector2(width, height));
 		}
 
-		pickState.renderTarget.setSize(width, height);
+		pickState.renderTarget.setSize(width, height); //仅绘制屏幕大小的,而不乘以devicePixelRatio
 
 		let pixelPos = new THREE.Vector2(params.x, params.y);
 
@@ -1489,7 +1493,7 @@ export class PointCloudOctree extends PointCloudTree {
 
 			let tmp = this.material;
 			this.material = pickMaterial;
-
+            
 			pRenderer.renderOctree(this, nodes, camera, pickState.renderTarget);
 
 			this.material = tmp;
@@ -1802,18 +1806,18 @@ export class PointCloudOctree extends PointCloudTree {
             let base = this.material.spacing / Math.pow(2, this.maxLevel) //点云大小在level为0时设置为spacing,每长一级,大小就除以2
             base *= this.nodeMaxLevel > 0 ? Math.max(0.1, Math.pow(this.maxLevel / this.nodeMaxLevel, 1.3)) : 0.1 //低质量的缩小点,因为视觉上看太大了。navvis是不铺满的,我们也留一点缝隙
 
-            this.material.size = base * 3 * num * window.devicePixelRatio
+            this.material.size = base * 3 * num/*  * window.devicePixelRatio */
             //在t-8BCqxQAr93 会议室 和 t-e2Kb2iU 隧道 两个场景里调节,因为它们的spacing相差较大,观察会议室墙壁的龟裂程度
             
             
         }else{
             let base = this.material.spacing / Math.pow(2, this.nodeMaxLevel) //点云大小在level为0时设置为spacing,每长一级,大小就除以2
             
-            this.material.size = base * 4 * num * window.devicePixelRatio 
+            this.material.size = base * 4 * num /* * window.devicePixelRatio  */
         }
         
         
-        //console.log('changePointSize  '  + this.dataset_id + '  , num : ' + num + ' , size : ' + this.material.size, this.material.spacing)
+        console.log('changePointSize  '  + this.dataset_id + '  , num : ' + num + ' , size : ' + this.material.size, this.material.spacing)
 
          
     }  

+ 3 - 2
src/PointCloudOctreeGeometry.js

@@ -93,7 +93,7 @@ export class PointCloudOctreeGeometryNode extends PointCloudTreeNode{
 		} else if (version.upTo('1.3')) {
 			url = this.pcoGeometry.octreeDir + '/' + this.name;
 		}
-
+       
 		return url;
 	}
 
@@ -224,7 +224,8 @@ export class PointCloudOctreeGeometryNode extends PointCloudTreeNode{
 		if ((node.level % node.pcoGeometry.hierarchyStepSize) === 0) {
 			// let hurl = node.pcoGeometry.octreeDir + "/../hierarchy/" + node.name + ".hrc";
 			let hurl = node.pcoGeometry.octreeDir + '/' + node.getHierarchyPath() + '/' + node.name + '.hrc';
-
+            hurl += '?m='+node.pcoGeometry.timeStamp //add
+            
 			let xhr = XHRFactory.createXMLHttpRequest();
 			xhr.open('GET', hurl, true);
 			xhr.responseType = 'arraybuffer';

+ 2 - 2
src/Potree.js

@@ -266,7 +266,7 @@ export function Log(value, color, fontSize){
 
  
 
-export function loadPointCloud(path, name, callback){
+export function loadPointCloud(path, name, timeStamp, callback){
 	let loaded = function(e){
 		e.pointcloud.name = name;
 		callback(e);
@@ -289,7 +289,7 @@ export function loadPointCloud(path, name, callback){
 				}
 			});
 		} else if (path.indexOf('cloud.js') > 0) {
-			POCLoader.load(path, function (geometry) {
+			POCLoader.load(path, timeStamp, function (geometry) {
 				if (!geometry) {
 					//callback({type: 'loading_failed'});
 					console.error(new Error(`failed to load point cloud from URL: ${path}`));

+ 6 - 2
src/PotreeRenderer.js

@@ -1265,11 +1265,15 @@ export class Renderer {
 			shader.setUniformMatrix4("uViewInv", viewInv);
 			shader.setUniformMatrix4("uProjInv", projInv);
 
-			let screenWidth = target ? target.width : material.screenWidth;
+			/* let screenWidth = target ? target.width : material.screenWidth;
 			let screenHeight = target ? target.height : material.screenHeight;
 
 			shader.setUniform1f("uScreenWidth", screenWidth);
-			shader.setUniform1f("uScreenHeight", screenHeight);
+			shader.setUniform1f("uScreenHeight", screenHeight); */
+            
+            shader.setUniform2f('resolution', material.resolution.toArray())
+            
+            
 			shader.setUniform1f("fov", Math.PI * camera.fov / 180);
 			shader.setUniform1f("near", camera.near);
 			shader.setUniform1f("far", camera.far);

+ 2 - 1
src/loader/BinaryLoader.js

@@ -31,7 +31,8 @@ export class BinaryLoader{
 		if (this.version.equalOrHigher('1.4')) {
 			url += '.bin';
 		}
-
+        url += '?m='+node.pcoGeometry.timeStamp //add
+        
 		let xhr = XHRFactory.createXMLHttpRequest();
 		xhr.open('GET', url, true);
 		xhr.responseType = 'arraybuffer';

+ 4 - 2
src/loader/POCLoader.js

@@ -185,12 +185,14 @@ function lasLazAttributes(fMno){
 
 export class POCLoader {
 
-	static load(url, callback){
+	static load(url, timeStamp, callback){ //add timeStamp
 		try {
 			let pco = new PointCloudOctreeGeometry();
+            pco.timeStamp = timeStamp
+            
 			pco.url = url;
 			let xhr = XHRFactory.createXMLHttpRequest();
-			xhr.open('GET', url, true);
+			xhr.open('GET', url+'?m='+timeStamp, true);  
 
 			xhr.onreadystatechange = function () {
 				if (xhr.readyState === 4 && (xhr.status === 200 || xhr.status === 0)) {

+ 3 - 2
src/materials/EyeDomeLightingMaterial.js

@@ -17,8 +17,9 @@ export class EyeDomeLightingMaterial extends THREE.RawShaderMaterial{
 		super();
 
 		let uniforms = {
-			screenWidth:    { type: 'f', 	value: 0 },
-			screenHeight:   { type: 'f', 	value: 0 },
+			/* screenWidth:    { type: 'f', 	value: 0 },
+			screenHeight:   { type: 'f', 	value: 0 }, */ 
+            resolution:    { type: 'v2',  value: new THREE.Vector2() },
 			edlStrength:    { type: 'f', 	value: 1.0 },
 			uNear:          { type: 'f', 	value: 1.0 },
 			uFar:           { type: 'f', 	value: 1.0 },

+ 18 - 6
src/materials/PointCloudMaterial.js

@@ -90,8 +90,9 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 			blendHardness:		{ type: "f", value: 2.0 },
 			blendDepthSupplement:	{ type: "f", value: 0.0 },
 			fov:				{ type: "f", value: 1.0 },
-			screenWidth:		{ type: "f", value: 1.0 },
-			screenHeight:		{ type: "f", value: 1.0 },
+			/* screenWidth:		{ type: "f", value: 1.0 },
+			screenHeight:		{ type: "f", value: 1.0 }, */
+            resolution:    { type: 'v2',  value: new THREE.Vector2() },
 			near:				{ type: "f", value: 0.1 },
 			far:				{ type: "f", value: 1.0 },
 			uColor:				{ type: "c", value: new THREE.Color( 0xffffff ) },
@@ -539,7 +540,7 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 		}
 	}
 
-	get screenWidth () {
+	/* get screenWidth () {
 		return this.uniforms.screenWidth.value;
 	}
 
@@ -548,7 +549,7 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 			this.uniforms.screenWidth.value = value;
 			// this.updateShaderSource();
 		}
-	}
+	} 
 
 	get screenHeight () {
 		return this.uniforms.screenHeight.value;
@@ -559,8 +560,19 @@ export class PointCloudMaterial extends THREE.RawShaderMaterial {
 			this.uniforms.screenHeight.value = value;
 			// this.updateShaderSource();
 		}
-	}
-
+	}*/
+    
+    //add--------------
+    get resolution(){
+        return this.uniforms.resolution.value
+    }
+    set resolution(value){
+        this.uniforms.resolution.value.copy(value);
+    }
+    //--------------
+    
+    
+    
 	get near () {
 		return this.uniforms.near.value;
 	}

+ 6 - 3
src/materials/shaders/edl.fs

@@ -9,8 +9,11 @@
 precision mediump float;
 precision mediump int;
 
-uniform float screenWidth;
-uniform float screenHeight;
+//uniform float screenWidth;
+//uniform float screenHeight;
+uniform vec2 resolution;
+
+
 uniform vec2 neighbours[NEIGHBOUR_COUNT];
 uniform float edlStrength;
 uniform float radius;
@@ -29,7 +32,7 @@ varying vec2 vUv;
 uniform int useEDL;
 
 float response(float depth){
-	vec2 uvRadius = radius / vec2(screenWidth, screenHeight);
+	vec2 uvRadius = radius / resolution;             //vec2(screenWidth, screenHeight);
 	
 	float sum = 0.0;
 	

+ 10 - 4
src/materials/shaders/pointcloud.vs

@@ -58,8 +58,11 @@ uniform mat4 projectionMatrix;
 uniform mat4 viewMatrix;
 uniform mat4 uViewInv;
 
-uniform float uScreenWidth;
-uniform float uScreenHeight;
+//uniform float uScreenWidth;
+//uniform float uScreenHeight;
+uniform vec2 resolution;
+
+
 uniform float fov;
 uniform float near;
 uniform float far;
@@ -714,7 +717,10 @@ float getPointSize(){
 	float pointSize = 1.0;
 	
 	float slope = tan(fov / 2.0);
-	float projFactor = -0.5 * uScreenHeight / (slope * vViewPosition.z);
+	float projFactor = -0.5 * resolution.y / (slope * vViewPosition.z);
+    
+    
+    
     /*
 	float scale = length(
 		modelViewMatrix * vec4(0, 0, 0, 1) - 
@@ -743,7 +749,7 @@ float getPointSize(){
 	#elif defined adaptive_point_size
 		if(uUseOrthographicCamera) {
 			float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();
-			pointSize = (worldSpaceSize / uOrthoWidth) * uScreenWidth;
+			pointSize = (worldSpaceSize / uOrthoWidth) * resolution2.x;    //uScreenWidth;
 		} else {
 			float worldSpaceSize = 1.0 * size * r / getPointSizeAttenuation();
 			pointSize = worldSpaceSize * projFactor;

+ 2 - 2
src/modules/Images360/Images360.js

@@ -221,7 +221,7 @@ export class Images360 extends EventDispatcher{
                 },
                 set:  (mode)=> {
                     latestRequestMode = mode
-                    console.log('Request setMode: ' + mode)  
+                    //console.log('Request setMode: ' + mode)  
                                    
                     if(mode != displayMode){
                         this.modeChanging = true //主要是因为到全景图不会立刻成功
@@ -1445,7 +1445,7 @@ export class Images360 extends EventDispatcher{
             
             this.highMapCube.visible = false; 
             viewer.setObjectLayers(this.highMapCube, 'sceneObjects'/* 'skybox' */) //如果是skybox层,点云可见时会被遮住,depthTest为false呢? 但不会遮住场景物体
-            console.warn('addHighMapCube')
+            //console.warn('addHighMapCube')
             
         }    
         

+ 5 - 5
src/modules/Images360/Panorama.js

@@ -216,12 +216,12 @@ class Panorama extends EventDispatcher{
     
     
     transformByPointcloud(){
-         
-        let position = this.originPosition.clone().applyMatrix4(this.pointcloud.transformMatrix);
+        
+        let position = this.originPosition.clone().applyMatrix4(this.pointcloud.transformMatrix);//也可以用datasetPosTransform算
         let floorPosition = this.originFloorPosition.clone().applyMatrix4(this.pointcloud.transformMatrix);
         this.setPosition(position, floorPosition) 
         this.panoMatrix = new THREE.Matrix4().multiplyMatrices(this.pointcloud.rotateMatrix, this.oriPanoMatrix  ) 
-    
+        //this.panoMatrix2 =  Potree.Utils.datasetRotTransform({fromDataset:true, pointcloud:this.pointcloud,  matrix:this.oriPanoMatrix, getMatrix:true}) //和上一行结果一样
         //quaternion也变下  
     }
     
@@ -464,7 +464,7 @@ Panorama.prototype.loadTiledPano = function() {
                     
                     this.addEventListener(PanoramaEvents.LoadComplete, function(ev/* e, t */) {//本次任务全部加载完毕 
                         
-                        //console.warn('点位下载完成 ', 'id:'+this.id,  'size:'+ev.size )
+                        console.warn('点位下载完成 ', 'id:'+this.id,  'size:'+ev.size )
                         
                         
                         var i = this.getWaitDeferred(ev.size).deferred;//"pending"为还未完成
@@ -480,7 +480,7 @@ Panorama.prototype.loadTiledPano = function() {
                     
                     this.addEventListener(PanoramaEvents.TileLoaded, function(ev/* t, i, n */) {//每张加载完时
                        
-                        //console.log('tileLoaded', 'id:'+this.id,  'size:'+ev.size, 'index:'+ev.index )
+                        console.log('tileLoaded', 'id:'+this.id,  'size:'+ev.size, 'index:'+ev.index )
                         
                         
                         var r = this.getWaitDeferred(ev.size).deferred;

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

@@ -895,10 +895,10 @@ PanoRenderer.prototype.uploadTile = function () {//重写
         
         if (p) {
              
-            /* if(failHistory[''+id+ panoSize+ tileIndex]){
+            if(failHistory[''+id+ panoSize+ tileIndex]){
                 console.log('uploadTile retry',id, panoSize, tileIndex)
             } 
-            console.log('uploadTile 成功', id, panoSize, tileIndex) */
+            console.log('uploadTile 成功', id, panoSize, tileIndex) 
 
             var C = tileX * tileSize,
                 I = tileY * tileSize,
@@ -935,8 +935,8 @@ PanoRenderer.prototype.uploadTile = function () {//重写
             this.setUploaded(info, !0);
             this.addCoverageForNode(info.node);
         } else {
-            /* console.log('uploadTile  失败', id, panoSize, tileIndex)
-            failHistory[''+id+ panoSize+ tileIndex] = true; */
+            console.log('uploadTile  失败', id, panoSize, tileIndex)
+            failHistory[''+id+ panoSize+ tileIndex] = true; 
             this.setUploaded(info, !1);
             
             //发现如果不预加载512,512很可能在1024加载了之后才加载,然后g = true,就不会发送TileRenderSuccess,导致该pano一直loading。但现在应该很难出现这种情况

+ 2 - 68
src/modules/Images360/tile/TileDownloader.js

@@ -61,7 +61,7 @@ class TileDownloader extends EventDispatcher{
 
     judgeStart(){//add
         if(this.visible){
-            console.log('judgeStart true')
+            //console.log('judgeStart true')
             this.started = true 
             this.refreshUpdateInterval(0)
         }else{
@@ -440,73 +440,7 @@ TileDownloader.prototype.getTileUrl = function() {
             g = "&" 
         } 
         
-         
-        
-        /* //8目
-        else if (metadata.sceneScheme == 11) {
-            //阿里云oss的规则 
-            d = 'tiles/2k/' + id + '_skybox' + h + '.jpg?x-oss-process=';
-            if (e[panoSize] == '512') {
-                d += 'image/resize,h_512';
-            } else {
-                //移动端是1k,pc端是2k
-                if (e[panoSize] == '1k' || e[panoSize] == '2k') {
-                    //https://4dkk.4dage.com/images/imagesx4iqYDG3/tiles/4k/122_skybox0.jpg?x-oss-process=image/resize,m_lfit,w_1024/crop,w_512,h_512,x_511,y_0
-                    d += 'image/resize,m_lfit,w_' + panoSize + '/crop,w_512,h_512,';
-                } else {
-                    d = 'tiles/2k/' + id + '_skybox' + h + '.jpg?x-oss-process=image/crop,w_512,h_512,';
-                }
-
-                if (t.tileX == 0) {
-                    d += 'x_0,';
-                } else {
-                    d += 'x_' + (512 * t.tileX - 1) + ',';
-                }
-
-                if (t.tileY == 0) {
-                    d += 'y_0';
-                } else {
-                    d += 'y_' + (512 * t.tileY - 1);
-                }
-            } 
-            d = this.getTiles(d, datasetName); 
-            g = "&" 
-        }
-        //双目,随心装等
-        else if (metadata.sceneScheme == 12) {
-            //阿里云oss的规则 
-            d = 'tiles/1k/' + id + '_skybox' + h + '.jpg?x-oss-process=';
-            if (e[panoSize] == '512') {
-                d += 'image/resize,h_512';
-            } else {
-                d = 'tiles/1k/' + id + '_skybox' + h + '.jpg?x-oss-process=image/crop,w_512,h_512,';
-                if (t.tileX == 0) {
-                    d += 'x_0,';
-                } else {
-                    d += 'x_' + (512 * t.tileX - 1) + ',';
-                }
-
-                if (t.tileY == 0) {
-                    d += 'y_0';
-                } else {
-                    d += 'y_' + (512 * t.tileY - 1);
-                }
-            } 
-            d = this.getTiles(d, datasetName); 
-            g = "&" 
-        }
-        else {//国际版 
-            //var d = this.getTiles("tiles/" + id + "/" + e[panoSize] + u + "_face" + h + "_" + t.tileX + "_" + t.tileY + ".jpg");
-            d = this.getTiles("tiles/" + id + "/" + e[panoSize]  + "_face" + h + "_" + t.tileX + "_" + t.tileY + ".jpg", datasetName);
-            //return d = ab.changeIfTileGenerating(d)
-            g = "?"  
-            
-        }
-          */
-          
-        /* if(typeof(this.store.getters['scene/metadata'].imagesVersion)!='undefined'){
-            d+= g +'imagesVersion='+this.store.getters['scene/metadata'].imagesVersion
-        }  */
+        d += g + 'time='+o.pano.pointcloud.timeStamp  //加后缀
          
         return d;
     }

+ 3 - 0
src/modules/datasetAlignment/Alignment.js

@@ -52,6 +52,9 @@ var Alignment = {
         pointcloud.transformMatrix = matrix.clone();//为该数据集的变化矩阵。 对应navvis的m2w_
         pointcloud.transformInvMatrix.copy(matrix).invert()
         pointcloud.rotateMatrix = rotMatrix
+        pointcloud.rotateInvMatrix.copy(rotMatrix).invert()
+        
+        
         pointcloud.panos.forEach(e=>e.transformByPointcloud())
         
         

+ 22 - 8
src/navigation/InputHandler.js

@@ -72,7 +72,13 @@ export class InputHandler extends EventDispatcher {
 		this.domElement.addEventListener('dblclick', this.onDoubleClick.bind(this)); 
 		
         this.domElement.addEventListener('keydown', this.onKeyDown.bind(this));
-		this.domElement.addEventListener('keyup', this.onKeyUp.bind(this));
+		window.addEventListener('keyup', this.onKeyUp.bind(this));
+        
+        //window.addEventListener('focus',()=>{
+        window.addEventListener('blur',this.onKeyUp.bind(this)); //add
+            
+          
+        
 		this.domElement.addEventListener('touchstart', this.onTouchStart.bind(this));
 		this.domElement.addEventListener('touchend', this.onTouchEnd.bind(this));
 		this.domElement.addEventListener('touchmove', this.onTouchMove.bind(this));
@@ -239,7 +245,7 @@ export class InputHandler extends EventDispatcher {
 
 		// DELETE
 		if (e.keyCode === KeyCodes.DELETE && this.selection.length > 0) {
-			this.dispatchEvent({
+			this.dispatchEvent({ 
 				type: 'delete',
 				selection: this.selection
 			});
@@ -268,8 +274,14 @@ export class InputHandler extends EventDispatcher {
 
 	onKeyUp (e) {
 		if (this.logMessages) console.log(this.constructor.name + ': onKeyUp');
-
-		delete this.pressedKeys[e.keyCode];
+           
+        if(e.keyCode != void 0){
+            delete this.pressedKeys[e.keyCode];
+        }else{
+            this.pressedKeys = {}
+        }
+           
+		
 
 		e.preventDefault();
 	}
@@ -484,10 +496,11 @@ export class InputHandler extends EventDispatcher {
         
         
 		if (this.drag) { 
-            //拖拽结束
+            //拖拽结束  
+            
 			if (this.drag.object/*  && e.button == THREE.MOUSE.LEFT */) {//add LEFT
 				if (this.logMessages) console.log(`${this.constructor.name}: drop ${this.drag.object.name}`);
-				
+				 
                 this.drag.object.dispatchEvent($.extend(  
 					this.getEventDesc(e,isTouch),
                     {
@@ -651,7 +664,8 @@ export class InputHandler extends EventDispatcher {
             this.viewer.scene.pointclouds,
             {pickClipped: true});
             
-          
+        
+        
         if(viewport.camera.type == 'OrthographicCamera'/*  == 'mapViewport' */){ 
             let pos3d = new THREE.Vector3(this.pointer.x,this.pointer.y,-1).unproject(viewport.camera); //z:-1朝外   
             pos3d.setZ(viewer.bound.boundingBox.min.z + 0.2) //大概放地面上
@@ -684,7 +698,7 @@ export class InputHandler extends EventDispatcher {
                 })
             }  
         }
-        
+        //console.log('getIntersect', !!intersectPoint)  
         
         this.intersectPoint = intersectPoint 
          

+ 1 - 1
src/navigation/Reticule.js

@@ -10,7 +10,7 @@ let defaultOpacity =  0.7
 export default class Reticule extends THREE.Mesh{
     constructor(viewer){
         var defaultTex = texLoader.load(Potree.resourcePath+'/textures/whiteCircle.png'/* reticule-256x256.png'  */)  
-        super(new THREE.PlaneBufferGeometry(0.15,0.15,1,1),new THREE.MeshBasicMaterial({
+        super(new THREE.PlaneBufferGeometry(0.13,0.13,1,1),new THREE.MeshBasicMaterial({
             side: THREE.DoubleSide , 
             map: defaultTex,
             transparent:true,

+ 6 - 3
src/start.js

@@ -15,7 +15,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
             console.log(i + ': ' +  obj[i])
         }
     }
-     */
+     */ 
     Potree.settings.number = number || 't-o5YMR13'// 't-iksBApb'// 写在viewer前
     Potree.fileServer = fileServer
     webSite && (Potree.settings.webSite = webSite)
@@ -159,7 +159,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
             //dataset.location = [ 113.60182446595765,22.364155116865753,0]
             //dataset.orientation = -0.9
              
-            if(!viewer.transform){//拿任意一个数据集作为基准。它的位置就会是000
+            if(!viewer.transform){//拿任意一个数据集作为基准。它的位置就会是000  (第一个数据集应该一直就是初始数据集吧?)
                 var locationLonLat = dataset.location.slice(0,2)
                 proj4.defs("NAVVIS:TMERC", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15));
                 proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
@@ -181,7 +181,9 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
             
             if(!ifReload){
                 var cloudPath = `https://${Potree.config.urls.prefix}/${Potree.settings.webSite}/${number}/data/${dataset.name}/webcloud/cloud.js` 
-                 Potree.loadPointCloud(cloudPath, dataset.name , e => {
+                var timeStamp = dataset.createTime.replace(/[^0-9]/ig,'');  //每重算一次后缀随createTime更新一次 
+                
+                Potree.loadPointCloud(cloudPath, dataset.name , timeStamp, e => {
                     let scene = viewer.scene;
                     let pointcloud = e.pointcloud; 
                     let config = Potree.config.material
@@ -195,6 +197,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                     material.shape = Potree.PointShape.SQUARE; 
                     pointcloud.color = pointcloud.material.color = dataset.color  
                     pointcloud.dataset_id = dataset.id;//供漫游点找到属于的dataset点云
+                    pointcloud.timeStamp = timeStamp
                     pointcloud.panos = [] 
                     transformPointcloud(pointcloud,dataset)
                     scene.addPointCloud(pointcloud);

+ 49 - 14
src/utils.js

@@ -1249,19 +1249,54 @@ Utils.QuaternionFactory = {
 }
  
  
-Utils.datasetPosTransform = {
-    toDataset:function(o={}){ 
-        let pointcloud = o.pointcloud || viewer.scene.pointclouds.find(e=>e.dataset_id == o.datasetId)
-        return pointcloud && (new THREE.Vector3).copy(o.position).applyMatrix4(pointcloud.transformInvMatrix)
-    },
-    fromDataset:function(o={}){
-        let pointcloud = o.pointcloud || viewer.scene.pointclouds.find(e=>e.dataset_id == o.datasetId)
-        if(!pointcloud){
-            if(o.datasetId != void 0){
-                console.error(`datasetPosTransform找不到datasetId为${o.datasetId}的数据集,请检查(热点?测量线?)数据`)
-                //很可能是旧的热点,需要删除
-            }
+Utils.datasetPosTransform = function(o={}){  
+    let pointcloud = o.pointcloud || viewer.scene.pointclouds.find(e=>e.dataset_id == o.datasetId)
+    let tranMatrix = o.fromDataset ? pointcloud.transformMatrix : pointcloud.transformInvMatrix
+    
+    if(pointcloud){ 
+        return (new THREE.Vector3).copy(o.position).applyMatrix4(tranMatrix)
+        
+    }else{
+        if(o.datasetId != void 0){
+            console.error(`datasetPosTransform找不到datasetId为${o.datasetId}的数据集,请检查(热点?测量线?)数据`)
+            //很可能是旧的热点,需要删除
         }
-        return pointcloud && (new THREE.Vector3).copy(o.dataset_location).applyMatrix4(pointcloud.transformMatrix)
-    },
+    }  
+}
+
+
+
+Utils.datasetRotTransform = function(o={}){
+    let pointcloud = o.pointcloud || viewer.scene.pointclouds.find(e=>e.dataset_id == o.datasetId)
+    if(pointcloud){
+        var matrix, newMatrix, result
+        
+        if(o.rotation){
+            matrix = new THREE.Matrix4().makeRotationFromEuler(o.rotation)
+        }else if(o.quaternion){
+            matrix = new THREE.Matrix4().makeRotationFromQuaternion(o.quaternion) 
+        }else if(o.matrix){
+            matrix = o.matrix.clone()
+        }else{
+            return
+        } 
+        let rotateMatrix = o.fromDataset ? pointcloud.rotateMatrix : pointcloud.rotateInvMatrix
+        newMatrix = new THREE.Matrix4().multiplyMatrices(rotateMatrix, matrix  ) 
+         
+        if(o.getRotation){
+            result = new THREE.Euler().setFromRotationMatrix(newMatrix)
+        }else if(o.getQuaternion){
+            result = new THREE.Quaternion().setFromRotationMatrix(newMatrix)
+        }else if(o.getMatrix){
+            result = newMatrix
+        }
+        
+        return result
+        
+    }
+
+    
 }
+
+
+

+ 82 - 49
src/utils/Magnifier.js

@@ -9,27 +9,28 @@ const circleGeo = new THREE.CircleGeometry(1.45,100);
 const sphereGeo = new THREE.SphereBufferGeometry(0.018,10,10);
  
  
-const magDistance_ = 2;//相机离目标位置的距离的分界线,当离得远时要缩小fov以使看到的视野固定(望远镜效果)
-const radius_ = 0.2; //当相机离目标位置的距离>magDistance_时,希望看到的视野的半径
+const magDistance_ = 1;//相机离目标位置的距离的分界线,当离得远时要缩小fov以使看到的视野固定(望远镜效果)
+/* const radius_ = 0.2; //当相机离目标位置的距离>magDistance_时,希望看到的视野的半径
 const maxFov = THREE.Math.radToDeg(Math.atan(radius_ / magDistance_ )) * 2//提前计算出当相机离目标位置的距离<magDistance_时的fov,均使用=magDistance_时的fov。只要保证该fov大于主相机的fov就会有放大效果 
-
-let w = 200/1.4;
+ */
+let w = 200/1.43;
 let maxPX = 1366*1024 //ipad pro.  大于这个分辨率的就直接用devicePixelRatio, 如macbook也是
-const width2dPX = window.devicePixelRatio >= 2 ? ( window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio : window.devicePixelRatio/1.5)*w : w  //触屏或高分辨率的可能要放大些。但在手机上不能太大
-
+const width2dPX = Math.round(window.devicePixelRatio >= 2 ? ( window.screen.width * window.screen.height >= maxPX ? window.devicePixelRatio/1.2 : window.devicePixelRatio/1.5)*w : w)  //触屏或高分辨率的可能要放大些。但在手机上不能太大
+console.log('width2dPX', width2dPX)
 
 
 
 export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
 	constructor (viewer) {
 		super()
-        this.width = this.height = 256;
+        this.width = this.height = width2dPX/*  * window.devicePixelRatio */;
         this.camera = new THREE.PerspectiveCamera(50, 1, 0.1, 10000);  //fov aspect near far
         this.camera.up = new THREE.Vector3(0,0,1) 
         
         
         this.viewport = new Viewport( null, this.camera, {
-            left:0, bottom:0, width:1, height: 1, name:'magnifier' , cameraLayers:['magnifierContent']
+            left:0, bottom:0, width:1, height: 1, name:'magnifier' , cameraLayers:['magnifierContent'],
+            pixelRatio:1
         })
         this.viewport.setResolution(this.width, this.height,0,0)
         
@@ -71,7 +72,7 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         this.targetPoint = new THREE.Mesh(sphereGeo, new THREE.MeshBasicMaterial({ 
             color:"#ff0000",
             transparent:true,
-            opacity:0.7,
+            opacity:0.65,
              
         }))
         this.targetPoint.name = 'magnifierPointTarget'
@@ -116,17 +117,13 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
                 this.update(e.intersectPoint && e.intersectPoint.location)
             }else{
                 viewer.updateVisible(this,"atViewport", false) //小地图不显示
-            }
+            } 
             
         }
         
         viewer.addEventListener('global_mousemove', updateVisi)
         viewer.addEventListener('global_touchstart', updateVisi)
-      
-        
-        
-        
-        
+       
         
         /* viewer.addEventListener("beginSplitView",()=>{
             this.updateVisible("splitView", false) 
@@ -155,66 +152,96 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
     }
     
     
-    /* updateVisible(reason, ifShow){//当所有加入的条件都不为false时才显示
-        if(ifShow){
-            var index = this.unvisibleReasons.indexOf(reason)
-            index > -1 && this.unvisibleReasons.splice(index, 1)
-            if(this.unvisibleReasons.length == 0)this.visible = true
-        }else{
-            if(!this.unvisibleReasons.includes(reason)) this.unvisibleReasons.push(reason)
-            this.visible = false    
-        }
+   
+    
+    
+    update(aimPos){//相机靠近 navvis的做法
+        
+        aimPos = aimPos instanceof THREE.Vector3 ?  aimPos : this.aimPos
+        if(!aimPos  || !this.visible)return
+        
+        
+        
+        var playerCamera = viewer.scene.getActiveCamera()
+        var playerPos = playerCamera.position;//viewer.scene.view.getPivot()
+        var dis = playerPos.distanceTo(aimPos);
+        var dirToCamera = new THREE.Vector3().subVectors(playerPos, aimPos ).normalize()
+        
+        
+        //相机位置
+        var finalDisToAim = dis>magDistance_ ? magDistance_ : dis / 2;
+        this.camera.position.copy(aimPos).add(dirToCamera.multiplyScalar(finalDisToAim))
+        this.camera.lookAt(aimPos)
+        this.camera.fov = playerCamera.fov / 2
+        this.camera.updateProjectionMatrix()
+        
+        
+
+         
+        //自身位置
+        let pointer = viewer.inputHandler.pointer.clone();
+        let margin = 0.4, maxY = 0.4
+        let screenPos = pointer.clone().setY(pointer.y + (pointer.y>maxY ? -margin : margin ))
+        
+        let newPos = new THREE.Vector3(screenPos.x,screenPos.y,0.8).unproject(playerCamera); //z:-1朝外       
+        let dir = newPos.clone().sub(playerPos).normalize().multiplyScalar(10);//这个数值要大于playerCamera.near
+        let s = dis>magDistance_ ? 1 : dis / magDistance_  ;
         
-    } */
+        this.position.copy(playerPos.clone().add(dir))
+        this.quaternion.copy(playerCamera.quaternion); 
+        this.targetPoint.position.copy(aimPos); 
+        this.targetPoint.scale.set(s,s,s)
+        this.aimPos = aimPos
+       
+        
+        var scale = math.getScaleForConstantSize({// 
+            width2d : width2dPX,
+            camera:viewer.scene.getActiveCamera(),  position: this.getWorldPosition(new THREE.Vector3()),
+            resolution: viewer.mainViewport.resolution2 
+        })
+        this.scale.set(scale, scale, scale); 
+ 
+        if(!this.dontRender){
+            this.waitRender = true
+        } 
+    
+    }
     
     
-    update(aimPos){ 
+    /* update(aimPos){  //仅改fov的版本
         
         aimPos = aimPos instanceof THREE.Vector3 ?  aimPos : this.aimPos
         if(!aimPos  || !this.visible)return
-        //console.log(aimPos)
+        
     
         //相机位置
         var playerCamera = viewer.scene.getActiveCamera()
         var playerPos = playerCamera.position;//viewer.scene.view.getPivot()
         var dis = playerPos.distanceTo(aimPos);
-        /* var vec = playerPos.clone().sub(aimPos).normalize().multiplyScalar(dis > magDistance_ ? magDistance_ : magDistance_/2)
-        this.camera.position.copy(aimPos.clone().add(vec)) 
-        this.camera.lookAt(aimPos) */
+         
         
         if(dis<magDistance_){
             this.camera.fov = maxFov
         }else{
             this.camera.fov = THREE.Math.radToDeg(Math.atan(radius_ / dis )) * 2 //radius_是能看到的范围半径。当dis大于magDistance_时就放大,否则维持fov为maxFov
         }
+       
         this.camera.updateProjectionMatrix()
         this.camera.position.copy(playerPos)
         this.camera.lookAt(aimPos)
         
         this.quaternion.copy(playerCamera.quaternion);
-
-        //mesh位置
-        /* let screenPos = viewer.inputHandler.mouse.clone();
-        let clientWidth = viewer.inputHandler.domElement.clientWidth * viewer.mainViewport.width;
-        let clientHeight = viewer.inputHandler.domElement.clientHeight * viewer.mainViewport.height;
-        screenPos.x = screenPos.x / clientWidth * 2 - 1;
-        screenPos.y = -((screenPos.y  < 300 ? 200 : -200) + screenPos.y) / clientHeight * 2 + 1; */
-    
-    
+  
         let pointer = viewer.inputHandler.pointer.clone();
         let margin = 0.4, maxY = 0.4
         let screenPos = pointer.clone().setY(pointer.y + (pointer.y>maxY ? -margin : margin ))
-     
-    
-    
-    
+       
                 
         let newPos = new THREE.Vector3(screenPos.x,screenPos.y,0.8).unproject(playerCamera); //z:-1朝外       
         let dir = newPos.clone().sub(playerPos).normalize().multiplyScalar(10);//这个数值要大于playerCamera.near
         
         this.position.copy(playerPos.clone().add(dir))
-         
-
+          
         this.aimPos = aimPos
         this.targetPoint.position.copy(aimPos);
         
@@ -227,11 +254,13 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
  
         if(!this.dontRender){
             this.waitRender = true
-        }
-        
- 
-           
+        }   
     }//位置需要计算,不仅仅是点云,所以需要深度图
+     */
+    
+    
+    
+    
     
     render(){ 
  
@@ -248,6 +277,10 @@ export default class Magnifier extends THREE.Object3D {//放大镜or望远镜
         })
         //this.visible = true;
         this.waitRender = false
+        
+        
+        
+        
     }
    
 }

+ 2 - 2
src/utils/Measure.js

@@ -137,7 +137,7 @@ export class Measure extends ctrlPolygon{
                 this.dataset_points = null //可能为空或[null,null...]
             }else{
                 this.dataset_points = this.points.map(e=>{ 
-                    return Potree.Utils.datasetPosTransform.toDataset({datasetId:this.datasetId, position:e.clone()})
+                    return Potree.Utils.datasetPosTransform({toDataset:true,datasetId:this.datasetId, position:e.clone()})
                 })
             }  
         }
@@ -150,7 +150,7 @@ export class Measure extends ctrlPolygon{
     transformByPointcloud(){//每次移动点云 or 加载测量线时要获取一下当前position
         if(this.datasetId == void 0)return 
         this.points = this.dataset_points.map(e=>{ 
-            return Potree.Utils.datasetPosTransform.fromDataset({datasetId:this.datasetId, dataset_location:e.clone()})
+            return Potree.Utils.datasetPosTransform({fromDataset:true, datasetId:this.datasetId, position:e.clone()})
         })
          
         this.getPoint2dInfo(this.points)

+ 10 - 2
src/utils/MeasuringTool.js

@@ -516,13 +516,21 @@ export class MeasuringTool extends EventDispatcher{
         }  
           
                  
-        let click = (e)=>{//一旦点击就立刻增加两marker 
+        let click = (e)=>{//一旦点击就立刻增加两marker  
+        
             if(ifAtWrongPlace(e))return  
+            
+             
+            
             if(e.button === THREE.MOUSE.RIGHT)return 
+            
+            console.log('measure clicked33', !!e.intersectPoint)
              
             var I = e.intersectPoint && (e.intersectPoint.orthoIntersect || e.intersectPoint.location)
             if(!I)return
             
+            
+            
              
             var marker = measure.addMarker({point:new THREE.Vector3(0, 0, 0)})
             this.viewer.inputHandler.startDragging(marker , {endDragFun, notPressMouse:true} ); //notPressMouse代表不是通过按下鼠标来拖拽
@@ -549,7 +557,7 @@ export class MeasuringTool extends EventDispatcher{
             
             
             
-            console.log('measure clicked')
+            //console.log('measure clicked')
             
             
             return {stopContinue:true}//防止继续执行别的侦听,如flytopano

+ 4 - 3
src/utils/ctrlPolygon.js

@@ -358,6 +358,7 @@ export class ctrlPolygon extends THREE.Object3D {
     }
     
     dropMarker(e){
+        console.log('dropMarker')
         if (this.isNew && e.pressDistance>Potree.config.clickMaxDragDis){//拖拽的话返回
             return continueDrag(e, this)   
         } 
@@ -365,11 +366,11 @@ export class ctrlPolygon extends THREE.Object3D {
         if(e.isTouch){ 
             if(e.hoverViewport != viewer.mainViewport && this.unableDragAtMap){
                 viewer.emit('reticule_forbit', true)
-                console.log('reticule_forbit',true)
+                //console.log('reticule_forbit',true)
                 return continueDrag(e, this) 
             }else{
                 viewer.emit('reticule_forbit', false)
-                console.log('reticule_forbit',false)
+                //console.log('reticule_forbit',false)
             }
             this.dragMarker(e) //触屏时必须先更新下点 
             
@@ -442,7 +443,7 @@ export class ctrlPolygon extends THREE.Object3D {
 		let point = this.points[index];
 		point.copy(position);
         if(this.datasetId){
-            this.dataset_points[index] = Potree.Utils.datasetPosTransform.toDataset({datasetId:this.datasetId, position:point.clone()})
+            this.dataset_points[index] = Potree.Utils.datasetPosTransform({toDataset:true, datasetId:this.datasetId, position:point.clone()})
         
         }
         let marker = this.markers[index];  

+ 10 - 5
src/viewer/EDLRenderer.js

@@ -165,7 +165,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
         
         const viewer = this.viewer; 
 		let camera = params.camera ? params.camera : viewer.scene.getActiveCamera();
-		const {width, height} = params.width ? params : this.viewer.renderer.getSize(new THREE.Vector2());
+		const resolution = params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());
 		
         
         //viewer.dispatchEvent({type: "render.pass.begin",viewer: viewer});
@@ -238,8 +238,12 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
                 let material = pointcloud.material; 
                 let octreeSize = pointcloud.pcoGeometry.boundingBox.getSize(new THREE.Vector3()).x;
                 material.fov = THREE.Math.degToRad(camera.fov) 
-                material.screenWidth = width;
-                material.screenHeight = height;
+                /* material.screenWidth = width;
+                material.screenHeight = height; */
+                material.resolution = resolution 
+               
+                
+                
                 material.spacing = pointcloud.pcoGeometry.spacing; // * Math.max(this.scale.x, this.scale.y, this.scale.z);
                 material.near = camera.near;
                 material.far = camera.far;
@@ -292,8 +296,9 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
              
 			const uniforms = this.edlMaterial.uniforms;
             //if(viewer.useEDL){
-                uniforms.screenWidth.value = width;
-                uniforms.screenHeight.value = height;
+                /* uniforms.screenWidth.value = width;
+                uniforms.screenHeight.value = height; */
+                uniforms.resolution.value.copy(resolution)
                 
                 uniforms.edlStrength.value = viewer.edlStrength;
                 uniforms.radius.value = viewer.edlRadius;

+ 25 - 7
src/viewer/View.js

@@ -12,17 +12,16 @@ export class View{
 
 		this.maxPitch = Math.PI / 2;
 		this.minPitch = -Math.PI / 2;
-        this.zoom = 1
+         
         
         
 
 	}
-    
-    applyToCamera(camera){//add
+    //add------
+    applyToCamera(camera){
         camera.position.copy(this.position);
-        camera.rotation.order = "ZXY";
-        camera.rotation.x = Math.PI / 2 + this.pitch;
-        camera.rotation.z = this.yaw;
+        camera.rotation.copy(this.rotation) 
+       
          
         camera.updateMatrix();
         camera.updateMatrixWorld();
@@ -31,7 +30,22 @@ export class View{
         
     }
     
+    get rotation(){
+        var rotation = new THREE.Euler;
+        rotation.order = "ZXY";
+        rotation.x = Math.PI / 2 + this.pitch;
+        rotation.z = this.yaw;
+        return rotation
+    }
+     
+    set rotation(rotation){
+        if(rotation.order != "ZXY")rotation.reorder("ZXY")
+        this.pitch = rotation.x - Math.PI / 2;
+        this.yaw = rotation.z
+        
+    }
     
+   
     
     
     copy(a){
@@ -50,7 +64,11 @@ export class View{
         
         return Common.CloneClassObject(this)
 	}
-
+    
+    //----------  
+    
+    
+    
 	get pitch () {
 		return this._pitch;
 	}

+ 2 - 2
src/viewer/Viewport.js

@@ -24,7 +24,7 @@ export default class Viewport{
         this.offset = new THREE.Vector2; //viewportOffset 范围从0-整个画布的像素
         this.extraEnableLayers = prop.extraEnableLayers || [];//额外可展示的层
         this.cameraLayers = prop.cameraLayers 
-        
+        this.pixelRatio = prop.pixelRatio  //如果规定pixelRatio的话要传,这样就覆盖devicePicelRatio, 如magnifier
     }
      
     
@@ -82,7 +82,7 @@ export default class Viewport{
     setResolution(w,h, wholeW=0, wholeH=0){
         this.resolution.set(w,h);//是client的width height
         
-        this.resolution2.copy(this.resolution).multiplyScalar(window.devicePixelRatio)
+        this.resolution2.copy(this.resolution).multiplyScalar(this.pixelRatio || window.devicePixelRatio)
          
         this.offset.set(wholeW,wholeH).multiply(new THREE.Vector2(this.left,this.bottom)).multiplyScalar(window.devicePixelRatio) 
     }

+ 3 - 2
src/viewer/map/Map.js

@@ -592,7 +592,8 @@ export class TiledMapFromEntity extends TiledMapBase{
         //c.RestService = s,
         this.tileSizePx = entity.tileSizePx,
         this.mapSizeM = entity.mapSizeM,
-        this.maxDepth = entity.maxDepth,
+        this.maxDepth = entity.maxDepth;
+        this.postStamp = entity.updateTime ? entity.updateTime.replace(/[^0-9]/ig,'') : (new Date).getTime()   
         //this.projection = n.crsLocal,
         this.zIndex = 0, 
         this.tilePresenceMap = this.decodeBitStream(this.tiledMapEntity.quadtree) //包含tile分裂信息,如果写错了会造成tile显示不全
@@ -656,7 +657,7 @@ export class TiledMapFromEntity extends TiledMapBase{
    
     getTileUrl(t, e, n) {
         var i = (this.tiledMapEntity.filePath + "/" + this.tiledMapEntity.fileName).replace(/\$DEPTH/g, t.toString(10)).replace(/\$X/g, e.toString(10)).replace(/\$Y/g, n.toString(10));
-        return i += "?t=" + (new Date).getTime() 
+        return i += "?t=" + this.postStamp  
         //this.RestService.addAuthorizationQueryParameter(i) //????
     }
     

+ 37 - 26
src/viewer/viewer.js

@@ -113,7 +113,7 @@ export class Viewer extends ViewerBase{
         this.paused  
          
         document.addEventListener('visibilitychange',(e)=>{ 
-            console.log('visibilitychange', !document.hidden )
+            //console.log('visibilitychange', !document.hidden )
             this.emit('pageVisible', !document.hidden )
             /* if(document.hidden){
                 this.paused = true
@@ -450,7 +450,7 @@ export class Viewer extends ViewerBase{
         
          
         
-        {
+        /* {
             let ratio
             this.addEventListener('resize',(e)=>{
                 if(ratio != e.deviceRatio){ //因为devicePixelRatio会影响到点云大小,所以改变时计算下点云大小
@@ -461,7 +461,7 @@ export class Viewer extends ViewerBase{
                 ratio = e.deviceRatio
                 
             }) 
-        }
+        } */
         
         { 
             let pointDensity = ''
@@ -2507,7 +2507,8 @@ export class Viewer extends ViewerBase{
             if(!view.noPointcloud ){
                 
                 //if(!params.target){ 
-                    params.width = width; params.height = height;
+                    //params.width = width; params.height = height;
+                    
                 //}
                 if(view.render){
                     params.noBG = true
@@ -2517,7 +2518,7 @@ export class Viewer extends ViewerBase{
                 
                 view.beforeRender && view.beforeRender(view)
                 
-                this.updateViewPointcloud(params.camera, new THREE.Vector2(params.width,params.height), true)
+                this.updateViewPointcloud(params.camera, view.resolution2, true)
                 
                 params.background = view.background
                 params.backgroundColor = view.backgroundColor
@@ -2896,10 +2897,10 @@ export class Viewer extends ViewerBase{
         console.log('focusOnObject: '+object.name,  type)
         
         let deferred = o.deferred || $.Deferred();
-        let target  = new THREE.Vector3,
-            position = new THREE.Vector3, 
-            dis;
-        duration = duration == void 0 ? 2000 : duration;     
+        let target  = new THREE.Vector3,  //相机focus的位置
+            position = new THREE.Vector3, //相机最终位置
+            dis;                          //相机距离目标
+        duration = duration == void 0 ? 1000 : duration;     
         let camera = viewer.scene.getActiveCamera()
         
         
@@ -2919,29 +2920,37 @@ export class Viewer extends ViewerBase{
             
             var cameraTemp = camera.clone()
             
-             //试试改变位置,直视测量线。能避免倾斜角度造成的非常不居中、以及看不到面的情况,但镜头旋转幅度太大了
+             //试试改变位置,直视测量线。能避免倾斜角度造成的非常不居中、以及看不到面的情况 
             if(object.facePlane/*  && window.focusMeasureFaceToIt */){
                 let normal
                 if(object.facePlane){
                     normal = object.facePlane.normal.clone()
-                }/* else{ 
-                    if(object.points.length>2){
-                        console.error('怎么有多个点却没有facePlane?')
-                    }else{
-                        normal = //以后再写
-                    }
-                }  */                 
+                }               
                 let angle = this.scene.view.direction.angleTo(normal)
-                if(angle<Math.PI*0.7){//当几乎正对时就不执行
-                    if(angle<Math.PI/2){
+                let minDiff = Math.PI*0.25// 45度
+                if(angle>minDiff && angle<Math.PI-minDiff){//当几乎正对时就不执行
+                    if(angle<Math.PI/2){ //在背面
                         normal.negate()
                     }
                     let dir = new THREE.Vector3().subVectors(camera.position, target).normalize() 
                     let newDir = new THREE.Vector3().addVectors(dir,normal)//两个角度的中间
                     cameraTemp.position.copy(target.clone().add(newDir))
-                }
-                
-                
+                }   
+            }else if(object.points.length == 2){ //线段
+                let lineDir = new THREE.Vector3().subVectors(object.points[0],object.points[1]).normalize()
+                let angle = this.scene.view.direction.angleTo(lineDir)
+                let maxDiff = Math.PI*0.25// 45度
+                if(angle<maxDiff || angle>Math.PI-maxDiff){//当几乎正对时就不执行
+                    if(angle>Math.PI/2){  //令dir和lineDir成钝角
+                        lineDir.negate()
+                    } 
+                    let dir = new THREE.Vector3().subVectors(camera.position, target).normalize() 
+                    let mid = new THREE.Vector3().addVectors(lineDir, dir).normalize() //中间法向量(如果刚好dir和lineDir反向,那得到的为零向量,就不移动了,但一般不会酱紫吧)
+                    let newDir = new THREE.Vector3().addVectors(dir, mid)
+                    cameraTemp.position.copy(target.clone().add(newDir))
+                } 
+            }else{
+                console.error('measure 没有facePlane points点数还不为2?')
             } 
             
             
@@ -2966,7 +2975,7 @@ export class Viewer extends ViewerBase{
             let boundSize = bound.getSize(new THREE.Vector3)
              
             
-            if(!this.boundBox){
+            if(!this.boundBox){//调试
                 this.boundBox = new THREE.Mesh(new THREE.BoxGeometry(1,1,1,1));
                 this.boundBox.material.wireframe = true
                 this.boundBox.up.set(0,0,1)
@@ -3010,22 +3019,24 @@ export class Viewer extends ViewerBase{
                 this.mapViewer.moveTo(target.clone(), boundSizeMap, duration)
             }
             
+            
+            //获得相机最佳位置
             let dir = new THREE.Vector3().subVectors(cameraTemp.position, target).normalize()
             position.copy(target).add(dir.multiplyScalar(dis))
+            
             if(Potree.settings.displayMode == 'showPointCloud'){  //点云 
                 
                  
             }else if(Potree.settings.displayMode == 'showPanos'){//全景 (比较难校准)
                 let pano = viewer.images360.fitPanoTowardPoint({
-                    /*point : target, 
+                    /*point : target,  //不使用目标点来判断是因为缺少measure角度的信息。比如虽然可以靠近线的中心,但是线朝向屏幕,那几乎就是一个点了。
                     //bestDistance : dis * 0.5, //乘以小数是为了尽量靠近 
                     boundSphere: boundOri.getBoundingSphere(new THREE.Sphere), */
                     
                     point : position,
                     bestDistance : 0 , 
-                    
-                    
                 })
+                
                 pano && viewer.images360.flyToPano({pano, target, duration, deferred, dontMoveMap:true  , basePanoSize:o.basePanoSize})//dontMoveMap不要移动map,否则flytopano会自动在map中focus到漫游点的位置,而非测量线了
                 
                 if(!pano){

+ 2 - 6
src/viewer/viewerBase.js

@@ -140,12 +140,8 @@ export class ViewerBase extends EventDispatcher{
         } 
     } 
      
-    setSize(width, height, devicePixelRatio){
-        
-        
-        console.log('setSize',width,height, this.name) 
-        
-         
+    setSize(width, height, devicePixelRatio){ 
+        //console.log('setSize',width,height, this.name)  
         //if(width == 0 || height == 0)return;
         
         this.renderer.setSize(width, height, null, devicePixelRatio); // resize之后会自动clear(似乎因为setScissor ),所以一定要立刻绘制,所以setSize要在cameraChanged、update之前

+ 92 - 0
改bug的历史.txt

@@ -0,0 +1,92 @@
+
+
+
+2022-03-02
+
+触屏放大镜里的点云为何那么大???
+·只要一转为触屏就这样  pointsize和什么有关,会重新计算吗
+·自适应时的触屏devicePixelRatio是2!!
+·shader中计算pointsize时最关键的参数是uScreenHeight。由于我在渲染屏幕点云时乘了devicePixelRatio,所以无论devicePixelRatio多少看起来都一样大;但是放大镜也被乘了devicePixelRatio,所以放大了。它的devicePixelRatio应该永远为1
+·考虑修改uScreenHeight为resolution2.y , 并取消乘以devicePixelRatio
+ 
+
+低质量点云测量怎么点不上?
+·e.intersectPoint 居然没有
+·好像是因为改了shader后resolution没赋值,都是0,而电脑会给一个最小pointsize,手机可能更小吧? 所以pick不出。赋值就ok了
+
+
+
+
+2022-03-01
+
+(测量-移动端)移动端无法进行测量,无法确定测量起点
+·该手机iphone7plus 竟然加载了两个点云! 但是本地版却不会。 等中午重新发布后看看。
+·发现spacing有误 中心点 boundsize有误  但数据集id没错。刷新缓存或许可以。 或许是cloud.js是旧的?
+·清除缓存后正正常了。因为重算了场景,所有点云数据会修改。 加个后缀
+ 
+
+
+
+
+2022-02-25
+关于 丽篮电脑和我的手机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,刷新就会这样(所以之前的海拔是错误信息,为什么我没自己验证一下呜呜)
+
+
+
+
+
+
+
+
+2022-02-24
+关于iphone测试机旋转屏幕or点击小地图后mainViewer setSize导致webgl context lost 的bug:
+	·修改canvas.width height就会
+	·不渲染的话不会。 
+	·仅显示地图、隐藏场景才会 
+		pRenderer.clearTargets(params); pRenderer.render(params); 这两句去掉就不会
+		第二句主要是执行到点云渲染 renderOctree
+ 		setSize后重新渲染的时候才会崩溃,也就是延迟多久渲染就延迟多久崩溃
+
+	·直接把this.rtEDL.setSize去除居然不崩。但如果默认设置DepthTexture宽高不为undefined or 0 或和rtEDL大小不一样,也会崩。   延迟resize也不行,所以应该是大小不匹配的问题。
+	 结论:无解了,直接去掉rtEDL吧。反正崩溃的手机刚好EXT_frag_depth不可用,所以用不到rtEDL
+
+
+
+
+
+
+2022-02-23
+关于iphone测试机创建不了potree中的program:
+	·即使把mapViewer禁止渲染,使potree的program是第一个创建的program也不行
+	·有一个场景有时候可以打开 https://uat-laser.4dkankan.com/uat/index.html?m=t-6UoYGXbWhi
+	·和点位无关,删除全部点也不行
+	·不渲染点云,只创建three.js中的program也失败 
+	·binaryLoader中load(node){ 不加载点云也失败
+	·延迟start也不行
+
+	·在开始创建gl的时候获取是可以的! 但在循环渲染时,到刚开始渲染点云之前为false(怎么知道要渲染了?)
+	好像不是edl渲染才报错的。 是在此之前有其他的东西报错了  
+  
+	是这个。。。this.shadowMap = new PointCloudSM(this.viewer.pRenderer);
+
+
+
+
+