瀏覽代碼

fix: 同上

xzw 1 年之前
父節點
當前提交
34ea0a6c37
共有 2 個文件被更改,包括 114 次插入43 次删除
  1. 113 42
      public/static/lib/potree/potree.js
  2. 1 1
      public/static/lib/potree/potree.js.map

+ 113 - 42
public/static/lib/potree/potree.js

@@ -62548,7 +62548,7 @@ float getPointSize(){
 		if(uUseOrthographicCamera){
 			//pointSize = size * 100.0;  //加个乘数
             
-            pointSize = size / uOrthoWidth  * resolution.x; //改成近似adaptive_point_size根据窗口缩放
+            pointSize = size / uOrthoWidth  * resolution.x * 2.0; //改成近似adaptive_point_size根据窗口缩放
             maxSize_ = 6.0;  //for panoEditor, when zoom in, need more details, rather than always same size
 
 		}else{  //近大远小,模拟真实mesh,边缘放大
@@ -74161,11 +74161,10 @@ void main()
 			let maxLevel = pointcloud.maxLevel == void 0 ? Infinity : pointcloud.maxLevel;
 			let level = node.getLevel();
 			let visible = insideFrustum;
-			visible = visible && (Potree.settings.pointNoLimit || !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget));
-			visible = visible && (Potree.settings.pointNoLimit || !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget)); // pointcloud.pointBudget一直是Infinity
+			visible = visible && !(numVisiblePoints + node.getNumPoints() > Potree.pointBudget);
+			visible = visible && !(numVisiblePointsInPointclouds.get(pointcloud) + node.getNumPoints() > pointcloud.pointBudget); // pointcloud.pointBudget一直是Infinity
 			visible = visible && level <= maxLevel; //< 改为 <=
-			//visible = visible || node.getLevel() <= 2;
-
+			//visible = visible || node.getLevel() <= 2; 
 
 	        let intersectBox = (clipBox)=>{
 
@@ -74275,9 +74274,13 @@ void main()
 			}
 
 			if (!Potree.settings.pointNoLimit && numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {
+	            Potree.overPointBudget = true;
+	            viewer.dispatchEvent('overPointBudget'); 
 				break;
 			}
-
+	        Potree.overPointBudget = false;
+	        
+	        
 			if (!visible) {
 				continue;
 			}
@@ -74430,22 +74433,22 @@ void main()
 	            unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry); 
 	        }  */ 
 	        
-	        let maxNodesLoading = Common$1.getBestCount('unloadedGeometry', viewer.lastFrameChanged?1:3, 6,  4, 15 /*  , true  */ );//dur在iphoneX中静止有7,pc是2  //!lastFrameChanged静止时加速下载
+	        let maxNodesLoading = Common$1.getBestCount('unloadedGeometry', viewer.lastFrameChanged?1:3, 10,  4, 15 /*  , true  */ );//dur在iphoneX中静止有7,pc是2  //!lastFrameChanged静止时加速下载
 	        //THREE.Math.clamp(Math.round(9 - dur), 1, 6 ) 
