Browse Source

fix: distanceSquared函数有误,导致漫游点加载选择出错

xzw 2 years ago
parent
commit
b5689513b6

BIN
resources/textures/marker2.png


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

@@ -2147,8 +2147,7 @@ export class Images360 extends THREE.EventDispatcher{
         return this.rankedPanoInDirection(0, direction, option1, option2)
     }
     rankedPanoInDirection(t, direction, option1, option2){
-        //此direction为mouseDirection,是否需要加上相机角度的权重
-        
+        //此direction为mouseDirection,是否需要加上相机角度的权重 
         var panoSet = {
             pano: null,
             candidates: [] //缓存顺序--如果需要打印的话
@@ -2189,7 +2188,7 @@ export class Images360 extends THREE.EventDispatcher{
         
         
         var list = [//决胜项目
-            Images360.scoreFunctions.distanceSquared(this.position, 1  ),
+            Images360.scoreFunctions.distanceSquared(this.position,  1  ),
             
             Images360.scoreFunctions[o]( this.position, direction,true),
              
@@ -2567,10 +2566,12 @@ export class Images360 extends THREE.EventDispatcher{
 			rank = o.rank || [],
 			force = o.force,
 			getAll = o.getAll,  
-            bestDistance = o.bestDistance || 0
+            bestDistance = o.bestDistance || 0,
+            dir = o.dir
+            
         let camera = viewer.scene.getActiveCamera()
-        if(target){
-            var vec = new THREE.Vector3().subVectors(target,point).normalize()
+        if(target && !dir){
+            dir = new THREE.Vector3().subVectors(target,point).normalize()
         }
          
         
@@ -2600,13 +2601,13 @@ export class Images360 extends THREE.EventDispatcher{
             }else{
                 let dis2 = pano.position.distanceToSquared(target);  //距离目标点
                 let vec2 = new THREE.Vector3().subVectors(target,pano.position).normalize()
-                let cos = vec.dot(vec2)  
+                let cos = dir.dot(vec2)  
                 let result = (- dis1  - Math.pow(dis2 , 1.5)) / (cos + 2)  // cos+2是为了调整到1-3, 尽量贴近最佳位置的角度;
                 //console.log(pano.id, dis1,dis2,  cos,  result)
                 return result
             } 
         },(pano)=>{ 
-            if(pano.depthTex && o.checkIntersect){      //没加载好的话,不管了
+            if(pano.depthTex && o.checkIntersect && this.panos.length<20){      //没加载好的话,不管了
                 let intersect = viewer.inputHandler.ifBlockedByIntersect(target, 0.1 , null, null, null, pano)
                 if(intersect){
                     //console.log('intersected', pano.id )
@@ -3158,21 +3159,22 @@ Images360.scoreFunctions = {
        
     },
      
-    distance: function(pos1, r, ifLog) { 
+    distance: function(pos1, r=1, ifLog) { 
         if(pos1.position)pos1 = pos1.position
         return  function(pano) {//许钟文 改
             var pos2 = pano.position.clone()
-            //ifLog && console.log('distanceSquared', pano.id, pos1.distanceToSquared(pos2) * -1 )
+            //ifLog && console.log('distance', pano.id, pos1.distance(pos2) * -1 )
             return pos1.distanceTo(pos2) * -1 * r;
         }
     }, 
-    distanceSquared: function(pos1, r ) { 
+    distanceSquared: function(pos1, r=1 ) { 
         if(pos1.position)pos1 = pos1.position
         return  function(pano) {//许钟文 改
             var pos2 = pano.position.clone() 
             return pos1.distanceToSquared(pos2) * -1 * r;
         }
     },
+     
     angle: function(e, t) {
         return function(i) {
             var n = i.position.clone().sub(e).normalize();

+ 3 - 3
src/custom/modules/panos/Panorama.js

@@ -196,7 +196,7 @@ class Panorama extends THREE.EventDispatcher{
 
           
             //let xy = this.transform.forward([this.longitude, this.latitude]);  
-            this.file = `https://4dkk.4dage.com/images/images${Potree.settings.number}/pan/high/${this.id}.jpg`
+            //this.file = `https://4dkk.4dage.com/images/images${Potree.settings.number}/pan/high/${this.id}.jpg`
             
              
             
@@ -567,7 +567,7 @@ class Panorama extends THREE.EventDispatcher{
     createTextLabel(){
         this.removeTextLabel()
         this.label = new TextSprite(Object.assign({},
-           labelProp, {text: this.id }) //{text: `id:${this.id}, dataset:${this.pointcloud.name}, 4dkkId:${this.originID}`}
+           labelProp, {text: this.id + "|"+this.originID}) //{text: `id:${this.id}, dataset:${this.pointcloud.name}, 4dkkId:${this.originID}`}
         ); 
         this.images360.node.add(this.label);
         this.floorPosition && this.label.position.copy(this.floorPosition)
@@ -692,7 +692,7 @@ Panorama.prototype.loadTiledPano = function() {
                     
                     this.addEventListener(PanoramaEvents.TileLoaded, function(ev/* t, i, n */) {//每张加载完时
                         
-                        //console.log('tileLoaded', 'id:'+this.id,  'size:'+ev.size, 'tileIndex:'+ev.index )
+                         console.log('tileLoaded', 'id:'+this.id,  'size:'+ev.size, 'tileIndex:'+ev.index )
                         let tileIndex = ev.index
                         let total = ev.count
                         let size = ev.size

+ 9 - 9
src/custom/modules/panos/tile/PanoRenderer.js

@@ -26,13 +26,12 @@ function createDescriptor() {
 
       
 
-function c() {
-
+function upload() { 
     if (!this.uploadIntervalCancelled) {
         if (this.overlayTilesLoaded || !this.usingTileOverlay) {
-            b = !0,
-                this.updateUploadQueue(this.maxNonBaseUploadsPerFrame, this.maxBaseUploadsPerFrame),
-                this.peekNextFromUploadQueue() ? this.refreshUploadInterval(w) : this.uploadInterval = null
+            b = !0  
+            this.updateUploadQueue(this.maxNonBaseUploadsPerFrame, this.maxBaseUploadsPerFrame),
+            this.peekNextFromUploadQueue() ? this.refreshUploadInterval(w) : this.uploadInterval = null
         } else {
             this.refreshUploadInterval(this.uploadIntervalDelay)
         }
@@ -316,6 +315,7 @@ class PanoRenderer extends THREE.EventDispatcher{
             var r = this.getUploadQueueForPano(e.panoId);
             //console.log(window.sceneName, 'queueTileUpload: ', e.panoId, e.tileIndex,   i)
             if(i){
+                console.log('直接uploadTile')
                 this.uploadTile(e, !1)//提交
             }else{
                 if(this.shoulPushToFrontOfQueue(e)){//如果是512的优先
@@ -396,7 +396,7 @@ class PanoRenderer extends THREE.EventDispatcher{
     updateUploadQueue(maxNPF,maxPF/* e, t */) {//参数是 maxNonBaseUploadsPerFrame and maxBaseUploadsPerFrame, 优先上传512
         maxNPF || (maxNPF = 1);
         for (var i = 0, n = 0;;) {
-            let old = this.forceQueue.slice(0)
+            //let old = this.forceQueue.slice(0)
            
             if (n >= maxPF || i >= maxNPF)
                 break;
@@ -805,12 +805,12 @@ PanoRenderer.prototype.renderPanoTiles = function () {
         for (var a = 0; a < TileUtils.FACES_PER_PANO; a++) {
             var s = this.getTileTree(panoId, a);
             e.length = 0 
-            s.breadthFirst({//获取所有node?  85个
+            s.breadthFirst({//获取该面所有node  85个 = 1+4+16+64
                 saveVisited: e
             });
             for (var l = 0; l < e.length; l++) {
                 var c = e[l];
-                this.queueTileUpload(c.tile, !1, r || 0 === l && n)//为什么第0个会直接uploadTile??
+                this.queueTileUpload(c.tile, !1, r || 0 === l && n)// 第0个是512的,会直接uploadTile 
             }
         }
         this.updateDirection(i)
@@ -832,7 +832,7 @@ PanoRenderer.prototype.getNextFromUploadQueue = function () {
 PanoRenderer.prototype.refreshUploadInterval = function () {
     var e = null;
     return function (t) {
-        this.uploadIntervalCancelled || (e || (e = c.bind(this)),
+        this.uploadIntervalCancelled || (e || (e = upload.bind(this)),
             null !== t && void 0 !== t || (t = w),
             b || (t = _),
             this.uploadInterval = window.setTimeout(e, t),

+ 2 - 2
src/custom/modules/panos/tile/TileDownloader.js

@@ -488,13 +488,13 @@ TileDownloader.prototype.getTileUrl = function() {
                 if (t.tileX == 0) {
                     d += 'x_0,';
                 } else {
-                    d += 'x_' + (512 * t.tileX - 1) + ',';
+                    d += 'x_' + (512 * t.tileX /* - 1 */) + ',';
                 }
 
                 if (t.tileY == 0) {
                     d += 'y_0';
                 } else {
-                    d += 'y_' + (512 * t.tileY - 1);
+                    d += 'y_' + (512 * t.tileY /* - 1 */);
                 } 
             }
             

+ 2 - 6
src/custom/objects/tool/Measure.js

@@ -592,12 +592,8 @@ export class Measure extends ctrlPolygon{
             }, new THREE.Vector3 ) 
             
             center.multiplyScalar(1/this.points.length)
-            return center
-        }/* else if(this.points.length>=3){
-            
-        }else if(this.points.length == 2){
-            return this.points[0].clone().add((this.points[1])).multiplyScalar(0.5)
-        }else return this.points[0].clone() */
+            return center //求不出重心呜呜
+        } 
         
     }
     

+ 18 - 15
src/custom/objects/tool/MeasuringTool.js

@@ -342,7 +342,6 @@ export class MeasuringTool extends THREE.EventDispatcher{
         this.scene.add(measure);
         measure.isNew = true
         
-        
 		this.viewer.dispatchEvent({
 			type: 'start_inserting_measurement',
 			measure: measure
@@ -355,7 +354,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
 
  
 
-		let endDragFun = (e) => { 
+		let endDragFun = (e) => {  
             let length = measure.points.length
 			if (e.button == THREE.MOUSE.LEFT || e.isTouch) { 
 				if (length >= measure.maxMarkers) {
@@ -387,21 +386,21 @@ export class MeasuringTool extends THREE.EventDispatcher{
 			}
 		};
 
-		let end = (e={}) => {//确定、结束
-            if(!measure.isNew ||  measure.markers.length == 0)return
+		let end = (e={}) => {//确定、结束 
+            if(!measure.isNew )return
+              
             if(args.minMarkers != void 0 ){
                 
                 if(!e.finish && measure.markers.length<=args.minMarkers ){//右键  当个数不够时取消
                     //this.viewer.scene.removeMeasurement(measure)
                     //cancelFun && cancelFun()
                     //重新开始画
-                    measure.markers[0].removeEventListener('mousedown',end)
-                    measure.reDraw()
-                     
-                    
-                    this.viewer.addEventListener('global_click', click, 10)
-                   
-                    measure.editStateChange(true)
+                    if(measure.markers.length>0){
+                        measure.markers[0].removeEventListener('mousedown',end)
+                        measure.reDraw() 
+                        this.viewer.addEventListener('global_click', click, 10) 
+                        measure.editStateChange(true)
+                    }
                     return
                     
                     /* if(!Potree.settings.isOfficial) this.viewer.scene.removeMeasurement(measure)
@@ -415,7 +414,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
              
             
             if (/* !e.finish&& */ measure.markers.length > args.minMarkers) {
-				measure.removeMarker(measure.points.length - 1); 
+                measure.removeMarker(measure.points.length - 1); 
                 measure.markers[0].removeEventListener('mouseover', mouseover);
                 measure.markers[0].removeEventListener('mouseleave', mouseleave);
                 measure.markers[0].removeEventListener('click'/* 'mousedown' */,Exit) 
@@ -423,7 +422,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
                 if(e.byClickMarker && measure.markers.length > args.minMarkers){//通过点击第一个marker而结束的话,会多一个marker
                     measure.removeMarker(measure.points.length - 1); 
                 }
-			}
+            }
             measure.isNew = false
             let length = measure.points.length 
             if(length){
@@ -434,6 +433,10 @@ export class MeasuringTool extends THREE.EventDispatcher{
                 measure.edges.forEach(edge=>{edge.dispatchEvent('addHoverEvent') })
                 measure.update();//update last edgeLabel 
             }
+            
+             
+            
+            
             clearTimeout(timer) 
 			this.viewer.removeEventListener('cancel_insertions', Exit);
             //pressExit && this.viewer.inputHandler.removeEventListener('keydown', pressExit);
@@ -460,7 +463,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
             if(e.measure && e.measure != measure){
                 return;//若指定了退出的measure但和该measure不一致,就返回
             }
-            console.log('Exit: ' +  measure.id)
+        
             if(e.remove){
                 viewer.scene.removeMeasurement(measure)  
             }
@@ -509,7 +512,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
           
                  
         let click = (e)=>{//一旦点击就立刻增加两marker  
-        
+         
             if(ifAtWrongPlace(e))return  
             if(e.clickElement)return  //如点击label时focusOnObject
              

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

@@ -1194,7 +1194,7 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
                 
 				//screenPixelRadius 和 domHeight 成正比,所以手机横屏后screenPixelRadius会变小。这是正常的,因为vhov不变,相同物体高度在横屏后高度变小,所需要的密度不需要那么高了。但hfov横屏后扩大,所以可见的node范围变大,又增加了一些可见node;只是总体的可见node还是减少了。
 				//使用hfov和domWidth计算结果相同。
-                if(screenPixelRadius < pointcloud.minimumNodePixelSize / Math.pow(dd,addPow)){
+                if(screenPixelRadius < pointcloud.minimumNodePixelSize / Math.pow(dd,addPow)){  //理论上因手机像素小,更不容易堆叠铺满,minimumNodePixelSize应该除以window.deviceRatio 但会造成加载过多,而内存小
 					continue;
 				}
                 //如果能得到该方向上的密度,也就是node数量,密度大的远处少加载,因为被遮挡了显示也没有意义,就好了。
@@ -1221,6 +1221,7 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
 
 			priorityQueue.push({pointcloud: element.pointcloud, node: child, parent: node, weight: weight}); //貌似好像二叉堆中子节点和父节点没什么关系,就只是为了方便排序层层遍历
 		}
+        //手机上像素点更小,所以远处感觉会更稀疏
 	}// end priority queue loop
 
 	{ // update DEM  这是什么

+ 4 - 4
src/custom/settings.js

@@ -136,19 +136,19 @@ const config = {//配置参数   不可修改
             maxLevelPercent: 0.4, //最小为0
             percentByUser:true, //如果用户定义了percent,使用用户的
             pointBudget : browser.isMobile() ? 1*1000*1000 : 2*1000*1000, 
-            minNodeSize : browser.isMobile() ? 80 : 40  ,
+            minNodeSize :  40  ,
         }, 
         middle:{//balanced  //不同场景相同级别所产生的numVisibleNodes和numVisiblePoints不同,如果分层比较细,可能要到level8才能看清,那么level5看到的点就很大且很少,如隧道t-e2Kb2iU
             maxLevelPercent: 0.7,
             percentByUser:true,
-            pointBudget:browser.isMobile() ? 2*1000*1000 : 3.5*1000*1000, 
-            minNodeSize : browser.isMobile() ? 80 : 40  ,
+            pointBudget: browser.isMobile() ? 2.0*1000*1000 : 3.5*1000*1000, 
+            minNodeSize :  30  ,
         },
         high:{//highQuality
             maxLevelPercent: 1, 
             percentByUser:true,
             pointBudget:browser.isMobile() ? 3*1000*1000 : 6*1000*1000,  //原本最高是8,但是大部分电脑都太卡了,降
-            minNodeSize : browser.isMobile() ? 60 : 30 ,
+            minNodeSize :  30   ,
         }
         //browser.isMobile() 时要不要限制下pointBudget,还是让用户自己调低质量?
         //minNodeSize?

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

@@ -252,7 +252,7 @@ var math = {
 		Gy = Gy / area;
 		return { x: Gx, y: Gy };
 	},
-	
+	 
 	getBound : function(ring){
 		var bound = new THREE.Box2();
 		for(var j=0,len = ring.length; j<len; j++){

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

@@ -889,10 +889,10 @@ export class Viewer extends ViewerBase{
             let camera = e.camera || this.scene.getActiveCamera()
             
             Common.intervalTool.isWaiting('testPointcloudsMaxLevel', ()=>{  
-                if(!camera_changed && count>20 )return //只有当camera_changed后才继续循环, 除了最开始几次需要连续加载下
+                if(!camera_changed && count>50 || Potree.settings.displayMode == 'showPanos'  )return //只有当camera_changed后才继续循环, 除了最开始几次需要连续加载下
                 camera_changed = false
                 count ++;
-                //console.log('testPointcloudsMaxLevel中')
+                 console.log('testPointcloudsMaxLevel中',count)
                 
                 var success = true    
                 viewer.scene.pointclouds.forEach(e=>{
@@ -908,7 +908,7 @@ export class Viewer extends ViewerBase{
                     console.log('testPointcloudsMaxLevel结束')
                 }
                 
-            }, count<10 ? 150 : 500) 
+            }, count<10 ? 250 : 500) 
         }            
         this.addEventListener('camera_changed',test) 
         test()
@@ -3554,8 +3554,7 @@ export class Viewer extends ViewerBase{
                 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)
-                    //viewer.updateVisible(this.boundBox, 'hidden', true)//打开以检查box 
+                    this.boundBox.up.set(0,0,1)  
                     this.setObjectLayers(this.boundBox,'sceneObjects')
                     this.scene.scene.add(this.boundBox); 
                 } 
@@ -3578,9 +3577,8 @@ export class Viewer extends ViewerBase{
         }
         if (type == 'measure') {  
             target.copy(object.getCenter()) 
-       
-            
-            
+        
+              
             
             //试试改变位置(方向),直视测量线。能避免倾斜角度造成的非常不居中、以及看不到面的情况 
             if(object.points.length>2/*  && window.focusMeasureFaceToIt */){
@@ -3697,19 +3695,26 @@ export class Viewer extends ViewerBase{
                     } 
                     
                     checkIntersect() 
+                    //多折线没有areaPlane 有时候会看向空白区域 - -
                 //}      
             }else if(Potree.settings.displayMode == 'showPanos'){//全景 (比较难校准)
+                let target2, dir
+                if( object.measureType.includes('MulDistance')){//因为该线不闭合,可能看向target的方向会没有线,所以换一个target
+                    target2 = object.points[Math.round(object.points.length / 2) ]//直接看向中间点
+                    dir = new THREE.Vector3().subVectors(target2, position).normalize()  
+                }
                 let pano = viewer.images360.fitPanoTowardPoint({
                     /*point : target,  //不使用目标点来判断是因为缺少measure角度的信息。比如虽然可以靠近线的中心,但是线朝向屏幕,那几乎就是一个点了。
                     //bestDistance : dis * 0.5, //乘以小数是为了尽量靠近 
                     boundSphere: boundOri.getBoundingSphere(new THREE.Sphere), */
                     target, 
+                    dir,  
                     point : position,
-                    bestDistance : 0 ,
-                    checkIntersect: o.checkIntersect                    
+                    bestDistance : 0 , 
+                    checkIntersect: true//o.checkIntersect                    
                 })
                 if(pano){
-                    viewer.images360.flyToPano({pano, target, duration, deferred, dontMoveMap:true  , basePanoSize:o.basePanoSize})//dontMoveMap不要移动map,否则flytopano会自动在map中focus到漫游点的位置,而非测量线了
+                    viewer.images360.flyToPano({pano, target : target2 || target, duration, deferred, dontMoveMap:true  , basePanoSize:o.basePanoSize})//dontMoveMap不要移动map,否则flytopano会自动在map中focus到漫游点的位置,而非测量线了
                 }
                 if(viewer.images360.currentPano == pano){ 
                     let dis1 = viewer.images360.currentPano.position.distanceTo(target)
@@ -3784,8 +3789,8 @@ export class Viewer extends ViewerBase{
                 //出现过到达位置后测量线标签闪烁的情况
             }else{
                /*  if(o.dontChangeCamDir){
-                target = null
-} */
+                    target = null
+                } */
             }
             
         }

+ 1 - 1
src/custom/viewer/viewerBase.js

@@ -40,7 +40,7 @@ export class ViewerBase extends THREE.EventDispatcher{
             depth: true,
             stencil: false,
             antialias: true, 
-            preserveDrawingBuffer: true,
+            preserveDrawingBuffer: false,// true,
             powerPreference: "high-performance",
         }; 
 

+ 5 - 0
改bug的历史.txt

@@ -1,4 +1,9 @@
 
+2022.12.13
+
+漫游时经常要加载一两秒。 一开始以为是uploadTile加载问题,后来发现确实图没加载好,downloaded=false
+原来是populateScoredPanos时的distanceSquared函数有问题
+
 2022.11.24