xzw 1 year ago
parent
commit
ba3a1f0f24

+ 10 - 9
public/lib/potree/potree.js

@@ -21796,7 +21796,7 @@
 	    viewer.inputHandler.fixSelection = true; //不通过点击屏幕而切换transfrom选中状态
 	  }
 	  Potree.settings.sizeFitToLevel = true; //当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
-	  Potree.loadPointCloudScene = function (url, type, id, title, done, onError) {
+	  Potree.loadPointCloudScene = function (url, type, id, title, done, onError, prefix) {
 	    //对应4dkk的场景码
 	    var dataset;
 	    var loadCloud = _ref => {
@@ -21836,7 +21836,7 @@
 	          if (!Potree.settings.UserPointDensity) {
 	            Potree.settings.UserPointDensity = 'high'; //'middle' 
 	          }
-	          Potree.Log('loadPointCloudDone 点云加载完毕', sceneName, sceneCode);
+	          Potree.Log(' 点云加载完毕', sceneName, sceneCode);
 	        }
 	        viewer.dispatchEvent('allLoaded');
 	        done(pointcloud);
@@ -21857,7 +21857,7 @@
 	          timeStamp,
 	          color: originDataset.color
 	        });
-	      }, sceneCode, onError);
+	      }, sceneCode, onError, prefix);
 	    } else {
 	      //las or ply  直接用url
 	      var name = type + '|' + id + '|' + title;
@@ -22130,7 +22130,7 @@
 	        } else {
 	          loadDone(pointcloud);
 	        }
-	      }, onError);
+	      }, onError, prop.prefix);
 	    }
 	  };
 	  return {
@@ -22290,7 +22290,7 @@
 	  },
 	  minNodeSize: 30,
 	  // perspectiveCamera允许加载的node的最小可见像素宽度。越大越省性能
-	  tiles3DMaxMemory: 100,
+	  tiles3DMaxMemory: 300,
 	  //M. 最大支持3dTiles的内存大小 超出会崩溃。  改太小太大都会卡,太大崩溃
 	  pointDensity: {
 	    magnifier: {
@@ -77224,6 +77224,7 @@
 	    var eachGltfPosWeight = 100 / 1000 / 1000; //M  每个顶点pos是3*4个字节?法线3*4和uv2*4  其实还有贴图 
 	    var posCount = 0;
 	    viewer.objs.children.forEach(e => {
+	      if (!e.visible) return;
 	      if (e.fileType == 'glb' || e.fileType == 'obj') {
 	        e.traverse(mesh => {
 	          if (mesh.geometry) {
@@ -77243,7 +77244,7 @@
 	    /* let min = 0.1, max = 6, minP = 100, maxP = 1000000; 
 	    let ratio = Math.round(math.linearClamp(score, minP, maxP, max, min ));  */
 	    var rest = maxMemory - objWeight - tiles3DWeight;
-	    Potree.pointBudget = Math.max(30000, Math.round(rest / eachVisiCPointWeight));
+	    Potree.pointBudget = MathUtils.clamp(Math.round(rest / eachVisiCPointWeight), Potree.config.pointDensity.low.pointBudget, 1.5 * Potree.config.pointDensity.high.pointBudget);
 
 	    //获取3dTiles的内存限制 
 	    var tiles3DMaxMemory = maxMemory - Math.round(objWeight + laserWeight);
@@ -91181,7 +91182,7 @@
 	        //Tileset3D
 	        if (data.loadingCount == 0 && !loaded) {
 	          loaded = true;
-	          console.log('loaded!!!!!!!!!!!!!');
+	          //console.log('loaded!!!!!!!!!!!!!')
 	        }
 	      });
 	      tileset.addEventListener('tileLoaded', e => {
@@ -92387,7 +92388,7 @@
 
 	  //查询: http://192.168.0.26:8080/doc.html#/default/filter-%E6%BC%AB%E6%B8%B8%E7%82%B9/filterUsingGET    
 	}
-	async function loadDatasets(callback, sceneCode, onError) {
+	async function loadDatasets(callback, sceneCode, onError, prefix) {
 	  //之后直接把path写进来
 	  var path;
 	  sceneCode = sceneCode || Potree.settings.number;
@@ -92396,7 +92397,7 @@
 	  } else {
 	    //path = `${Potree.settings.urls.prefix2}/indoor/${Potree.settings.number}/api/datasets`
 	    //现在只能加载得了本地的了
-	    path = "".concat(Potree.settings.urls.prefix, "/laser/dataset/").concat(sceneCode, "/getDataSet");
+	    path = "".concat(prefix || Potree.settings.urls.prefix, "/laser/dataset/").concat(sceneCode, "/getDataSet");
 	    //path = `${Potree.scriptPath}/data/${sceneCode}/getDataSet.json`
 	  }
 	  return loadFile(path, null, callback, onError);

File diff suppressed because it is too large
+ 1 - 1
public/lib/potree/potree.js.map


+ 21 - 18
public/test-case/model-list-demo.json

@@ -30,7 +30,7 @@
             "token": null,
             "sceneData": {
                 "modelId": 873,
-                "modelTitle": "gang11",
+                "modelTitle": "gang11-3dtiles",
                 "modelDateType": "b3dm",
                 "modelSize": "21.26MB",
                 "type": 3,
@@ -58,7 +58,7 @@
                 "isLaser": null,
                 "phone": null,
                 "bind": true,
-                "visible": 1,  
+                 "visible":0,
                 "location": null
             }
         },
@@ -119,7 +119,7 @@
                 "isLaser": null,
                 "phone": null,
                 "bind": true,
-                "visible": 1,
+                 
                 "location": null
             }
         },
@@ -168,18 +168,18 @@
                 "deptName": "公安部演示小组",
                 "id": 3260229,
                 "buildObjStatus": 0,
-                "name": "展厅室内",
+                "name": "展厅室内glb",
                 "payStatus": 1,
                 "sceneName": "展厅室内",
                 "snCode": "GABSS0001",
                 "status": 2,
                 "thumb": "https://4dkk.4dage.com/scene_edit_data/SS-X5apgUqrn4n/user/thumb-1k.jpg",
-                "title": "展厅室内",
+                "title": "展厅室内glb",
                 "viewCount": 49,
                 "isLaser": false,
                 "phone": null,
                 "bind": true,
-                "visible": 1,
+                 "visible":0,
                 "location": null
             }
         },
@@ -211,7 +211,7 @@
             "token": null,
             "sceneData": {
                 "modelId": 808,
-                "modelTitle": "展厅外部",
+                "modelTitle": "展厅外部glb",
                 "modelDateType": "obj",
                 "modelSize": "30.47MB",
                 "type": 3,
@@ -239,7 +239,7 @@
                 "isLaser": null,
                 "phone": null,
                 "bind": true,
-                "visible": 1,
+                 
                 "location": null
             }
         },
@@ -256,14 +256,14 @@
                     100.0
                 ],
                 "position": {
-                    "x": -136.90335,
-                    "y": -12.70138,
-                    "z": 2.35404
+                    "x":  95.95022069133655,  
+                    "y":  -107.30181063113577,
+                    "z":  0.919029963920788
                 },
                 "rotation": {
                     "x": 0.0,
                     "y": 0.0,
-                    "z": 0.0
+                    "z": -0.41197799096085
                 }
             },
             "opacity": 100.0,
