xzw 1 year ago
parent
commit
a38062522c

+ 1 - 1
src/ExtendPointCloudOctree.js

@@ -550,7 +550,7 @@ export class ExtendPointCloudOctree extends PointCloudOctree{
             }
             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没涨完,导致过大的点云突然出现

+ 1 - 1
src/Potree.js

@@ -111,7 +111,7 @@ console.log('Potree ' + version.major + '.' + version.minor + version.suffix);
 export let pointBudget = 1 * 1000 * 1000;
 export let framenumber = 0;
 export let numNodesLoading = 0;
-export let maxNodesLoading =  4; 
+export let maxNodesLoading = 6; 
 
 export const debug = {};
 

+ 1 - 1
src/custom/modules/clipModel/Clip.js

@@ -61,7 +61,7 @@ var Clip = {
 
     setBoxPose(){
         //box底部不变,永远在bound的底部。但top会根据height改变
-         
+        this.box.position.copy(viewer.bound.center)
         let boxData = this.getBoxData()
         this.setRot(boxData.rotAngle)  
         this.setScale(boxData.scaleXY)

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

@@ -1464,7 +1464,14 @@ export class Images360 extends THREE.EventDispatcher{
         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)
+        */
+
+        
     }
     
     

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

@@ -743,13 +743,15 @@ export class Measure extends ctrlPolygon{
         
     }
     
-    focus({dontMoveCamera=false}={}){  
+    focus({dontMoveCamera=false}={}){ 
+        if(this.clickSelected)return    
         if(Potree.settings.displayMode == 'showPanos')dontMoveCamera = true  //2023.10.24 新需求:点击后不移动,否则经常跳到别的点。且在app上会反应一秒才选中。
+        
         if(!dontMoveCamera){
             let dontChangeCamDir = viewer.mainViewport.camera.type == 'OrthographicCamera' /* && math.closeTo( viewer.mainViewport.view.pitch , -1.57079632)  */ // 不改角度
             viewer.focusOnObject(this, 'measure', null, {dontChangeCamDir})
         }
-        if(this.clickSelected)return
+        
         this.setSelected(true, 'focus')
         this.dispatchEvent({type:'selected', state:true})
         this.clickSelected = true

+ 12 - 9
src/custom/potree.shim.js

@@ -1201,11 +1201,10 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
 		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)=>{
 
@@ -1315,9 +1314,13 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
 		}
 
 		if (!Potree.settings.pointNoLimit && numVisiblePoints + node.getNumPoints() > Potree.pointBudget) {
+            Potree.overPointBudget = true
+            viewer.dispatchEvent('overPointBudget'); 
 			break;
 		}
-
+        Potree.overPointBudget = false
+        
+        
 		if (!visible) {
 			continue;
 		}
@@ -1470,22 +1473,22 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
             unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry); 
         }  */ 
         
-        let maxNodesLoading = Common.getBestCount('unloadedGeometry', viewer.lastFrameChanged?1:3, 6,  4, 15 /*  , true  */ )//dur在iphoneX中静止有7,pc是2  //!lastFrameChanged静止时加速下载
+        let maxNodesLoading = Common.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)

+ 3 - 3
src/custom/settings.js

@@ -143,10 +143,10 @@ const config = {//配置参数   不可修改
             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,如果真有这么低的点云就单独处理下。

+ 74 - 19
src/custom/viewer/ViewerNew.js

@@ -3291,19 +3291,26 @@ export class Viewer extends ViewerBase{
                 updateCamera()       
                  
                 finishDeferred.resolve({dataUrl, pose})
-               
-                console.log('screenshot done: '+sid)
-            }
-            
-            {//恢复:
+                
                 setTimeout(()=>{
                     if(!this.screenshoting){
                         //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))
@@ -3417,28 +3424,76 @@ export class Viewer extends ViewerBase{
                                 
         
         //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 
-            let maxTime = 5000;    //注意交通一般要截图两次
+           
+             
+            //是否是俯视或仰视的视角,这样看马路等平面的话尽量每处点云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){//如果还在加载
-                    let finish
-                    
-                    viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确)
-                        finish || done() 
-                        finish = true
+                if(Potree.pointsLoading && Potree.settings.displayMode == 'showPointCloud'){//如果还在加载 
+                    viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确) 
+                        if(!finish)console.log('加载完毕', ' numVisiblePoints', Potree.numVisiblePoints)                         
+                        dealDone()
                     },{once:true})
-                    
-                    setTimeout(()=>{//超时不候
-                        finish || done() 
-                        finish = 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{
-                    done() 
+                    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而无法加载的话
+          
+            
         }
         
         

+ 2 - 2
src/materials/shaders/pointcloud_new.vs

@@ -746,8 +746,8 @@ float getPointSize(){
 	#elif defined attenuated_point_size
 		if(uUseOrthographicCamera){
 			//pointSize = size * 100.0;  //加个乘数
-            
-            pointSize = size / uOrthoWidth  * resolution.x; //改成近似adaptive_point_size根据窗口缩放
+                //2023.11.1多加一个*2.0
+            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,边缘放大

+ 4 - 3
src/navigation/InputHandlerNew.js

@@ -8,8 +8,9 @@ import * as THREE from "../../libs/three.js/build/three.module.js";
 import {KeyCodes} from "../KeyCodes.js";
 import {Utils} from "../utils.js"; 
 import Common from "../custom/utils/Common.js";
-import DepthBasicMaterial from '../custom/materials/DepthBasicMaterial.js'
- 
+import DepthBasicMaterial from '../custom/materials/DepthBasicMaterial.js' 
+import browser from "../custom/utils/browser.js"; 
+
 
 let {Buttons} = Potree.defines
 
@@ -1349,7 +1350,7 @@ export class InputHandler extends THREE.EventDispatcher {
         }else{
             raycaster.params.Line.threshold = 0.04; //相对长度 
         } 
-        raycaster.params.Line2 = {threshold :20 } //拓宽的lineWidth
+        raycaster.params.Line2 = {threshold : browser.isMobile()?100:20  } //拓宽的lineWidth
         
         //raycaster.layers.enableAll()//add
         Potree.Utils.setCameraLayers(raycaster,   //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)