xzw 3 дней назад
Родитель
Сommit
5637cf5cd3

+ 38 - 12
src/custom/modules/panos/Images360.js

@@ -254,7 +254,8 @@ export class Images360 extends THREE.EventDispatcher{
                 
                 
                 viewer.addEventListener('allLoaded',()=>{ 
-                    let interval = setInterval(()=>{ 
+                    let interval = setInterval(()=>{    
+                        if(!viewer.scene.pointclouds[0])return
                         let attrs = viewer.scene.pointclouds[0].root.geometryNode?.geometry.attributes || viewer.scene.pointclouds[0].root.geometry?.attributes
                         if(!attrs) return
                         if(attrs.ir){
@@ -310,6 +311,7 @@ export class Images360 extends THREE.EventDispatcher{
             this.domRoot.appendChild(elDisplayModel[0]);
             elDisplayModel.on("click", (e) => { 
                 if(Potree.settings.displayMode == 'showPointCloud' && this.panos.length == 0)return
+                elDisplayModel.text( Potree.settings.displayMode == 'showPointCloud' ? '点云' : '全景')
                 Potree.settings.displayMode = Potree.settings.displayMode == 'showPointCloud' ? 'showPanos' : 'showPointCloud'
             });
  
@@ -1781,7 +1783,7 @@ export class Images360 extends THREE.EventDispatcher{
             }  );
         } else {
             //如果离数据集较远,转动也很难找到点云,就飞到就近点:
-            if(Potree.settings.displayMode == 'showPointcloud'){
+            if(Potree.settings.displayMode == 'showPointCloud'){
                 let po = viewer.scene.pointclouds.find(e=>e.visibleNodes.some(a=>a.getLevel() > Math.ceil(e.maxLevel * 0.15) )) //虽然当点云在前方很远的地方也可能符合
                  
                 if(!po){//无可见点云
@@ -2017,7 +2019,7 @@ export class Images360 extends THREE.EventDispatcher{
     updateTileDownloader(t, vectorForward) { 
         var i = this.nextPano || this.currentPano; 
         if(i){  
-            this.tileDownloader.tilePrioritizer.updateCriteria(i, viewer.scene.view.position.clone() , vectorForward, t.length > 0 ? t : null),
+            this.tileDownloader.tilePrioritizer?.updateCriteria(i, viewer.scene.view.position.clone() , vectorForward, t.length > 0 ? t : null),
             this.tileDownloader.processPriorityQueue = !0 
         }  
     } 
@@ -2383,7 +2385,7 @@ export class Images360 extends THREE.EventDispatcher{
 
     addHighMapCube(){//创建8*8的tile  cube   主要因手机版崩溃  要在电脑端测试得设置maxRenderTargetSize
         
-        if( this.qualityManager.maxRenderTargetSize < Potree.settings.tileClass){
+        if( this.qualityManager.maxRenderTargetSize < Potree.settings.tileClass && !this.highMapCube){
             
             var geo = new THREE.PlaneGeometry(1, 1, 1, 1)
             var cube = new THREE.Object3D;
@@ -2529,31 +2531,54 @@ export class Images360 extends THREE.EventDispatcher{
             /* let hcos = Math.cos(hfov / 2)
             let vcos = Math.cos(vfov / 2)  */
             let list = this.highMapCube.tiles
+            let frustumMatrix = new THREE.Matrix4
+                frustumMatrix.multiplyMatrices(camera.projectionMatrix, camera.matrixWorldInverse)
+            let frustum = new THREE.Frustum();
+                frustum.setFromProjectionMatrix(frustumMatrix) 
+            let p_ = new THREE.Vector3
+             
+            //屏幕外的不显示    
             list.forEach(e => {
-                //屏幕外的不显示
-                let pos = e.getWorldPosition(new THREE.Vector3())
+               /*  let pos = e.getWorldPosition(new THREE.Vector3())
                 let dir = new THREE.Vector3().subVectors(pos, this.highMapCube.position).normalize()
-
+                //再看好像不对
                 let hcos_ = dir.clone().setZ(direction.z).normalize().dot(direction) //在direction的斜面上水平角度差
                 let hRad = Math.acos(hcos_)
                 let vRad = -200
-                if (/* hRad > hfov + 0.08 */ hRad / hfov > 1.5 ) {   
+                if ( hRad / hfov > 1.5 ) {   
                     e.score = -100
                 } else {
                     vRad = Math.abs(Math.acos(dir.z) - Math.acos(direction.z))
-                    if (/* vRad > vfov + 0.08 */ vRad / vfov > 1.5 ) {
+                    if ( vRad / vfov > 1.5 ) {
                         e.score = -100
                     } else {
                         e.score = -(hRad / hfov + vRad / vfov)
                     }
-                }
-                e.scores = hRad.toFixed(3) + ', ' + vRad.toFixed(3)
-
+                } */
+                let a = frustum.intersectsObject(e)//外包围球粗略判断
+                if(a){//显示所有在屏幕上有显示的tile
+                    e.score = 1 
+                    /* for(let i=0;i<4;i++){//精确计算,检测是否四个顶点都在屏幕内(虽然减少不了多少个  )
+                        p_.copy(e.geometry.vertices[i]).applyMatrix4(e.matrixWorld) 
+                       
+                        if(history_.find(o=>math.closeTo(o,p_)) || frustum.containsPoint(p_) ){
+                            e.score = 2 
+                            history_.push(  p_.clone() )
+                            break
+                        }//  
+                         若tile底部横跨屏幕,且中心点不在屏幕,将检测不到,所以不算了
+                    */  
+                }else e.score = -100 
+                //e.score = frustum.intersectsObject(e) ? 1 : -100
+                //e.scores = hRad.toFixed(3) + ', ' + vRad.toFixed(3) 
                 if (e.score == -100) {
                     this.resetTile(e)
                 }
             })
             this.highMapCube.visibleTiles = list.filter(e => e.score > -100)
+            
+            
+            //console.log('cost', performance.now() - time, 'same',same)
             //list.forEach(e=>e.scoreLabel.setText(e.scores))
         }
 
@@ -2653,6 +2678,7 @@ export class Images360 extends THREE.EventDispatcher{
     }    
     
     
+    //融合页面加了个canUseMapCube,但这边tileClass必不小于4096所以不改了                                                                                                                        
     
     
     resetHighMap() {

+ 1 - 1
src/custom/modules/panos/tile/QualityManager.js

@@ -40,7 +40,7 @@ export default class QualityManager {
         } 
         Potree.settings.tileClass = parseInt(resolution) * 1024 */
         let maxTileClass = 0
-        viewer.scene.pointclouds.forEach(e=>{
+        viewer.scene.pointclouds.concat(viewer.objs.children).filter(e=>e.panos?.length).forEach(e=>{
             maxTileClass = Math.max(maxTileClass, e.tileClass)
         })
         Potree.settings.tileClass = maxTileClass

+ 2 - 2
src/custom/objects/tool/MeasuringTool.js

@@ -584,7 +584,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
             }); */
             
             this.isAdding = false
-            
+            measure.editStateChange(false)
             measure.dispatchEvent('createDone')
 		};
 
@@ -598,7 +598,7 @@ export class MeasuringTool extends THREE.EventDispatcher{
             } 
             
              
-            measure.editStateChange(false)
+            
             measure.cannotConfirmNormal = false  //一些dropMarker中的句子
             measure.guideLine && (measure.guideLine.visible = false)
             /*

+ 2 - 2
src/custom/start.js

@@ -1,7 +1,7 @@
 import * as THREE from "../../libs/three.js/build/three.module.js";
 
  
-
+ 
 
 import math from './utils/math.js' 
 import browser from './utils/browser.js' 
@@ -11,7 +11,7 @@ import ReportInfoStream from './utils/reportInfoStream.js'
 import {lerp} from './utils/transitions.js' 
  
 window.THREE = THREE
-
+   
 let baseZ = 0  //所以数据集高度都要减去这个值。在laser场景里该值为初始数据集的高程
 Potree.datasetData = []
 

+ 2 - 2
src/custom/viewer/ViewerNew.js

@@ -326,13 +326,13 @@ export class Viewer extends ViewerBase{
                     let potreeMap = $(`
                         <div id="potree_quick_buttons" class="quick_buttons_container" style="">
                         </div>
-                    `);
+                    `); 
   
                     $(domElement).append(potreeMap);
                 }
                 
                 //add
-                { 
+                if(!args.noMap){ 
                     $(domElement).append($("<div id='potree_labels'></div>"));
                     if(!mapArea && (Potree.settings.editType != 'merge' /* || Potree.settings.showObjectsOnMap */)){
                         mapArea = $("<div id='mapGaode'></div>");

+ 1 - 0
src/viewer/View.js

@@ -40,6 +40,7 @@ export class View{//base
 	}
 
 	set pitch (angle) {
+        if(isNaN(angle))debugger
         if(!this.rollFree){
             this._pitch = Math.max(Math.min(angle, this.maxPitch), this.minPitch);
         }else{