@@ -288,7 +288,7 @@
                 "deptName": "公安部演示小组",
                 "id": 3210171,
                 "buildObjStatus": 0,
-                "name": "MP对比",
+                "name": "MP对比-glb",
                 "payStatus": 1,
                 "sceneName": "MP对比",
                 "snCode": "GAB000001",
@@ -299,6 +299,7 @@
                 "isLaser": false,
                 "phone": null,
                 "bind": true,
+                "visible":0,
                 "location": null
             }
         },
@@ -315,14 +316,14 @@
                     100.0
                 ],
                 "position": {
-                    "x": -61.14413,
-                    "y": -41.18135,
-                    "z": 0.0
+                    "x": 20.092762021549753, 
+                    "y": -115.72516108460032,
+                    "z": -1.8091536
                 },
                 "rotation": {
                     "x": 0.0,
                     "y": 0.0,
-                    "z": 0.0
+                    "z": -0.435149718040960
                 }
             },
             "opacity": 100.0,
@@ -347,7 +348,7 @@
                 "deptName": "公安部演示小组",
                 "id": 4089,
                 "buildObjStatus": 1,
-                "name": "MP对比",
+                "name": "MP对比-点云",
                 "payStatus": 1,
                 "sceneName": null,
                 "snCode": "GAB000001",
@@ -358,6 +359,8 @@
                 "isLaser": true,
                 "phone": "18612080104",
                 "bind": true,
+                "prefix":"https://laser.4dkankan.com/backend",
+                "visible":1,
                 "location": 4
             }
         }

+ 84 - 88
src/sdk/cover/index.js

@@ -29,8 +29,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
     Potree.settings.showObjectsOnMap = true
     Potree.settings.mergeType2 = true //标识新版
     Potree.settings.modelSkybox = true //是否将全景图贴在模型上(会导致卡顿)。若不显示模型将不显示Reticule