-	        
+	        //console.log('unloadedGeometry',unloadedGeometry.length, 'maxNodesLoading',maxNodesLoading)
 	        //主要在手机端有效果。不改之前在展示的点云较多时前进会卡。
 	        for (let i = 0; i < Math.min(maxNodesLoading, unloadedGeometry.length); i++) {
 	            unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry); 
 	        }   
 	        if(!Potree.pointsLoading){
 	            Potree.pointsLoading = true;
-	            console.log('startLoad');
+	            //console.log('startLoad')
 	            viewer.dispatchEvent('startLoadPoints');
 	        }  
 	    }else {
 	        if(Potree.pointsLoading){
 	            Potree.pointsLoading = false;
-	            console.log('load done!');
+	            //console.log('load done!')
 	            setTimeout(()=>{
 	                Potree.pointsLoading || viewer.dispatchEvent('pointsLoaded');
 	            },50);
@@ -75420,10 +75423,10 @@ void main()
 	            pointBudget:browser.isMobile() ? 4*1000*1000 : 6*1000*1000,  //原本最高是8,但是大部分电脑都太卡了,降
 	            minNodeSize :   40 / window.devicePixelRatio  , //手机上因为像素点小,远一点的时候更需要加载密集的点云。(没事,有pointBudget限制着,会先从近处加载高级node,再远就不加载了)
 	        },
-	        screenshot:{
-	            maxLevelPercent: 1,  
+	        screenshot:{ //调试:bdvt10002_202309041033308810
+	            maxLevelPercent: 1,   
 	            pointBudget: 8*1000*1000,
-	            minNodeSize :   40 / window.devicePixelRatio  ,  
+	            minNodeSize:  30 / window.devicePixelRatio  ,  
 	        }
 	 
 	        //数值由testLevelSteps得来,其中nodeMaxLevel为2时,low和middle的都是1,如果真有这么低的点云就单独处理下。
@@ -76611,7 +76614,7 @@ void main()
 	            }
 	            num_ = num_ / (Potree.config.material.realPointSize / Potree.config.material.pointSize); //兼容 
 	               
-	            num_ = Math.pow(num_, 1.05) * 6; 
+	            num_ = Math.pow(num_, 1.05) * 5; 
 	             
 	            
 	            nodeMaxLevel = this.testMaxNodeCount >= Potree.config.testNodeCount1 ? this.nodeMaxLevel : this.nodeMaxLevelPredict.max; //防止刚开始因nodeMaxLevel没涨完,导致过大的点云突然出现
@@ -98216,7 +98219,14 @@ ENDSEC
 	        if(viewer.scene.pointclouds.some(e=>e.panos.length == 0)){
 	            //console.warn('存在数据集没有pano');
 	            viewer.hasNoPanoDataset = true;
-	        }   
+	        }  
+
+	        /* let floorList = this.panos.sort(a,b=>a.floorPosition.z - b.floorPosition.z)
+	        let midH = floorList[Math.floor(this.panos.length/2)]
+	        midH && (this.floorHeight = midH.floorPosition.z)
+	        */
+
+	        
 	    }
 	    
 	    
@@ -137248,8 +137258,7 @@ ENDSEC
 	        };
 	        
 	        let screenshot = ()=>{ 
-	            let pose;
-	            
+	            let pose; 
 	            useMap && (viewer.mapViewer.needRender = true);
 	            
 	            this.needRender = true;
@@ -137288,19 +137297,26 @@ ENDSEC
 	                updateCamera();       
 	                 
 	                finishDeferred.resolve({dataUrl, pose});
-	               
-	                console.log('screenshot done: '+sid);
-	            };
-	            
-	            {//恢复:
+	                
 	                setTimeout(()=>{
 	                    if(!this.screenshoting){
-	                        Potree.settings.pointNoLimit = false;  
+	                        //Potree.settings.pointNoLimit = false  
 	                        Potree.settings.pointDensity = 'high';
+	                        console.log('恢复pointDensity');
+	                        if(viewer.scene.pointclouds[0].material.oldSize_ ){
+	                            viewer.scene.pointclouds[0].material.size = viewer.scene.pointclouds[0].material.oldSize_; 
+	                            viewer.scene.pointclouds[0].material.oldSize_ = null;   
+	                        }                        
 	                    }
-	                },100); //延迟:避免连续多次截图时释放点云
+	                },500); //延迟:避免连续多次截图时释放点云
 	                this.screenshoting = false;
 	                
+	                console.log('screenshot done: '+sid);
+	            };
+	            
+	            {//恢复:
+	                
+	                
 	                
 	                if(info.type == 'measure'){
 	                    this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true));
@@ -137414,8 +137430,77 @@ ENDSEC
 	                                
 	        
 	        //Potree.settings.pointNoLimit = true //使点云加载不受 pointBudget限制, 但缓存还是会有一个最大限制
