ソースを参照

截图等待加载点云,且提高质量

xzw 1 年間 前
コミット
021e849ef9

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

@@ -1470,7 +1470,7 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
         
         let maxNodesLoading = Common.getBestCount('unloadedGeometry', viewer.lastFrameChanged?1:3, 6,  4, 15 /*  , true  */ )//dur在iphoneX中静止有7,pc是2  //!lastFrameChanged静止时加速下载
         //THREE.Math.clamp(Math.round(9 - dur), 1, 6 ) 
-        //console.log('maxNodesLoading',)
+        //console.log('unloadedGeometry', unloadedGeometry.length)
         //主要在手机端有效果。不改之前在展示的点云较多时前进会卡。
         for (let i = 0; i < Math.min(maxNodesLoading, unloadedGeometry.length); i++) {
             unloadedGeometry[i].node.load(unloadedGeometry[i].pointcloud.pcoGeometry); 
@@ -1478,17 +1478,22 @@ Potree.updateVisibility = function(pointclouds, camera, areaSize){
         if(!Potree.pointsLoading){
             Potree.pointsLoading = true
             //console.log('startLoad')
+            viewer.dispatchEvent('startLoadPoints')
         }  
     }else{
         if(Potree.pointsLoading){
             Potree.pointsLoading = false
             //console.log('load done!')
+            setTimeout(()=>{
+                Potree.pointsLoading || viewer.dispatchEvent('pointsLoaded')
+            },50) 
         } 
     }
     
     
     
     
+    
     //add:
     Potree.numVisiblePoints = numVisiblePoints
    

+ 5 - 1
src/custom/settings.js

@@ -146,8 +146,12 @@ const config = {//配置参数   不可修改
             percentByUser:true,
             pointBudget:browser.isMobile() ? 3*1000*1000 : 6*1000*1000,  //原本最高是8,但是大部分电脑都太卡了,降
             minNodeSize :   20 / window.devicePixelRatio  , //手机上因为像素点小,远一点的时候更需要加载密集的点云。(没事,有pointBudget限制着,会先从近处加载高级node,再远就不加载了)
+        },
+        screenshot:{
+            maxLevelPercent: 1,  
+            pointBudget: 8*1000*1000,
+            minNodeSize :   40 / window.devicePixelRatio  ,  
         }
-       
  
         //数值由testLevelSteps得来,其中nodeMaxLevel为2时,low和middle的都是1,如果真有这么低的点云就单独处理下。
         //多个viewport尽量保证pointBudget一样,或者pointBudget不能太低于所需,否则会反复加载了又清除

+ 62 - 20
src/custom/viewer/ViewerNew.js

@@ -687,8 +687,11 @@ export class Viewer extends ViewerBase{
         })
         
          