-
-
+    Potree.settings.tiles3DMaxMemory = 300 //稍微增加点
 
     let { THREE } = Potree.mergeEditStart(dom, mapDom)
     let MergeEditor = viewer.modules.MergeEditor
@@ -71,17 +70,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
             terrainShadows: Cesium.ShadowMode.DISABLED, //terrain地形
         });
 
-        /*  proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + lonlat[0].toPrecision(15) + " +lat_0=" + lonlat[1].toPrecision(15)); //高德坐标系
-         proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + lonlat[0].toPrecision(15) + " +lat_0=" + lonlat[1].toPrecision(15)); //地图和本地一样
-         proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
-          
-         let transform1 = proj4("WGS84", "LOCAL"); //这个ok 是展开的平面投影  LOCAL即NAVVIS:TMERC
-         let transform2 = proj4("+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs;");
-         //注:转入后再转出,和原来的有偏差。如果输入是local坐标,数字越大偏差越大,当百万时就明显了。如果是lonlat,很奇怪经度小于50时就乱了。
-         viewer.transform = {
-             lonlatToLocal : transform1,
-             lonlatTo4550 : transform2       // 转大地坐标EPSG:4550  
-         }  */
+        
         //lonlat = [113.595236803415,22.3665168584444]//[113.600356,22.364093]
         Potree.setLonlat(lonlat[0], lonlat[1])
     }
@@ -146,7 +135,15 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
         }
     })
 
