xzw 1 mese fa
parent
commit
cd132cf171
4 ha cambiato i file con 1206 aggiunte e 894 eliminazioni
  1. 1099 815
      pnpm-lock.yaml
  2. 24 16
      public/lib/potree/potree.js
  3. 1 1
      public/lib/potree/potree.js.map
  4. 82 62
      src/sdk/cover/index.js

File diff suppressed because it is too large
+ 1099 - 815
pnpm-lock.yaml


+ 24 - 16
public/lib/potree/potree.js

@@ -7199,18 +7199,16 @@
 	    
 	    有两处关键,在外和传入shader的,是一样的算法。
 	    
-	    逻辑:
-	    skinnedMesh所带的skelton的bone
-	    在shader中
-
-
-	    传入shader的有mesh的bindMatrixInverse和骨骼上的 boneTexture(也就是keleton.boneMatrices) 
-	    
-	    而boneMatrices即bone.matrixWorld * boneInverse, 后者初始化后就不变了,前者因为随着模型位移而变得很大。
-	    
 	    
-	    transformed = ( bindMatrixInverse * skinned ).xyz;
-
+	    传入shader的有mesh的bindMatrixInverse和骨骼上的 boneTexture(也就是keleton.boneMatrices) 
+	  
+	    transformed = ( bindMatrixInverse * skinned ).xyz;//这里没有经过最外层的位移
+	    其中skinned是经过boneTexture的位移  
+	 
+	    而boneMatrices即bone.matrixWorld * boneInverse。 
+	    boneInverse初始化后就不变了,前者因为随着模型位移而变得很大,所以我将其乘以mesh的逆矩阵
+	    bindMatrixInverse是 matrixWorld.invert(), 我改为matrix.invert, 两者中和了,都去掉了大数字。
+	     
 	    所修改处都有avoidBigNumber标识
 
 