-	        Potree.settings.pointDensity = 'screenshot';
+	        Potree.settings.pointDensity = 'screenshot'; //提高pointBudget
+	            
+	            
+	            
+	            
+	        let waitPointLoad = (done)=>{ 
+	            let finish;
+	            let dealDone = ()=>{
+	                viewer.removeEventListener('overPointBudget',decreaseLevel);      
+	                finish || done();
+	                finish = true;
+	            };
+	            done = done || screenshot; 
+	           
+	             
+	            //是否是俯视或仰视的视角,这样看马路等平面的话尽量每处点云level都一致不要密度不同:
+	            let floorplanView = viewer.mainViewport.camera.type == 'OrthographicCamera';  
+	            if(!floorplanView){
+	                let pano = this.images360.findNearestPano();
+	                let dis = pano.position.distanceTo(this.mainViewport.camera.position);
+	                if(dis > 3) floorplanView = true; //离远一点的平视希望也是全部加载好。勉强只能这么写
+	                console.log('floorplanView',floorplanView);
+	            }    
+	                 
+	            let maxTime = floorplanView ? 10000 : 2000;    //注意交通一般要截图两次,先截带测量线的 
+	            setTimeout(()=>{
+	                if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载 
+	                    viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确) 
+	                        if(!finish)console.log('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints);                         
+	                        dealDone();
+	                    },{once:true});
+	                    let lastNumVisiblePoints;  
+	                    if(floorplanView){ //perspective的不需要,远处加载不完也没大碍
+	                        setTimeout(()=>{//超时不候 
+	                            if(!finish /* && Potree.numVisiblePoints > Potree.pointBudget * 0.7  */){
+	                                console.log('加载时间达最长限制的40%,降level, numVisiblePoints', Potree.numVisiblePoints);  
+	                                lastNumVisiblePoints = Potree.numVisiblePoints;      
+	                                decreaseLevel(); //加载时间过长 
+	                            } 
+	                        },maxTime*0.4);
+	                        setTimeout(()=>{// 第一次降有可能没效果,因为大部分level不是最高的
+	                            if(!finish && (Potree.numVisiblePoints - lastNumVisiblePoints) > -10000  ){ //没怎么降
+	                                console.log('加载时间达最长限制的50%,降level, numVisiblePoints', Potree.numVisiblePoints);        
+	                                decreaseLevel(); //加载时间过长
+	                            } 
+	                        },maxTime*0.5);
+	                    }
+	                    setTimeout(()=>{//超时不候 
+	                        if(!finish)console.log('超时, numVisiblePoints', Potree.numVisiblePoints);  
+	                        dealDone();
+	                    },maxTime);
+	                }else {
+	                    dealDone();
+	                } 
+	            },200);//先加载一段时间
+	            
+	            
+	            let decreaseLevel = ()=>{ //降点云level
+	                let levels = viewer.scene.pointclouds[0].visibleNodes.map(e=>e.getLevel()); 
+	                console.log(levels);
+	                let actMaxLevel = Math.max.apply(null, levels); //实际加载到的最高的node level
+	                console.log('decreaseLevel, 新maxLevel', actMaxLevel - 1, '原maxlevel', viewer.scene.pointclouds[0].maxLevel, 'numVisiblePoints', Potree.numVisiblePoints); 
+	                viewer.scene.pointclouds[0].maxLevel = actMaxLevel - 1;
+	                viewer.scene.pointclouds[0].material.oldSize_ = viewer.scene.pointclouds[0].material.size;
+	                viewer.scene.pointclouds[0].material.size *= 1.5;
+	            };
 	            
+	            viewer.addEventListener('overPointBudget',decreaseLevel ); //因超出budget而无法加载的话
+	          
+	            
+	        };
 	        
 	        
 	        if(info.type == 'measure'){//要截图双屏 
@@ -137471,22 +137556,8 @@ ENDSEC
 	                
 	            });
 	            
-	        }else { 
-	            //viewer.dispatchEvent('content_changed')
-	            setTimeout(()=>{
-	                if(Potree.pointsLoading){//如果还在加载
-	                    viewer.addEventListener('pointsLoaded',()=>{
-	                        screenshot(); 
-	                    },{once:true});
-	                }else {
-	                    screenshot(); 
-	                } 
-	            },300);//先加载一段时间
-	            
-	            
-	            
-	            
-	            
+	        }else {  
+	            waitPointLoad(); 
 	            
 	            
 	        }            
@@ -139538,7 +139609,7 @@ ENDSEC
 	let pointBudget = 1 * 1000 * 1000;
 	let framenumber = 0;
 	let numNodesLoading = 0;
-	let maxNodesLoading =  4; 
+	let maxNodesLoading = 6; 
 
 	const debug = {};
 

文件差異過大導致無法顯示
+ 1 - 1
public/static/lib/potree/potree.js.map