-
+    viewer.inputHandler.addEventListener('keydown', (e)=>{
+        if(e.event.key == "e" ){ 
+           MergeEditor.transformControls.mode = 'rotate'
+        }else if(e.event.key == "w"){
+            MergeEditor.transformControls.mode = 'translate'
+        }else if(e.event.key == "s"){
+            MergeEditor.transformControls.mode = 'scale'
+        }
+    })
 
     viewer.addEventListener('webglError', e => {
         console.error('viewer webglError: ' + e)
@@ -233,7 +230,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
 
     window.THREE = THREE
     //isLocal = false 
-    let autoLoads = []
+    let autoLoads = window.autoLoads = []
     let readyToAddModel
     let maxLoadingCount = /* isLocal ? 1 :  */2; //正在加载模型的最大数目
 
@@ -615,7 +612,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
 
         addModel(props) {
 
-            let bus = mitt()
+            let bus = props.bus = mitt()
             //console.log('addModel',props)
             props.isFirstLoad = isLocal ? props.bottom == void 0 : (props.isDynamicAdded || props.mode == 'single')  // 在编辑时用户添加的 或 展示单个模型 (props.mode='single'模型展示页, props.mode='many'融合页)
             if (props.opacity == void 0) props.opacity = 1
@@ -660,61 +657,12 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
 
 
 
-            let startLoad = (prop) => {
-                //if(autoLoads.filter(e=>e.loaded).length>1)return console.log('取消加载', prop), prop.onError()
-/* if(props.raw.visible === 0){//用于临时隐藏
-    setTimeout(()=>{
-        spliceFromArr(model, false)
-        bus.emit('loadError' )
-    },1)
-    
-    return
-}   */            
-                Potree.Log(`--开始加载--`, { font: { color: '#f68' } });
-                console.log('id:', prop.id, ', title:', prop.title, ', filename:', Potree.Common.getNameFromURL(prop.url), ', type:', prop.type, prop)
- 
-                prop.unlit = props.renderType != 'normal'
-                prop.maximumScreenSpaceError = 60
-                Potree.addModel(prop, prop.done, prop.progressFun, prop.onError)
-                prop.loading = true
+            
 
-            }
 
+            
 
-            let loadNext = () => {
-                let haventLoad = autoLoads.filter(e => !e.loading && !e.loadFinish);
-                let loading = autoLoads.filter(e => e.loading);
-                haventLoad.slice(0, maxLoadingCount - loading.length).forEach(e => startLoad(e))
-                return haventLoad.length > 0
-            }
-
-            let spliceFromArr = (model, loaded) => {
-                //let autoLoads.find()
-                props.loadFinish = true
-                props.loading = false
-
-                if (loaded) {
-                    props.loaded = true
-                    props.model = model
-                } else {
-                    props.error = true
-                }
-
-                /* let haventLoad = autoLoads.filter(e=>!e.loading && !e.loadFinish);
-                if( haventLoad[0]){
-                    startLoad(haventLoad[0])
-                      */
-                if (!loadNext()) {
-                    if (autoLoads.filter(e => !e.loadFinish).length == 0 && autoLoads.filter(e => e.loaded).length > 0 && !props.isFirstLoad) {//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;  
-                        let autoLoadsDone = autoLoads.filter(e => e.loaded).map(e => e.model)
-                        console.log('所有模型加载完毕')
-                        autoLoads.filter(e => e.loaded && e.show).forEach(e => e.model.visible = true)
-
-                        MergeEditor.focusOn(autoLoadsDone, 1000, true, true)
-                        autoLoads.length = 0
-                    }
-                }
-            }
+            
 
             let model
             let done = (model_) => {
@@ -745,10 +693,8 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
                     //console.log(msg)
                     bus.emit('transformChanged', msg)
                 })
-                spliceFromArr(model, true)
-
-
-
+                spliceFromArr(model, props, true)
+ 
                 model.addEventListener('changeSelect', (e) => {
                     e.selected ? MergeEditor.transformControls.attach(model) : MergeEditor.transformControls.detach()
                 })
@@ -779,7 +725,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
             let onError = function (xhr) {
                 bus.emit('loadError', xhr)
                 console.log('loadError!!!!!!!!!', Potree.Common.getNameFromURL(props.url), props.size, xhr)
-                spliceFromArr(model, false)
+                spliceFromArr(model, props, false)
             }
 
             try {
@@ -1260,27 +1206,77 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes }) => {
 
 
 
+ 
+
+    function spliceFromArr(model, props, loaded){
+        //let autoLoads.find()
+        props.loadFinish = true
+        props.loading = false
+
+        if (loaded) {
+            props.loaded = true
+            props.model = model
+        } else {
+            props.error = true
+        }
+
+        /* let haventLoad = autoLoads.filter(e=>!e.loading && !e.loadFinish);
+        if( haventLoad[0]){
+            startLoad(haventLoad[0])
+              */
+        if (!loadNext()) {
+            if (autoLoads.filter(e => !e.loadFinish).length == 0 && autoLoads.filter(e => e.loaded).length > 0 && !props.isFirstLoad) {//设置相机位置:当自动开始加载第一个模型时(其余的也跟着自动加载),等这批加载完后;  
+                let autoLoadsDone = autoLoads.filter(e => e.loaded).map(e => e.model)
+                console.log('所有模型加载完毕')
+                autoLoads.filter(e => e.loaded && e.show).forEach(e => e.model.visible = true)
+
+                MergeEditor.focusOn(autoLoadsDone, 1000, true, true)
+                autoLoads.length = 0
+            }
+        }
+    }
+     
+     
+    function loadNext(){
+        let haventLoad = autoLoads.filter(e => !e.loading && !e.loadFinish);
+        let loading = autoLoads.filter(e => e.loading);
+        let needLoad = haventLoad.slice(0, maxLoadingCount - loading.length)
+        needLoad.forEach(e => startLoad(e))
+        return haventLoad.length > 0
+    } 
+      
+    function startLoad(prop){ 
+         if(prop.raw.visible !== 1){//用于临时隐藏 
+            setTimeout(()=>{
+                spliceFromArr(null, prop, false)
+                prop.bus.emit('loadError' ) 
+            },1) 
+            return
+        }    
+        
+        if(prop.loading || prop.loadFinish)return
+        
+        Potree.Log(`--开始加载--`, { font: { color: '#f68' } });
+        console.log('id:', prop.id, ', title:', prop.title, ', filename:', Potree.Common.getNameFromURL(prop.url), ', type:', prop.type, prop)
+
+        prop.unlit = prop.renderType != 'normal'
+        prop.maximumScreenSpaceError = 100
+        prop.prefix = prop.raw.prefix
+        Potree.addModel(prop, prop.done, prop.progressFun, prop.onError)
+        prop.loading = true
+
+    }
 
-    //sdk.hideGrid()
 
 
     return sdk
 }
 
-/* function load4dkkPanos(url, model, done){
-    let sceneCode 
-    if(url.includes('4dkk.4dage.com/scene_view_data/')){
-        sceneCode = url.split('https://4dkk.4dage.com/scene_view_data/')[1].split('/images/')[0]
-    }else if(url.includes('4dkk.4dage.com/fusion/xj/model/')){
-        sceneCode = url.split('https://4dkk.4dage.com/fusion/xj/model/')[1].split('/mesh/')[0]
-    }else{
-        return console.error('未知url,无法获得sceneCode',url)
-    }
-    
-    
-    
-    Potree.load4dkkPanos(sceneCode, model, done)
-}  */
+
+
+
+ 
+ 
 /* 
 
     暂定不同场景间的漫游点不能互通。虽然它们可能是摆放正确的,如果是组成一整个场景的话还是要打通……