Selaa lähdekoodia

fix: 还差全景图支持

xzw 1 vuosi sitten
vanhempi
commit
6d816ff2ca

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 15 - 1
public/lib/Cesium/Widgets/CesiumWidget/CesiumWidget.css


+ 63 - 45
public/lib/potree/potree.js

@@ -21790,7 +21790,7 @@
 	  Potree.settings.sizeFitToLevel = true; //当type为衰减模式时自动根据level调节大小。每长一级,大小就除以2
 	  Potree.loadPointCloudScene = function (url, type, id, title, done, onError) {
 	    //对应4dkk的场景码
-
+	    var dataset;
 	    var loadCloud = _ref => {
 	      var {
 	        cloudPath,
@@ -21804,6 +21804,7 @@
 	        var pointcloud = e.pointcloud;
 	        var config = Potree.config.material;
 	        var material = pointcloud.material;
+	        pointcloud.datasetData = dataset;
 	        material.minSize = config.minSize;
 	        material.maxSize = config.maxSize;
 	        material.pointSizeType = config.pointSizeType; //Potree.PointSizeType[config.pointSizeType]//Potree.PointSizeType.ADAPTIVE;//FIXED
@@ -21830,12 +21831,6 @@
 	            font: [null, 10]
 	          });
 	        }
-
-	        /* Potree.loadPanos(dataset.id, (data) => { //暂时不加载panos了,因为没有id 
-	        //console.log('loadPanos',dataset.sceneCode, dataset.id, data)
-	        viewer.images360.addPanoData(data, dataset.id ) 
-	        viewer.images360.loadDone() 
-	        viewer.scene.add360Images(viewer.images360);    */
 	        viewer.dispatchEvent('allLoaded');
 	        done(pointcloud);
 	      }, onError);
@@ -21847,7 +21842,7 @@
 	        var timeStamp = originDataset.updateTime ? originDataset.updateTime.replace(/[^0-9]/ig, '') : ''; //每重算一次后缀随updateTime更新一次 
 	        //let cloudPath = `${Potree.settings.urls.prefix1}/${Potree.settings.webSite}/${sceneCode}/data/${sceneCode}/webcloud/cloud.js` 
 	        var cloudPath = "".concat(Potree.settings.urls.prefix1, "/").concat(originDataset.webBin); //webBin添加原因:每次裁剪之类的操作会换路径,因为oss文件缓存太严重,更新慢
-
+	        dataset = originDataset;
 	        loadCloud({
 	          cloudPath,
 	          sceneName: originDataset.sceneName,
@@ -21859,6 +21854,7 @@
 	    } else {
 	      //las or ply  直接用url
 	      var name = type + '|' + id + '|' + title;
+	      //有漫游点吗
 	      if (url instanceof Array) {
 	        if (url.length == 1) {
 	          url = url[0];
@@ -22028,6 +22024,9 @@
 	        modelEditing = null;
 	      }
 	      MergeEditor.modelAdded(model);
+	      Potree.settings.mergeType2 && model.addEventListener('changeSelect', e => {
+	        e.selected ? MergeEditor.transformControls.attach(model) : MergeEditor.transformControls.detach();
+	      });
 	    };
 	    if (prop.type == 'glb') {
 	      var callback = object => {
@@ -22115,34 +22114,16 @@
 	        pointcloud.matrixAutoUpdate = true;
 	        pointcloud.initialPosition = pointcloud.position.clone();
 	        pointcloud.pos1MatrixInvert = new Matrix4().setPosition(pointcloud.initialPosition).invert();
-
-	        /* let maintainBtmZ = ()=>{
-	            MergeEditor.setModelBtmHeight(pointcloud)
-	            updateMatrix()
-	        }
-	        let updateMatrix = ()=>{ 
-	            setMatrix(pointcloud) 
-	            pointcloud.dispatchEvent('transformChanged')
+	        if (pointcloud.datasetData) {
+	          Potree.loadPanos(pointcloud.datasetData.id, data => {
+	            viewer.images360.addPanoData(data, pointcloud.datasetData.id);
+	            viewer.images360.loadDone();
+	            viewer.scene.add360Images(viewer.images360);
+	            loadDone(pointcloud);
+	          }, prop.url);
+	        } else {
+	          loadDone(pointcloud);
 	        }
-	        pointcloud.addEventListener('position_changed', updateMatrix )  
-	        pointcloud.addEventListener("orientation_changed", maintainBtmZ )
-	        pointcloud.addEventListener("scale_changed", maintainBtmZ ) */
-
-	        loadDone(pointcloud);
-	        /* pointcloud.addEventListener('select',(e)=>{
-	            if(Potree.settings.displayMode == 'showPanos')return
-	            console.log('select',e) 
-	            //viewer.setControls(viewer.orbitControls) 
-	            MergeEditor.focusOnSelect(pointcloud) 
-	            
-	            viewer.outlinePass.selectedObjects = [pointcloud]
-	            return {stopContinue:true}
-	        },{importance:1})
-	        pointcloud.addEventListener('deselect',(e)=>{
-	            console.log('deselect',e) 
-	            //viewer.setControls(viewer.fpControls)  
-	            viewer.outlinePass.selectedObjects = []
-	        }) */
 	      }, onError);
 	    }
 	  };