-        this.addEventListener('pointcloud_changed',(e)=>{
-            this.lazyRenderViewports()
+        this.addEventListener('pointcloud_changed',(e)=>{ 
+            if(this.screenshoting){
+                this.viewports.filter(e=>!e.noPointcloud).forEach(e =>e.needRender = true) 
+            }
+            else this.lazyRenderViewports()
         })
         
         
@@ -865,7 +868,7 @@ export class Viewer extends ViewerBase{
         
         let now = Date.now()  
        
-        let count = 1 
+        let maxRenderCount = 1 
           
         viewports.forEach(e=>{ 
             if(now - e.lastRenderTime  > maxWaitTime){
@@ -873,20 +876,20 @@ export class Viewer extends ViewerBase{
             }
         }) 
         
-        let useCount = viewports.filter(e=>e.needRender).length 
-        //console.log('useCount', useCount)
+        let renderCount = viewports.filter(e=>e.needRender).length 
+        //console.log('renderCount', renderCount)
          
-        let list = viewports.filter(e=>!e.needRender).sort((a,b)=>a.lastRenderTime - b.lastRenderTime)
+        let list = viewports.filter(e=>!e.needRender).sort((a,b)=>a.lastRenderTime - b.lastRenderTime)//没有准备render的,按上次渲染时间排序,作为候补
      
-        if(useCount < count){ 
-            list.slice(0, count - useCount).forEach(e=>{
+        if(renderCount < maxRenderCount){ //还有名额,补齐
+            list.slice(0, maxRenderCount - renderCount).forEach(e=>{
                 e.needRender = true
             })   
-        }else if(list[0] && now - list[0].lastRenderTime  > maxWaitTime){
+        }else if(list[0] && now - list[0].lastRenderTime > maxWaitTime){//名额不足时,考虑候补队列第一个是否超时,超时的话也渲染
             list[0].needRender = true
         } 
-         
-         
+          
+        
     }
     
     
@@ -3528,6 +3531,14 @@ export class Viewer extends ViewerBase{
             
             {//恢复:
                 
+                setTimeout(()=>{
+                    if(!this.screenshoting){
+                        //otree.settings.pointNoLimit = false  
+                        Potree.settings.pointDensity = 'high'
+                    }
+                },100) //延迟:避免连续多次截图时释放点云
+                this.screenshoting = false
+                
                 if(info.type == 'measure'){
                     this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e, 'screenshot',true))
                     info.measurement.setSelected(false, 'screenshot')
@@ -3611,10 +3622,38 @@ export class Viewer extends ViewerBase{
             }) 
         }                    
         Potree.Utils.updateVisible(this.reticule, 'screenshot', false)//令reticule不可见 
-                                
+                            
+                            
+        Potree.settings.pointDensity = 'screenshot'
         
         
         
+        let waitPointLoad = (done)=>{ 
+            done = done || screenshot 
+            let maxTime = 5000;
+            setTimeout(()=>{
+                if(Potree.pointsLoading){//如果还在加载
+                    let finish
+                    
+                    viewer.addEventListener('pointsLoaded',()=>{ //点云加载完时(不一定准确)
+                        finish || done() 
+                    },{once:true})
+                    
+                    setTimeout(()=>{//超时不候
+                        done();
+                        finish = true
+                    },maxTime)
+                }else{
+                    done() 
+                } 
+            },200)//先加载一段时间
+        }
+        
+        
+         
+            
+        let waitPointsTime = Potree.settings.displayMode == 'showPointCloud' ? 300 : 0 //等点云加载  
+        
         
         if(info.type == 'measure'){//要截图双屏 
             this.scene.measurements.forEach(e=>Potree.Utils.updateVisible(e,'screenshot',e == info.measurement)  )
@@ -3629,21 +3668,23 @@ export class Viewer extends ViewerBase{
              
             let begin = ()=>{
                 useMap = this.mapViewer.attachedToViewer 
-                updateCamera()
-                let waitTime = Potree.settings.displayMode == 'showPointCloud' ? 500 : 0 //等点云加载 网速差的话还是加载稀疏  是否要用最高质量点云
+                updateCamera() 
                 if(useMap){
                     let waitMap = ()=>{
                         //console.log('waitMap: '+sid)
                         this.mapViewer.waitLoadDone(screenshot.bind(this))//等待地图所有加载完 
                     }  
-                    setTimeout(waitMap.bind(this), waitTime)  
-                }else{ 
-                    setTimeout(screenshot.bind(this), waitTime)
                     
+                    waitPointLoad(waitMap)
+                    
+                    //setTimeout(waitMap.bind(this), waitPointsTime)  
+                }else{ 
+                    //setTimeout(screenshot.bind(this), waitPointsTime)
+                    waitPointLoad()
                 } 
             }
             
-            let {promise}= this.focusOnObject(info.measurement, 'measure', 0,     {basePanoSize:1024}  )//注意:不同角度截图 得到三维的会不一样,因为focusOnObject是根据方向的
+            let {promise} = this.focusOnObject(info.measurement, 'measure', 0,     {basePanoSize:1024}  )//注意:不同角度截图 得到三维的会不一样,因为focusOnObject是根据方向的
             promise.done(()=>{  
                 //console.log('promise.done') 
                 //根据当前位置更新floorplan显示
@@ -3669,14 +3710,15 @@ export class Viewer extends ViewerBase{
             })
             
         }else{
-            screenshot()
+             
+            waitPointLoad()
         }            
          
          /*
             测量线的截图因为要调用分屏的,会改变画面
             但是普通截图的话,不会改变画面
          */
- 
+        this.screenshoting = true
         return {getImagePromise:getImageDeferred.promise(), finishPromise:finishDeferred.promise()}
         
         

+ 1 - 1
src/viewer/EDLRendererNew.js

@@ -197,7 +197,7 @@ export class EDLRenderer{//Eye-Dome Lighting 眼罩照明
         
         let target = params.target || null
         
-        const resolution = (rtEDL && Potree.settings.useRTPoint) ? new THREE.Vector2(rtEDL.width,rtEDL.height) : params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());//突然发现mobile用resolution2点云会放大
+        const resolution = (rtEDL && Potree.settings.useRTPoint) ? new THREE.Vector2(rtEDL.width,rtEDL.height) : params.target ? new THREE.Vector2(params.target.width, params.target.height ) : params.viewport ? params.viewport.resolution2 : this.viewer.renderer.getSize(new THREE.Vector2());//截图时需要用target的大小