xzw 1 هفته پیش
والد
کامیت
628b915d98

+ 5 - 5
libs/three.js/3dtiles/three-loader-3dtiles.esm.js

@@ -9506,7 +9506,7 @@ class TileHeader {
       this.content = await load(contentUrl, loader, options);
 
         // !zeg改
-        if (/* this.tileset.options. */maxDepth < this.depth && this.type == 'scenegraph') {//有的场景depth为1的不是mesh,只是json,即实际最低depth>1
+        if (/* this.tileset.options. */maxDepth < this.depth && this.type == 'scenegraph' && this.parent.type == 'scenegraph') {//如果limit2了,就只加载到最低层的mesh
             this.unloadContent()
             return false
         }
@@ -10503,8 +10503,8 @@ class Tileset3D extends EventDispatcher{//xzw add EventDispatcher
        //this.boundWhole.expandByPoint(center) 
     } 
   }
- 
-  _initializeTileHeaders(tilesetJson, parentTileHeader) {//建立该tileset的某个json所有tile     xzw改
+  
+  _initializeTileHeaders(tilesetJson, parentTileHeader) {//建立该tileset的某个json所有tile 初始化该tileset的层级结构?     xzw改
     
    
     this.changeHeaderBoundSphere(tilesetJson.root, tilesetJson)//add
@@ -10525,7 +10525,7 @@ class Tileset3D extends EventDispatcher{//xzw add EventDispatcher
         const children = tile.header.children || [];
 
         // !zeg改  
-        if(tile.depth < /* this.options. */maxDepth){                                     
+        //if(tile.depth < /* this.options. */maxDepth){                                     
             for (const childHeader of children) {
                 this.changeHeaderBoundSphere(childHeader, tilesetJson) //xzw add
               const childTile = new TileHeader(this, childHeader, tile);
@@ -10533,7 +10533,7 @@ class Tileset3D extends EventDispatcher{//xzw add EventDispatcher
               childTile.depth = tile.depth + 1;
               stack.push(childTile);
             }
-        }
+        //}
         window.maxTileDepth = Math.max(window.maxTileDepth||0,   tile.depth)
       }
     }

+ 22 - 4
src/custom/modules/mergeModel/MergeEditor.js

@@ -34,7 +34,8 @@ const viewportProps = [{
     direction : new THREE.Vector3(0,0,-1), //镜头朝向 
     active: true,
     //相机位置在z轴正向
-    limitBound: new THREE.Box3(new THREE.Vector3(-Infinity,-Infinity, 1),new THREE.Vector3(Infinity,Infinity,5000)), //在地面以上
+    viewContainsPoints:[new THREE.Vector3(0,0,0)],//为了看到ground
+   // limitBound: new THREE.Box3(new THREE.Vector3(-Infinity,-Infinity, 1),new THREE.Vector3(Infinity,Infinity,5000)), //在地面以上
     margin:{x:50, y:150} ,
 },
 {
@@ -46,7 +47,7 @@ const viewportProps = [{
     direction : new THREE.Vector3(1,0,0), 
     active: true,
     //相机位置在x轴负向  右下角屏
-    viewContainsPoints:[new THREE.Vector3(0,0,0)],
+    viewContainsPoints:[new THREE.Vector3(0,0,0)],//为了看到轴线
     margin:{x:300, y:250} ,
 } ]
 let cylinderSkyGeo, oldSkyGeo
@@ -414,7 +415,7 @@ let MergeEditor = {
         let rightViewport = viewer.viewports.find(e=>e.name == 'right')
         let topViewport = viewer.viewports.find(e=>e.name == 'top')
         topViewport.alignment = true
-        rightViewport.rotateSide = true  
+        rightViewport.rotateSide = true   
         rightViewport.skyboxFixPos = true
         rightViewport.skyboxMinZoom = 10
         rightViewport.skyboxRenderFun = ()=>{// 使cube的一面永远正向镜头。 因侧视图的camera是ortho类型,需要平视mesh才不会拉伸
@@ -443,8 +444,23 @@ let MergeEditor = {
         viewer.compass.changeViewport(viewer.viewports[1])
         viewer.compass.setDomPos()
         
-        
         //this.changeSkyboxGeo(true)
+        /* 
+        if(this.selected){
+            this.splitFarFun = ()=>{//移动位置后两边都要更新far
+                viewer.viewports.forEach(v=>{
+                    let far = this.SplitScreen.getCamFar(v)
+                    v.camera.far = far 
+                    v.camera.updateProjectionMatrix()
+                })
+                
+            }
+            this.selected.addEventListener('transformChanged',  this.splitFarFun)
+                 
+            this.splitFarFun()
+        } */
+        this.SplitScreen.updateCameraOutOfModel()
+        
     },
     
     
@@ -452,6 +468,7 @@ let MergeEditor = {
         this.split = false
         this.SplitScreen.unSplit()    
         viewer.setControls(viewer.orbitControls)
+        //this.selected?.removeEventListener('transformChanged',  this.splitFarFun)
         
         Potree.settings.pointDensity = this.beforeSplit.pointDensity
         /* if(this.selected && this.selected.isPointcloud){ 
@@ -473,6 +490,7 @@ let MergeEditor = {
     
     rotateSideCamera(angle){
         this.SplitScreen.rotateSideCamera(viewer.viewports.find(e=>e.name == 'right'), angle)
+        
     },
     
     setTransformState(state){//校准时

+ 19 - 8
src/custom/utils/SplitScreen.js

@@ -85,7 +85,7 @@ class SplitScreen extends THREE.EventDispatcher{
         viewport.targetPlane.setFromNormalAndCoplanarPoint( view.direction.clone(), boundCenter )  
         viewport.targetPlane.projectPoint(center, viewport.shiftTarget)  //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
          
-        info.endPosition = this.getPosOutOfModel(viewport, boundSize) 
+        info.endPosition = this.getPosOutOfModel(viewport, boundSize).position
         
         //if(viewport.name == 'mapViewport')info.endPosition.z = Math.max(Potree.config.map.cameraHeight, info.endPosition.z) 
          
@@ -123,12 +123,20 @@ class SplitScreen extends THREE.EventDispatcher{
         //let {boundSize, center} = viewer.bound
         boundSize = boundSize || this.getViewBound(viewport).boundSize
         let expand = 10; 
-        let radius = boundSize.length() * 2 
-        let position = viewport.shiftTarget.clone().sub(viewport.view.direction.clone().multiplyScalar(radius + expand))  
-         
-        return position 
+        let radius = (viewport.rotateSide ? boundSize.length() : boundSize.clone().projectOnVector(viewport.view.direction).length()) * 2 
+        let far =  radius + expand
+        let position = viewport.shiftTarget.clone().sub(viewport.view.direction.clone().multiplyScalar(far))  
+        far *= 2 //for camera.  
+        return { position, far} 
     } 
     
+    /* getCamFar(viewport){
+        let boundSize = this.getViewBound(viewport).boundSize
+        let expand = 30; 
+        let radius = boundSize.length() * 2 
+        return   expand + radius   
+    } */
+    
     updateCameraOutOfModel(){//因为移动模型导致模型超出相机外,所以更新位置
         viewer.viewports.forEach((viewport, i )=>{
             if(viewport.camera.isOrthographicCamera){ //or if(viewport.targetPlane) 
@@ -137,9 +145,12 @@ class SplitScreen extends THREE.EventDispatcher{
                 viewport.targetPlane.projectPoint(viewport.view.position, viewport.shiftTarget)  //target转换到过模型中心的平面,以保证镜头一定在模型外 this.shiftTarget是得到的
                 */ 
                 this.setShiftTarget(viewport, boundCenter)
-                let endPosition = this.getPosOutOfModel(viewport, boundSize) 
+                let {position, far} = this.getPosOutOfModel(viewport, boundSize) 
                  //if(viewport.name == 'mapViewport')endPosition.z = Math.max(Potree.config.map.cameraHeight, endPosition.z) 
-                viewport.view.position.copy(endPosition)
+                
+                viewport.view.position.copy(position)
+                viewport.camera.far = far
+                viewport.camera.updateProjectionMatrix()
             } 
         })  
     }  
@@ -177,7 +188,7 @@ class SplitScreen extends THREE.EventDispatcher{
         viewport.shiftTarget.subVectors(center,vec) //新的
         
         
-        viewport.view.position = this.getPosOutOfModel(viewport, boundSize)
+        viewport.view.position.copy(this.getPosOutOfModel(viewport, boundSize).position)
         
     }