@@ -30604,6 +30585,7 @@
 	                });
 	              }
 	              this.updateCube(this.currentPano);
+	              viewer.setControls(viewer.fpControls);
 	            } else {
 	              if (camera.limitFar) camera.far = Potree.settings.cameraFar; //修改far
 	              Potree.settings.pointDensity = Potree.settings.UserPointDensity;
@@ -30614,6 +30596,7 @@
 	                  e.material.pointSizeType = Potree.config.material.pointSizeType;
 	                });
 	              }
+	              Potree.settings.editType == 'merge' && viewer.setControls(viewer.orbitControls);
 	            }
 	            camera.updateProjectionMatrix();
 	            if (this.elDisplayModel) {
@@ -32357,6 +32340,9 @@
 	        if (this.closestPano == pano) this.closestPano = null;
 	      });
 	      this.panos.push(pano);
+	      this.neighbourMap[info.id] = {};
+	      pano.label && Potree.Utils.setObjectLayers(pano.label, 'bothMapAndScene');
+	      pano.label2 && Potree.Utils.setObjectLayers(pano.label2, 'bothMapAndScene');
 	      if (Potree.settings.editType == 'pano') {
 	        Potree.settings.datasetsPanos[datasetId].panos.push(pano);
 	      }
@@ -32364,14 +32350,7 @@
 	  }
 	  loadDone() {
 	    Potree.Utils.setObjectLayers(this.node, 'sceneObjects');
-	    //this.updateCube(/* viewer.bound */)
-
-	    this.panos.forEach(e => {
-	      this.neighbourMap[e.id] = {};
-	      e.label && Potree.Utils.setObjectLayers(e.label, 'bothMapAndScene');
-	      e.label2 && Potree.Utils.setObjectLayers(e.label2, 'bothMapAndScene');
-	    });
-	    this.tileDownloader.setPanoData(this.panos, [] /* , Potree.settings.number */);
+	    this.tileDownloader.setPanoData(this.panos, []);
 	    {
 	      var minSize = new Vector3(1, 1, 1);
 	      this.bound = math.getBoundByPoints(this.panos.map(e => e.position), minSize);
@@ -76456,6 +76435,7 @@
 
 	var texLoader$a = new TextureLoader();
 	texLoader$a.crossOrigin = "anonymous";
+	var boxHelper = new Box3Helper$1(new Box3(new Vector3(-0.5, -0.5, -0.5), new Vector3(0.5, 0.5, 0.5)));
 	var edgeStrengths = {
 	  pointcloud: 4,
 	  glb: 100
@@ -76498,6 +76478,8 @@
 	  bus: new EventDispatcher(),
 	  SplitScreen: new SplitScreen(),
 	  init() {
+	    viewer.scene.scene.add(boxHelper);
+	    Potree.Utils.updateVisible(boxHelper, 'unselect', false);
 	    this.history = new History({
 	      applyData: data => {
 	        if (data.object.parent /* && data.object == this.selected */) {
@@ -76885,7 +76867,30 @@
 	      });
 	    }
 	  },
+	  updateBoxHelper(model) {
+	    var size = new Vector3();
+	    model.boundingBox.getSize(size);
+	    size.multiply(model.scale);
+	    boxHelper.scale.copy(size);
+	    var center = new Vector3();
+	    model.boundingBox.getCenter(center);
+	    center.applyMatrix4(model.matrixWorld);
+	    //center.add(model.position)     
+	    boxHelper.position.copy(center);
+	    boxHelper.quaternion.copy(model.quaternion);
+	  },
 	  showModelOutline(model, state) {
+	    //if(Potree.settings.dontUseOutline){//高斯很卡
+	    if (state !== false) {
+	      this.updateBoxHelper(model);
+	      Potree.Utils.updateVisible(boxHelper, 'unselect', true);
+	    } else {
+	      //model.remove(boxHelper)
+	      Potree.Utils.updateVisible(boxHelper, 'unselect', false);
+	    }
+	    return;
+	    //}
+
 	    if (this.fadeOutlineAuto) {
 	      if (state === false) {
 	        viewer.outlinePass.selectedObjects = [];
@@ -77030,9 +77035,19 @@
 	        measure.setSelected(false); //隐藏edgelabel  
 	      }
 	    });
+
+	    //反向求transformMatrix  参考Alignment.js   移动漫游点 
+	    if (model.isPointcloud && model.transformMatrix) {
+	      model.transformMatrix.multiplyMatrices(model.matrix, model.pos1MatrixInvert);
+	      model.transformInvMatrix.copy(model.transformMatrix).invert();
+	      model.panos.forEach(e => e.transformByPointcloud());
+	    }
 	    model.lastMatrixWorld = model.matrixWorld.clone();
 	    viewer.dispatchEvent('content_changed');
 	    viewer.mapViewer && Potree.settings.showObjectsOnMap && viewer.mapViewer.dispatchEvent('content_changed');
+
+	    //--------
+	    this.updateBoxHelper(model);
 	  },
 	  changeOpacity(model, opacity) {
 	    var isRoot = model.dataset_id != void 0; //是否是最外层 
@@ -91111,13 +91126,13 @@
 	        //viewer.mainViewport.view.setView({position: new THREE.Vector3(-4.980,  -5.3879,  5.4503095), quaternion:new THREE.Quaternion(0.5750,-0.2809,-0.3372,0.6903)})
 
 	        gsViewer.splatMesh.onSplatTreeReadyCallback = () => {
+	          loadDone(gsViewer.splatMesh);
 	          var {
 	            sceneMax,
 	            sceneMin
 	          } = gsViewer.splatMesh.splatTree.subTrees[0];
 	          gsViewer.splatMesh.boundingBox.min.copy(sceneMin);
 	          gsViewer.splatMesh.boundingBox.max.copy(sceneMax);
-	          loadDone(gsViewer.splatMesh);
 	        };
 	      });
 
@@ -92291,11 +92306,14 @@
 	    return loadFile(path, null, callback.bind(this, dataset_id, floorplanType));
 	  });
 	}
