xzw 6 ماه پیش
والد
کامیت
20906a7281
4فایلهای تغییر یافته به همراه65 افزوده شده و 19 حذف شده
  1. 47 2
      libs/three.js/3dtiles/three-loader-3dtiles.esm.js
  2. 1 1
      src/custom/mergeStartTest.js
  3. 10 9
      src/custom/start.js
  4. 7 7
      src/custom/viewer/ViewerNew.js

+ 47 - 2
libs/three.js/3dtiles/three-loader-3dtiles.esm.js

@@ -9298,6 +9298,8 @@ class TileHeader {
     
     _defineProperty(this, "posCount", 0);//add 
     _defineProperty(this, "texArea", 0);//add 
+    _defineProperty(this, "floorIndex", null);//add 
+    
     
     this.header = header;
     this.tileset = tileset;
@@ -9307,6 +9309,10 @@ class TileHeader {
     this.refine = this._getRefine(header.refine);
     this.type = header.type;
     this.contentUrl = header.contentUrl;
+    //add:-----
+    let floorMatch = header.contentUrl?.match(/floor_([0-9]+)./)
+    this.floorIndex = floorMatch ? parseInt(floorMatch[1]) : null
+    //---------
     this.lodMetricType = 'geometricError';
     this.lodMetricValue = 0;
     this.boundingVolume = null;
@@ -9374,7 +9380,10 @@ class TileHeader {
   }
 
   get isVisibleAndInRequestVolume() {
-    let v =  /* this._visible &&  */this.tileset.visible && this._inRequestVolume; //用_updateBoundingVolume这个算的在相机靠近时不准确,容易缺块
+        
+    let v =  /* this._visible &&  */this.tileset.visible && this._inRequestVolume //用_updateBoundingVolume这个算的在相机靠近时不准确,容易缺块
+                && (this.tileset.options.is4dkkModel ? (this.tileset.currentFloor == 'all' || this.floorIndex == this.tileset.currentFloor || this.floorIndex == void 0 ) : true)
+    
     if(window.tileVisi2)v = this._visible && v
     return v 
   }
@@ -17654,6 +17663,10 @@ class Loader3DTiles {
             const unloadQueue = [];
             const root = new Group();
             const tileBoxes = new Group();
+            
+            
+                  
+            
             tileBoxes.matrixAutoUpdate = false//add
             if (!options.debug) {
                 tileBoxes.visible = false;
@@ -17700,6 +17713,7 @@ class Loader3DTiles {
             }
             const unlitMaterial = new MeshBasicMaterial({ transparent: options.transparent });
             const tileOptions = {
+                is4dkkModel: options.is4dkkModel,//add
                 maximumMemoryUsage: options.maximumMemoryUsage,
                 maximumScreenSpaceError: options.maximumScreenSpaceError,
                 initialMaxSSE: options.maximumScreenSpaceError,
@@ -17731,8 +17745,13 @@ class Loader3DTiles {
                         
                         changeModelPointCount(tile, 'add') 
                         
+                        if (options.is4dkkModel) { // !zeg改 addTile 
+                            //root.addTile(tile.floorIndex, tileContent)//this.floors.getOrMakeFloor(floorIndex).addTile(tileContent)
+                            getOrMakeFloor(tile.floorIndex).add(tileContent)
+                        } else {
+                            root.add(tileContent)
+                        }
                         
-                        root.add(renderMap[tile.id]);
                         if (options.debug) {
                             const box = loadersBoundingBoxToMesh(tile);
                             tileBoxes.add(box);
@@ -17765,6 +17784,32 @@ class Loader3DTiles {
                     }, '3d-tiles': {
                         loadGLTF: false
                     } }) }));
+                    
+           
+            const getOrMakeFloor = function(floorIndex){//xzw add
+                if(!root.floors) root.floors = {}
+                
+                var floor = root.floors[floorIndex]
+                if (!floor) {
+                    floor = new Group();//new Floor(this.model, floorIndex)
+                    floor.name = 'floor_'+floorIndex
+                    floor.floorIndex = floorIndex
+                    root.add(floor)
+                    root.floors[floorIndex] = floor
+                }
+                return floor
+            } 
+            if (options.is4dkkModel) {
+                tileset.currentFloor = 'all'
+                root.goFloor = function(floorIndex){
+                    tileset.currentFloor = floorIndex
+                    root.children.forEach(e=>Potree.Utils.updateVisible(e,'goFloor',  floorIndex == 'all' || e.floorIndex == floorIndex))
+                    tileset.nextForceUpdate = true
+                } 
+            }
+                     
+                    
+                    
             tileset.boxMap = boxMap //add
             // transformations
             const threeMat = new Matrix4$1();

+ 1 - 1
src/custom/mergeStartTest.js

@@ -581,7 +581,7 @@ var start = function(dom, mapDom, number, fileServer, webSite){ //t-Zvd3w0m
                 viewer.loadModel({ 
                     fileType:'3dTiles',
                     url: url || tilesetUrls[tileIndex++],
-                     
+                      
                     transform : { 
                         rotation : [0,  0,   0],
                         position : [0,0,0]  

+ 10 - 9
src/custom/start.js

@@ -1025,7 +1025,7 @@ export function mergeEditStart(dom, mapDom){
     
     let modelType,  modelEditing, MergeEditor = viewer.modules.MergeEditor
     Potree.addModel = function(prop, done, onProgress, onError){ //加载模型
-       
+        const fromNew = prop.raw?.convertType && model.fileType == '3dtiles' && (prop.raw?.wgs84 || prop.raw?.gcj02)
         let loadDone = (model)=>{ 
             model.dataset_id = prop.id //唯一标识
             
@@ -1034,8 +1034,8 @@ export function mergeEditStart(dom, mapDom){
                 if(!model.isPointcloud){ //有经纬度    3dtiles
                     prop.baseRotation && model.rotation.copy(prop.baseRotation) //有的需要翻转90度 
                     
-                    if(prop.raw?.convertType && model.fileType == '3dtiles' && (prop.raw?.wgs84 || prop.raw?.gcj02)){//新的软件转出的带坐标的osgb,原本给cesium用的,把在球面的转为平面的坐标
-                         
+                    if(fromNew) {//新的软件转出的带坐标的osgb,原本给cesium用的,把在球面的转为平面的坐标
+                          
                         let center = new THREE.Vector3().fromArray(model.runtime.getTileset().tileset.root.transform.slice(12,15))
                          
                         let pos = math.fromCes(center)  
@@ -1213,8 +1213,7 @@ export function mergeEditStart(dom, mapDom){
                     MergeEditor.moveBoundCenterTo(model, new THREE.Vector3(0,0,0)) 
                 }
                 MergeEditor.setModelBtmHeight(model, 0) //初始加载设置离地高度为0
-                
-                 
+                  
                 
                 if(prop.mode != 'single'){//如果不是模型展示页,模型会随着鼠标位置移动 
                     modelEditing = model;
@@ -1222,10 +1221,10 @@ export function mergeEditStart(dom, mapDom){
                     if(!model.hasLonLat && moveModelWhenLoad){   
                         viewer.addEventListener('global_mousemove', moveModel); 
                         viewer.addEventListener('global_click', confirmPos, {importance:3});
-                    } 
-                }
+                    }  
+                }     
                 model.dispatchEvent("position_changed") 
-            }else{
+            }else{ 
                 //MergeEditor.setModelBtmHeight(model, prop.bottom || 0) //默认离地高度为0
                 modelEditing = null
             }
@@ -1260,7 +1259,7 @@ export function mergeEditStart(dom, mapDom){
         }else if(prop.type == 'osgb' || prop.type == 'b3dm'){  //3d tiles  
         
             let callback = (object)=>{ 
-               
+                
                 loadDone(object)
             } 
         
@@ -1270,6 +1269,8 @@ export function mergeEditStart(dom, mapDom){
                 name : prop.title,
                 maximumScreenSpaceError: prop.maximumScreenSpaceError,  
                 url:prop.url, 
+                is4dkkModel: prop.is4dkkModel,
+                side: fromNew ? 1 : 0 
             },callback,onprogress)
         
         }else if(prop.type == 'shp'){

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

@@ -6008,14 +6008,14 @@ export class Viewer extends ViewerBase{
                 }       
                 loadDone(object)
             })
-             
+              
         }else if(fileInfo.fileType == '3dTiles'){ 
                          
             let result = await Loader3DTiles.load({ 
                 url: fileInfo.url, 
                 gltfLoader : loaders.glbLoader,  
                 //renderer: SceneRenderer.renderer    
-                options: {       
+                options: {         
                     //dracoDecoderPath: '../utils/loaders/DRACOLoader/draco',
                     //basisTranscoderPath: '../utils/loaders/KTX2Loader/basis',
                     maximumScreenSpaceError: fileInfo.maximumScreenSpaceError || 80 ,  //越小越清晰。           如果本身tiles很密很小这个值就不能很大。
@@ -6023,10 +6023,10 @@ export class Viewer extends ViewerBase{
                     //maximumMemoryUsage: 100, //缓存大小,见tiles3DMaxMemory。单位M(但实际结果是 2.5*maximumMemoryUsage + 750  。超过2G会崩, 所以应该小于540) 若太小,密集的tile反复加载很卡. (任务管理器刷新网页后若内存不掉就要结束进程否则虚高)
                     debug: browser.urlHasValue('tilesBox'),  //show box  
                     parent: this.scene.scene, 
-                    is4dkk: fileInfo.is4dkk,//是否是4dkk中的模型. 通常maximumScreenSpaceError需要10
+                    is4dkkModel: fileInfo.is4dkkModel, //是否是4dkk中的模型. 通常maximumScreenSpaceError需要10
                     updateTime: fileInfo.updateTime, //加后缀防止缓存
                     //cesiumIONToken:  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI5OTc4MTFiYS1hYzhlLTQ3ZjYtYWJmMi1hODMwMWMxZGRiYTQiLCJpZCI6ODU1NDksImlhdCI6MTY1Mzc5NDc5N30.ldTi8bF3XvSOgnZrMITokRW4kE3i8Mwbarhk5OQbPsI',
- 
+                 
                 },  
             })  
             //console.log(result)
@@ -6047,7 +6047,7 @@ export class Viewer extends ViewerBase{
                 if(master.panos) viewer.images360.judgeModelMat(e.tileContent)
                 //set Layers ?
                 Potree.Utils.setObjectLayers(e.tileContent, 'model')  
-                e.tileContent.traverse(e=>e.material && (e.material.side = 2))//新软件导出的带坐标的box型模型要反面才看的到,干脆双面
+                fileInfo.side && e.tileContent.traverse(e=>e.material && (e.material.side = side))//新软件导出的带坐标的box型模型要反面才看的到,干脆双面
             })
             
             { 
@@ -6061,8 +6061,8 @@ export class Viewer extends ViewerBase{
                         result.model.visiChangeCallback()
                     }  
                 })  
-            }
-            let v = true
+            } 
+            let v = true 
             result.model.visiChangeCallback = ()=>{
                 let visi = result.model.realVisible()
                 tileset.visible = visi;  //同步,使不加载