@@ -45749,7 +45747,7 @@
 	  }
 	  getPosByIntersect(e, type) {
 	    //intersect落在线上的位置,以及在哪两个点之间
-
+	    var modelMatrixInvert = this.edge.matrixWorld.clone().invert();
 	    if (!Potree.settings.pathSmooth) {
 	      var prevIndex = Math.floor(e.hoveredElement.faceIndex / 2); //端点1(可能是最后一个)
 	      var nextIndex = this.getIndex(prevIndex, 1); //端点2(可能是第一个)
@@ -45761,13 +45759,19 @@
 	        point
 	      };
 	    } else {
+	      var hoverAtGeo = e.hoveredElement.point.clone().applyMatrix4(modelMatrixInvert);
 	      var prevIndex0 = Math.floor(e.hoveredElement.faceIndex / 2); //所在的mesh片段的端点1
 	      var nextIndex0 = prevIndex0 + 1; //所在的mesh片段的端点2
 
-	      var _point = math.getFootPoint(e.hoveredElement.point, this.geoPoints[prevIndex0], this.geoPoints[nextIndex0]); //新点位置
-	      if (type == 'onlyPoint') return {
-	        point: _point
-	      };
+	      var _point = math.getFootPoint(hoverAtGeo, this.geoPoints[prevIndex0], this.geoPoints[nextIndex0]); //新点位置
+	      //console.log('point',point)
+
+	      if (type == 'onlyPoint') {
+	        _point.applyMatrix4(this.edge.matrixWorld);
+	        return {
+	          point: _point
+	        };
+	      }
 	      var _prevIndex, _nextIndex;
 	      var count = this.points.length - 1;
 	      for (var i = 0; i < count; i++) {
@@ -45811,6 +45815,8 @@
 	      _nextIndex = _prevIndex + 1;
 	      //console.log(prevIndex, nextIndex)
 	      var _index = _prevIndex + 1; //新点在端点1后
+
+	      _point.applyMatrix4(this.edge.matrixWorld);
 	      return {
 	        index: _index,
 	        prevIndex: _prevIndex,
@@ -80334,10 +80340,12 @@
 	    var pathQua, quaternion;
 	    if (percent2 <= 1) {
 	      var position2 = curve.getPointAt(percent2);
+	      position2.add(key.path.edge.position);
 	      pathQua = math.getQuaFromPosAim(position2, position);
 	    } else {
 	      percent2 = percent - delta;
 	      var _position = curve.getPointAt(percent2);
+	      _position.add(key.path.edge.position);
 	      pathQua = math.getQuaFromPosAim(position, _position);
 	    }
 	    pathQua.multiplyQuaternions(pathQua, rot90Qua); //这是当模型导进来就旋转正确时的quaternion

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


+ 82 - 62
src/sdk/cover/index.js

@@ -19,14 +19,31 @@ const ModelTypes = {
 }
 
 let satellite = true
-let defaultMapProps = [{url: `//wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=${satellite?6:7}&x={x}&y={y}&z={z}&layer=6&token=YOUR_API_KEY`, //style=6是卫星,7是标准
+/* let defaultMapProps = [{url: `//wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=${satellite?6:7}&x={x}&y={y}&z={z}&layer=6&token=YOUR_API_KEY`, //style=6是卫星,7是标准
     maximumLevel: satellite?18:19, 
     name:'高德baseLayer'  
 },{
     url: `//wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}&layer=6&token=YOUR_API_KEY`, //style=6是卫星,7是标准
     maximumLevel: 18, 
     name:'高德textLayer'  
-}] 
+}]  */
+
+let defaultMapProps = satellite ? [
+{url: `//wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=6&x={x}&y={y}&z={z}&layer=6&token=YOUR_API_KEY`, //style=6是卫星,7是标准
+    maximumLevel: 18 , 
+    name:'高德baseLayer'  
+},{
+    url: `//wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}&layer=6&token=YOUR_API_KEY`, //style=6是卫星,7是标准
+    maximumLevel: 18, 
+    name:'高德textLayer'  
+}] : [
+    {url: `//wprd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}&layer=6&token=YOUR_API_KEY`, //style=6是卫星,7是标准
+        maximumLevel: 19 , 
+        name:'高德baseLayer'  
+    },
+]
+
+
 let cesAspect , cesImageryProvider,  mapProps = defaultMapProps 
 
 
@@ -147,9 +164,12 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
     window.cesErrorCallback = ()=>{
         //sdk.setBackdrop('none')
     }
-    Potree.settings.queryCloudLonLatUrl = Potree.settings.urls.prefix+"/laser/4dage/{sceneCode}/getDataSetAndControlPoint"
-   
-    let { THREE } = Potree.mergeEditStart(dom, mapDom)
+    
+    let { THREE } = Potree.mergeEditStart(dom, mapDom, {
+        queryCloudLonLatUrl: Potree.settings.urls.prefix+"/laser/4dage/{sceneCode}/getDataSetAndControlPoint"  
+    })
+    //Potree.settings.queryCloudLonLatUrl = Potree.settings.urls.prefix+"/laser/4dage/{sceneCode}/getDataSetAndControlPoint"
+    //let { THREE } = Potree.mergeEditStart(dom, mapDom)
     let {MergeEditor, AnimationEditor} = viewer.modules
     
     
@@ -278,7 +298,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             viewer.removeEventListener('camera_changed', camera_changed)  
         }
     }
-    let requestInPano = false
+    let requestPanoModel = false
     //-------------------------------------
     /* viewer.inputHandler.addEventListener('keydown', (e)=>{
         if(e.event.key == "e" ){ 
@@ -509,7 +529,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
 
 
 
-    let sdk = {
+    let sdk = Potree.sdk = {
         sceneBus, mapBus,
         
         
@@ -707,8 +727,8 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                     }else{
                         console.warn('没有找到漫游点',o)
                     }
-                }/* else if(requestInPano){
-                    requestInPano.result_.flyOutPano()
+                }/* else if(requestPanoModel){
+                    requestPanoModel.result_.flyOutPano()
                 } */else{
                     Potree.settings.displayMode = 'showPointCloud'  
                     
@@ -765,6 +785,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             
         },
         comeToByLatLng(lonlat){//飞到指定经纬度 
+            requestPanoModel?.result_?.flyOutPano() 
             let pos = viewer.transform.lonlatToLocal.forward(lonlat)
             let location = viewer.mainViewport.view.position.clone().setX(pos[0]).setY(pos[1])
             viewer.scene.view.setView({position:location, duration:500});
@@ -963,6 +984,9 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             props.scale && (props.scale /= 100)
             
             
+            if(props.raw.type == 7){//新加
+                props.fromType = (props.type == 'osgb' || props.type == 'b3dm') ? 4 : 0  
+            } 
              
             let getBaseRotation = () => {
                 if(ModelTypes[props.fromType]?.rot90 && props.type != 'obj'){
@@ -1019,8 +1043,6 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             
 
             
-
-            
             let done = (model_) => {
                 model = model_
                 model.result_ = result 
@@ -1032,66 +1054,68 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                 }
                 model.showInPano = /* !model.is4dkkModel// */props.raw.showInPano  //现在不用这个,所有模型都可见,非is4dkkModel的还显示原本的贴图
                 props.opacity < 100 && result.changeOpacity(props.opacity)
+ 
+                spliceFromArr(model, props, true)
+  
 
-                model.addEventListener('changeSelect', (e) => {
-                    
+                MergeEditor.modelAdded(model) 
+                load4dkkMedias(model)    
+                
+                if (props.mode == 'single') {//模型查看页
+                    MergeEditor.noNeedSelection = true
+                    setTimeout(() => {
+                        MergeEditor.focusOn([model], 1000, true, true)
+                    }, 1)
+                }
+                if(ModelTypes[props.fromType].panos4dkk){
+                    Potree.load4dkkPanos(props.raw.num, model, getBaseRotation(), () => {
+                        bus.emit('loadDone',model)
+                    },    props.fromType == 0 ? '2k' : '4k' ) //看看场景是2k
+                } else { 
+                    bus.emit('loadDone',model)
+                }
+                
+                model.finalLoaded = true
+                console.log('loadDone', model.name )
+                
+                model.addEventListener('changeSelect', (e) => { 
                     bus.emit('changeSelect', !!e.selected)
+                    MergeEditor.transformControls.visible && e.selected && MergeEditor.transformControls.attach(model, e.clickPos) //: MergeEditor.transformControls.detach()
                 })
+                
                 let lastState = {}
-                model.addEventListener('transformChanged', (e) => {
+                let emitTran = (e)=>{
                     let msg = {byControl:!!e.byControl}  //byControl代表是手动用控制轴修改 动画文件要改帧
                     if (!lastState.position || !model.position.equals(lastState.position)) {
                         lastState.position = msg.position = model.position.clone()
-                        //console.log('change pos', model.name, model.position.toArray())
+                        //console.log('change pos', model.name, model.position.toArray()) 
                     }
                     if (!lastState.rotation || !model.rotation.equals(lastState.rotation)) {
                         lastState.rotation = model.rotation.clone()   
-                        msg.rotation = model.rotation.toObject()
+                        msg.rotation = model.rotation.toObject() 
                         if(model.atPath && e.byControl){
                             msg.quaAtPath = AnimationEditor.getModelQuaAtPath(model)
                             msg.quaAtPath && (msg.quaAtPath = msg.quaAtPath.toObject())
                         }
                     }
                     if (lastState.scale == void 0 || model.scale.x * 100 != lastState.scale) {
-                        lastState.scale = msg.scale = model.scale.x * 100
+                        lastState.scale = msg.scale = model.scale.x * 100 
                     }
 
-                    msg = Potree.Common.CloneObject(msg)
-                    
-                    
-                    
-                    
+                    msg = Potree.Common.CloneObject(msg) 
                     //console.log(model.name, msg)
                     bus.emit('transformChanged', msg)
-                })
-                spliceFromArr(model, props, true)
- 
-                model.addEventListener('changeSelect', (e) => {
-                    MergeEditor.transformControls.visible && e.selected && MergeEditor.transformControls.attach(model, e.clickPos) //: MergeEditor.transformControls.detach()
-                }) 
-
-                MergeEditor.modelAdded(model)
-                
-                load4dkkMedias(model)    
-                
-                if (props.mode == 'single') {//模型查看页
-                    MergeEditor.noNeedSelection = true
-                    setTimeout(() => {
-                        MergeEditor.focusOn([model], 1000, true, true)
-                    }, 1)
-                }
-                if(ModelTypes[props.fromType].panos4dkk){
-                    Potree.load4dkkPanos(props.raw.num, model, getBaseRotation(), () => {
-                        bus.emit('loadDone',model)
-                    },    props.fromType == 0 ? '2k' : '4k' ) //看看场景是2k
-                } else {
-                    bus.emit('loadDone',model)
                 }
+                model.addEventListener('transformChanged', (e) => {
+                    emitTran(e)
+                })
+                setTimeout(()=>{
+                    emitTran({byControl:true}) //保存初始
+                },1) //刚loadDone还没开始监听所以延时
                 
-                
-                
-                //console.log('loadDone' )
             }
+            
+            
             let progressFun = (progress) => {
                 bus.emit('loadProgress', progress)
             }
@@ -1129,7 +1153,7 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                     return model?.panos?.length > 0
                 },
                 flyInPano(pano, {dontFly, quaternion, duration}={}) {//  飞入全景图
-                    requestInPano = model
+                    requestPanoModel = model
                     pano = pano || viewer.images360.findNearestPano(null, model.panos)
                     if (pano) {  
                         dontFly || viewer.images360.flyToPano({ pano, canCancelLast: true, quaternion, duration})
@@ -1139,10 +1163,10 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                     }
                 },
                 flyOutPano() {//  飞出全景图(就是切换到正常融合视角)
-                    requestInPano = false
+                    requestPanoModel = false
                     Potree.settings.displayMode = 'showPointCloud'
                     /* setTimeout(() => {//在下一帧再变,因为3dtiles需要更新一下才会显示tiles 
-                        if (!requestInPano) {
+                        if (!requestPanoModel) {
                             Potree.settings.displayMode = 'showPointCloud'
                             Potree.Utils.updateVisible(MergeEditor.boxHelper, 'showPanos', true)
                         }
@@ -1167,6 +1191,8 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                     model.position.z += model.boundSize.z / 2 
                     model.dispatchEvent({type:"position_changed", byControl:true}) //compute bound and emit
                     MergeEditor.history.afterChange(model)
+                    viewer.dispatchEvent('content_changed')
+                    model.visiChangeCallback && model.visiChangeCallback(true)  //3dtiles再更新下可见性
                 },
 
                 putInFrontOfCam(){//首次加载放在面前,高度和相机一致。(但不保证会不会被遮挡) 
@@ -2498,16 +2524,9 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
             let pPos = new THREE.Vector3(0, 0, 0).applyMatrix4(camera.matrixWorld);
             
             let orientation
-            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);
-                //console.log('toCes',cPos,height) //数字过大如e35会崩溃
-                return cPos;
-            };
+            
 
-            let cPos = toCes(pPos);
+            let cPos = Potree.math.toCes(pPos);
             
             
             
@@ -2542,8 +2561,8 @@ export const enter = ({ dom, mapDom, isLocal, lonlat, scenes, laserRoot, laserOS
                 let pUp = new THREE.Vector3(0, 600, 0).applyMatrix4(camera.matrixWorld);
                 let pTarget = viewer.scene.view.getPivot();
                 
-                let cUpTarget = toCes(pUp);
-                let cTarget = toCes(pTarget);
+                let cUpTarget = Potree.math.toCes(pUp);
+                let cTarget = Potree.math.toCes(pTarget);
 
                 let cDir = Cesium.Cartesian3.subtract(cTarget, cPos, new Cesium.Cartesian3());
                 let cUp = Cesium.Cartesian3.subtract(cUpTarget, cPos, new Cesium.Cartesian3());
@@ -2668,6 +2687,7 @@ function load4dkkMedias(model){//加载四维看看的一些媒体物品
                     
                     if(!prop.url.substr(0,5).includes('http')) prop.url = location.origin + prop.url
                  
+                    prop.id = prop.sid //新加
                      //Potree.settings.urls.getPrefix(8,model)
                      //isNew:true, //是否新创建而非加载  
                     Potree.addModel(prop,(overlay)=>{