-	async function loadPanos(datasetId, callback) {
+	async function loadPanos(datasetId, callback, number) {
 	  var path;
 	  //let query = `?datasetId=${datasetId}`                  //`?lat=${center.lat}&lon=${center.lon}&radius=200000`
 	  if (Potree.fileServer) {
 	    path = "/laser/filter/".concat(Potree.settings.number, "/query");
+	  } else if (Potree.settings.mergeType2) {
+	    //每个场景只加载初始数据集
+	    path = "".concat(Potree.settings.urls.prefix, "/laser/filter/").concat(number, "/query");
 	  } else {
 	    //path = `${Potree.settings.urls.prefix2}/indoor/${Potree.settings.number}/api/images/filter` + query
 	    //path = `${Potree.scriptPath}/data/${Potree.settings.number}/panos-${datasetId}.json`

Tiedoston diff-näkymää rajattu, sillä se on liian suuri
+ 1 - 1
public/lib/potree/potree.js.map


+ 14 - 14
public/test-case/model-list.json

@@ -74,10 +74,10 @@
                   100.0,
                   100.0
               ],
-              "position": {
-                  "x": 0.0,
-                  "y": 0.0,
-                  "z": 0.0
+              "position": { 
+                  "x": 0.16552170253057596, 
+                  "y": -11.152602403,
+                  "z": 0.10249640482
               },
               "rotation": {
                   "x": 0.0,
@@ -257,10 +257,10 @@
               "position": {
                   "x": 0.0,
                   "y": 0.0,
-                  "z": 0.0
+                  "z": 2.0
               },
               "rotation": {
-                  "x": 0.0,
+                  "x": 1.570796326794896,
                   "y": 0.0,
                   "z": 0.0
               }
@@ -314,10 +314,10 @@
                   100.0,
                   100.0
               ],
-              "position": {
-                  "x": -6.18494,
-                  "y": 22.95057,
-                  "z": 8.81291
+              "position": {   
+                  "x": -23.968,
+                  "y":17.2930920851,
+                  "z": 0.81291
               },
               "rotation": {
                   "x": 1.5708,
@@ -376,11 +376,11 @@
             ],
             "position": {
                 "x": 0.0,
-                "y": 0.0,
-                "z": 0.0
+                "y": 100.0,
+                "z": 10.0
             },
             "rotation": {
-                "x": 0.0,
+                "x": -2.22346,
                 "y": 0.0,
                 "z": 0.0
             }
@@ -437,7 +437,7 @@
           "position": {
               "x": 0.0,
               "y": 0.0,
-              "z": 0.0
+              "z": 10.0
           },
           "rotation": {
               "x": 0.0,

+ 73 - 12
src/sdk/cover/index.js

@@ -34,18 +34,17 @@ export const enter = ({dom, mapDom, isLocal, lonlat, scenes }) => {
     Potree.settings.showCompass = true
     Potree.settings.compassDom = dom.querySelector('#direction')
     Potree.settings.showObjectsOnMap = true
-    
+    Potree.settings.mergeType2 = true //标识新版
     
     let {THREE} = Potree.mergeEditStart(dom, mapDom)
     let MergeEditor = viewer.modules.MergeEditor
     
-    
-    {
-        
+    Potree.settings.showCesium = true
+    if(Potree.settings.showCesium){ 
         
+        viewer.backgroundOpacity = 0 
         
-        
-        /* window.cesiumViewer = new Cesium.Viewer('cesiumContainer', {
+        window.cesiumViewer = new Cesium.Viewer('app', {
             useDefaultRenderLoop: true,
             requestRenderMode:true, //add 只有需要render时才会render,如tile加载完后、镜头移动后
             animation: false,
@@ -68,9 +67,8 @@ 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)); //地图和本地一样
@@ -92,7 +90,57 @@ export const enter = ({dom, mapDom, isLocal, lonlat, scenes }) => {
         var pos = camera.position
         if (e.viewport.name == 'MainView') {
             sceneBus.emit('cameraChange', { x: pos.x, y: pos.y, z: pos.z, rotate: camera.rotation })
-        } 
+        
+            if(Potree.settings.showCesium){
+                  
+                let pPos    = new THREE.Vector3(0, 0, 0).applyMatrix4(camera.matrixWorld);
+                let pRight  = new THREE.Vector3(600, 0, 0).applyMatrix4(camera.matrixWorld);
+                let pUp		= new THREE.Vector3(0, 600, 0).applyMatrix4(camera.matrixWorld);
+                let pTarget = viewer.scene.view.getPivot();
+
+                let toCes = (pos) => {
+                    let xy = [pos.x, pos.y];
+                    let height = pos.z;
+                    let deg =  viewer.transform.lonlatToLocal.inverse(xy)  //  toMap.forward(xy);
+                    let cPos = Cesium.Cartesian3.fromDegrees(...deg, height);
+
+                    return cPos;
+                };
+
+                let cPos = toCes(pPos);
+                let cUpTarget = toCes(pUp);
+                let cTarget = toCes(pTarget);
+
+                let cDir = Cesium.Cartesian3.subtract(cTarget, cPos, new Cesium.Cartesian3());
+                let cUp = Cesium.Cartesian3.subtract(cUpTarget, cPos, new Cesium.Cartesian3());
+
+                cDir = Cesium.Cartesian3.normalize(cDir, new Cesium.Cartesian3());
+                cUp = Cesium.Cartesian3.normalize(cUp, new Cesium.Cartesian3());
+       
+                cesiumViewer.camera.setView({
+                    destination : cPos,
+                    orientation : {
+                        direction : cDir,
+                        up : cUp
+                    }
+                });
+
+             
+
+                let aspect = viewer.scene.getActiveCamera().aspect;
+                if(aspect < 1){
+                    let fovy = Math.PI * (viewer.scene.getActiveCamera().fov / 180);
+                    cesiumViewer.camera.frustum.fov = fovy;
+                }else{
+                    let fovy = Math.PI * (viewer.scene.getActiveCamera().fov / 180);
+                    let fovx = Math.atan(Math.tan(0.5 * fovy) * aspect) * 2
+                    cesiumViewer.camera.frustum.fov = fovx;
+                }
+        
+        
+                cesiumViewer.render(); //立即render,否则会和点云render不同步而错位
+            }
+        }   
     })
     viewer.addEventListener('webglError', e => {
         console.error('viewer webglError: ' + e)
@@ -904,8 +952,21 @@ export const enter = ({dom, mapDom, isLocal, lonlat, scenes }) => {
                     })
                 },
 
-                
-                
+                supportPano(){  //是否支持全景图
+                    return model.panos && model.panos.length > 0 
+                },
+                flyInPano(){//  飞入全景图
+                    let pano = viewer.images360.findNearestPano(null,model.panos)
+                    if(pano){
+                        Potree.settings.displayMode = 'showPanos'
+                        viewer.images360.flyToPano(pano)
+                        Potree.Utils.updateVisible(viewer.objs, 'showPanos', false)
+                    }
+                },
+                flyOutPano(){//  飞出全景图(就是切换到正常融合视角)
+                    Potree.settings.displayMode = 'showPointCloud'
+                    Potree.Utils.updateVisible(viewer.objs, 'showPanos', true)
+                },
                 destroy(){
                     model && MergeEditor.removeModel(model) 
                     viewer.dispatchEvent('content_changed')