xzw 1 год назад
Родитель
Сommit
b8ca48d8fd
3 измененных файлов с 186 добавлено и 100 удалено
  1. 183 98
      public/lib/potree/potree.js
  2. 1 1
      public/lib/potree/potree.js.map
  3. 2 1
      src/sdk/cover/index.js

+ 183 - 98
public/lib/potree/potree.js

@@ -5315,11 +5315,13 @@
 	          info.onUpdate && info.onUpdate(progress, delta);
 	        }), info.duration, posDone, 0, info.Easing ? easing[info.Easing] : easing.easeInOutSine, null, this.FlyTransition, () => {
 	          //中途取消 
-	          if (endTarget) {
+	          if (rotWaitDone) {
 	            /* endPosition = new THREE.Vector3().copy(this.position)//更改旋转的endQuaternion 
 	            endQuaternion = math.getQuaFromPosAim(endPosition,endTarget)  */
 	            //直接改变endQuaternion会突变,所以还是cancel吧
 	            this.cancelFlying('rotate');
+	          } else {
+	            this.dispatchEvent('flyCancel');
 	          }
 	          posWaitDone = false;
 	          info.cancelFun && info.cancelFun();
@@ -5343,8 +5345,14 @@
 	          //中途取消
 	          rotWaitDone = false;
 	          info.cancelFun && info.cancelFun();
+	          this.dispatchEvent('flyCancel');
 	        }, info.ignoreFirstFrame);
 	      }
+	      if (!posWaitDone && !rotWaitDone) {
+	        //已经到达目标
+	        info.onUpdate && info.onUpdate(1);
+	        done();
+	      }
 
 	      /*  transitions.start(lerp.vector(this.position, endPosition, (pos, progress)=>{
 	      let t = progress 
@@ -21184,9 +21192,7 @@
 	        if (!Potree.settings.UserPointDensity) {
 	          Potree.settings.UserPointDensity = 'high'; //'middle' 
 	        }
-	        Potree.Log('loadPointCloudDone  点云加载完毕', {
-	          font: [null, 10]
-	        });
+	        Potree.Log('loadPointCloudDone  点云加载完毕');
 	      }
 	      {
 	        //初始位置 
@@ -21425,7 +21431,10 @@
 
 	      pointcloud.updateMatrixWorld();
 	      Potree.Log("\u70B9\u4E91".concat(pointcloud.dataset_id, "(").concat(pointcloud.name, ")\u65CB\u8F6C\u503C:").concat(pointcloud.orientationUser, ", \u4F4D\u7F6E").concat(math.toPrecision(pointcloud.translateUser.toArray(), 3), ", \u7ECF\u7EAC\u5EA6 ").concat(dataset.location, ", spacing ").concat(pointcloud.material.spacing), {
-	        font: [null, 13]
+	        font: {
+	          color: "#5af",
+	          fontSize: 13
+	        }
 	      });
 	    };
 	    if (!Potree.settings.originDatasetId) Potree.settings.originDatasetId = data[0].id;
@@ -21440,65 +21449,64 @@
 	    {
 	      //拿初始数据集作为基准。它的位置要放到000
 	      var locationLonLat = originDataset.location.slice(0, 2);
-	      if (window.AMapWith84) {
-	        //需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差.    navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
-	        locationLonLat = AMapWith84.wgs84ToAMap({
-	          x: locationLonLat[0],
-	          y: locationLonLat[1]
-	        });
-	        locationLonLat = [locationLonLat.x, locationLonLat.y];
-	      }
+	      Potree.setLonlat(locationLonLat[0], locationLonLat[1]);
+	      /* if(window.AMapWith84){//需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差.    navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
+	          locationLonLat = AMapWith84.wgs84ToAMap({x:locationLonLat[0], y:locationLonLat[1]})
+	          locationLonLat = [locationLonLat.x,locationLonLat.y] 
+	      }  
+	      
+	      
 	      proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //高德坐标系
 	      proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //地图和本地一样
 	      proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
-	      var transform1 = proj4("WGS84", "LOCAL"); //这个ok 是展开的平面投影  LOCAL即NAVVIS:TMERC
-	      var transform2 = proj4("+proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +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  
-	      };
-	      if (window.AMapWith84 && Potree.settings.mapCompany != 'google') {
-	        //需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
-	        var change = transform => {
-	          var forward = transform.forward;
-	          var inverse = transform.inverse;
-	          transform.forward = function (e, not84) {
-	            var needTran = e.x == void 0;
-	            if (needTran) var a1 = {
-	              x: e[0],
-	              y: e[1]
-	            };else var a1 = e;
-	            var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1);
-	            if (needTran) {
-	              a = [a.x, a.y];
-	              e[2] != void 0 && (a[2] = e[2]);
-	            } else {
-	              e.z != void 0 && (a.z = e.z);
-	            }
-	            return forward(a);
-	          };
-	          transform.inverse = function (e, not84) {
-	            var needTran = e.x == void 0;
-	            var a = inverse(e);
-	            needTran && (a = {
-	              x: a[0],
-	              y: a[1]
-	            });
-	            a = not84 ? a : AMapWith84.aMapToWgs84(a);
-	            if (needTran) {
-	              a = [a.x, a.y];
-	              e[2] != void 0 && (a[2] = e[2]);
-	            } else {
-	              e.z != void 0 && (a.z = e.z);
-	            }
-	            return a;
-	          };
-	        };
-	        for (var f in viewer.transform) {
-	          change(viewer.transform[f]);
-	        }
-	      }
+	          lonlatToLocal : transform1,
+	          lonlatTo4550 : transform2       // 转大地坐标EPSG:4550  
+	      } 
+	      
+	      if(window.AMapWith84 && Potree.settings.mapCompany != 'google'){//需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
+	          let change = (transform)=>{
+	              let forward = transform.forward
+	              let inverse = transform.inverse;
+	              
+	              transform.forward = function(e, not84){
+	                   let needTran = e.x == void 0 
+	                   if(needTran)var a1 = {x:e[0],y:e[1]}
+	                   else var a1 = e
+	                   var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1)
+	                   if(needTran){
+	                       a = [a.x, a.y];  e[2] != void 0 && (a[2] = e[2])
+	                   }else{
+	                       e.z != void 0 && (a.z = e.z)
+	                   }       
+	                   return  forward(a)
+	              }
+	              
+	              transform.inverse = function(e, not84){
+	                  let needTran = e.x == void 0
+	                  var a = inverse(e)
+	                  needTran && (a = {x:a[0],y:a[1]})
+	                  a = not84 ? a : AMapWith84.aMapToWgs84(a)  
+	                  
+	                  if(needTran){
+	                      a = [a.x,a.y];  e[2] != void 0 && (a[2] = e[2])
+	                  }else{
+	                      e.z != void 0 && (a.z = e.z)
+	                  } 
+	                  return a
+	                  
+	              } 
+	               
+	          }
+	          for(let f in viewer.transform){
+	              change(viewer.transform[f]) 
+	          }  
+	      }  */
+
 	      viewer.mapViewer && viewer.mapViewer.mapLayer.maps[0].updateProjection();
 	    }
 	    data.forEach((dataset, index) => {
@@ -21554,7 +21562,9 @@
 	        var pointcloud = viewer.scene.pointclouds.find(p => p.dataset_id == dataset.id);
 	        if (!pointcloud) {
 	          Potree.Log('数据集id变了,自动使用第一个', {
-	            font: ['#500']
+	            font: {
+	              color: '#500'
+	            }
 	          });
 	          pointcloud = viewer.scene.pointclouds[0];
 	        }
@@ -21674,9 +21684,7 @@
 	      boundSize,
 	      center
 	    } = viewer.bound;
-	    Potree.Log("\u4E2D\u5FC3\u70B9: ".concat(math.toPrecision(center.toArray(), 2), ", boundSize: ").concat(math.toPrecision(boundSize.toArray(), 2), " "), {
-	      font: [null, 12]
-	    });
+	    Potree.Log("\u4E2D\u5FC3\u70B9: ".concat(math.toPrecision(center.toArray(), 2), ", boundSize: ").concat(math.toPrecision(boundSize.toArray(), 2), " "));
 	    viewer.scene.view.setView({
 	      position: center.clone().add(new Vector3(10, 5, 10)),
 	      target: center
@@ -21828,9 +21836,7 @@
 	          if (!Potree.settings.UserPointDensity) {
 	            Potree.settings.UserPointDensity = 'high'; //'middle' 
 	          }
-	          Potree.Log('loadPointCloudDone  点云加载完毕', {
-	            font: [null, 10]
-	          });
+	          Potree.Log('loadPointCloudDone  点云加载完毕');
 	        }
 	        viewer.dispatchEvent('allLoaded');
 	        done(pointcloud);
@@ -25531,9 +25537,10 @@
 	    }; //拓宽的lineWidth      
 
 	    //raycaster.layers.enableAll()//add
-	    Potree.Utils.setCameraLayers(raycaster,
-	    //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
-	    ['sceneObjects', 'mapObjects', 'measure', 'transformationTool', 'model', 'bothMapAndScene'], this.hoverViewport && this.hoverViewport.extraEnableLayers);
+	    var layers = ['sceneObjects', 'mapObjects', 'measure', 'transformationTool', 'model', 'bothMapAndScene']; //设置能识别到的layers(如空间模型里只有mapViewer能识别到marker)
+	    if (Potree.settings.mergeType2 && Potree.settings.modelSkybox && Potree.settings.displayMode == 'showPanos' && !viewer.images360.currentPano.pointcloud.hasDepthTex) layers.push('skybox'); //model变成skybox了
+	    Potree.Utils.setCameraLayers(raycaster, layers, this.hoverViewport && this.hoverViewport.extraEnableLayers);
+
 	    //this.hoverViewport.beforeRender && this.hoverViewport.beforeRender()
 
 	    viewer.dispatchEvent({
@@ -26981,7 +26988,7 @@
 	      markerTex.ring.anisotropy = 4;
 	      //有可能被点云遮住吗。 
 	    }
-	    return new DepthBasicMaterial({
+	    var mat = new DepthBasicMaterial({
 	      opacity: markerOpacitys.default,
 	      side: DoubleSide,
 	      map: markerTex.default,
@@ -26989,10 +26996,12 @@
 	      clipDistance: 2,
 	      occlusionDistance: 1,
 	      //不能设置太短,因为过渡时深度不准确 
-	      useDepth: !!(Potree.settings.useDepthTex && this.pointcloud.hasDepthTex),
+	      useDepth: !!(Potree.settings.useDepthTex && this.pointcloud.hasDepthTex || Potree.settings.modelSkybox && this.pointcloud.is4dkkModel),
 	      autoDepthTest: true
 	      //改为DepthBasicMaterial是因为原Basic的材质在有深度图时过渡会先隐藏后出现。 注:没有深度图时全景模式的marker无法遮挡
 	    });
+	    mat.mapTransparent = true;
+	    return mat;
 	  }
 	  hoverOn() {
 	    var e = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
@@ -30291,7 +30300,7 @@
 	      this.cube.layers.set(Potree.config.renderLayers.skybox);
 	      this.cube.name = 'skyboxCube';
 	      viewer.scene.scene.add(this.cube);
-	      if (Potree.settings.mergeType2) {
+	      if (Potree.settings.mergeType2 && Potree.settings.modelSkybox) {
 	        this.materialInside = new ModelTextureMaterial();
 	        this.materialInside.dontChangeDepth = true; //chunk本身深度是对的,不用深度图,否则过渡会有很多裂痕
 	        this.cube.material.defines.depth_background = ''; //skybox的深度改得向后一些, 避免盖住chunk,造成坑坑洼洼
@@ -30515,8 +30524,10 @@
 	                  Potree.settings.displayMode = mode;
 	                }
 	                viewer.mainViewport.view.removeEventListener('flyingDone', f);
+	                viewer.mainViewport.view.removeEventListener('flyCancel', f);
 	              };
 	              viewer.mainViewport.view.addEventListener('flyingDone', f); //once
+	              viewer.mainViewport.view.addEventListener('flyCancel', f);
 	              return;
 	            }
 	            if (this.isAtPano() && !this.latestToPano) {
@@ -30533,7 +30544,7 @@
 	                  this.removeEventListener('flyToPanoDone', wait);
 	                  setTimeout(() => {
 	                    if (this.latestRequestMode == mode) {
-	                      Potree.settings.displayMode = mode;
+	                      Potree.settings.displayMode = mode; //被打断,重新执行
 	                    }
 	                  }, e.makeIt ? 1 : 50);
 	                };
@@ -30730,14 +30741,14 @@
 	    });
 	  }
 	  judgeModelMat(object) {
-	    if (!Potree.settings.mergeType2) return;
+	    if (!(Potree.settings.mergeType2 && Potree.settings.modelSkybox)) return;
 	    object.traverse(mesh => {
 	      if (mesh.material) {
 	        if (!mesh.materialOutside) {
 	          mesh.materialOutside = mesh.material;
 	        }
 	        mesh.material = Potree.settings.displayMode == 'showPanos' ? this.materialInside : mesh.materialOutside;
-	        Potree.Utils.setObjectLayers(mesh, Potree.settings.displayMode == 'showPanos' ? 'skybox' : 'model');
+	        Potree.Utils.setObjectLayers(mesh, Potree.settings.displayMode == 'showPanos' ? 'skybox' : 'model'); //为了渲染到rtEDL
 	      }
 	    });
 	  }
@@ -30849,7 +30860,7 @@
 	    if (!toPano.pano.enabled) return done(false, true);
 	    //Potree.Log('hope flyToPano: '+toPano.pano.id, toPano.pano.position.toArray() )
 
-	    if (this.latestToPano && this.latestToPano != toPano && (
+	    if (!toPano.canCancelLast && this.latestToPano && this.latestToPano != toPano && (
 	    //还在飞
 	    this.latestToPano.pano != this.currentPano || !this.isAtPano())) {
 	      //如果旧的toPano只在pano旋转镜头,就直接取消旧的,继续执行 
@@ -35268,6 +35279,7 @@
 	  }
 	  setRenderCloud() {
 	    var _this = this;
+	    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
 	    //使利用viewer的渲染来渲染点云   (如果点云不旋转其实也可以贴floorplan……)
 	    this.renderPointcloud = true;
 	    this.viewports[0].noPointcloud = false;
@@ -35283,6 +35295,9 @@
 	        //注意:mapViewer.needRender的权重高于它的viewport的needRender,也就是说,当attachedToViewer时,viewer即使needRender, mapViewer也不一定会渲染。
 	        return;
 	      }
+	      if (!options.renderMeasure) {
+	        viewer.scene.measurements.forEach(e => Potree.Utils.updateVisible(e, 'renderCloudAtMap', false));
+	      }
 	      viewer.renderDefault({
 	        viewports: _this.viewports,
 	        camera: _this.camera,
@@ -35291,6 +35306,7 @@
 	        clear: oldMapClear,
 	        pRenderer
 	      });
+	      viewer.scene.measurements.forEach(e => Potree.Utils.updateVisible(e, 'renderCloudAtMap', true));
 	    };
 	  }
 
@@ -41963,8 +41979,8 @@
 	var areaPlaneMats = {};
 	class Prism extends Measure$1 {
 	  constructor(args) {
+	    args.isPrism = true;
 	    super(args);
-	    this.isPrism = true;
 	    this.volumeInfo = {};
 	    this.needsCompute = true;
 	    /*this.createPrismLines(new THREE.Color('#FFF') )
@@ -64275,7 +64291,7 @@
 	    if (!params.magnifier) {
 	      if (Potree.settings.displayMode == 'showPanos' || Potree.settings.testCube) {
 	        Potree.Utils.setCameraLayers(camera, ['skybox']);
-	        if (Potree.settings.displayMode == 'showPanos' && viewer.images360.currentPano.pointcloud.hasDepthTex && rtEDL) {
+	        if (Potree.settings.displayMode == 'showPanos' && (viewer.images360.currentPano.pointcloud.hasDepthTex || Potree.settings.modelSkybox && viewer.images360.currentPano.pointcloud.is4dkkModel) && rtEDL) {
 	          //渲染深度图
 
 	          renderer.setRenderTarget(rtEDL); //将带有深度图的skybox画在rtEDL一下,这样就不需要绘制后边的点云了
@@ -81551,10 +81567,10 @@
 	      horizonZ = prism.horizonZ;
 	      zMin = prism.zMin;
 	      zMax = prism.zMax;
-	      bound = new Box3();
-	      for (var i = 0; i < prism.points.length; i++) {
-	        bound.expandByPoint(prism.points[i]);
-	      }
+	      bound = new Box3().copy(prism.prismBound);
+	      /* for(let i=0;i<prism.points.length;i++){
+	          bound.expandByPoint(prism.points[i])
+	      } */
 	    } else {
 	      zMin = this.computingObject.model.clipBound.min.z;
 	      zMax = this.computingObject.model.clipBound.max.z;
@@ -81582,7 +81598,7 @@
 
 	    bound.getCenter(center);
 	    bound.getSize(boundSize);
-	    this.boundSizeZero = boundSize.x <= 0 || boundSize.y <= 0 || boundSize.z <= 0; //prism的问题
+	    this.boundSizeZero = boundSize.x <= 0 || boundSize.y <= 0 || this.computingObject.model && boundSize.z <= 0; //prism的问题
 	    if (this.boundSizeZero) {
 	      computeDone({
 	        highest: 0,
@@ -81660,11 +81676,11 @@
 	    boundSize_.x /= cW, boundSize_.y /= cH;
 
 	    //分批渲染:从左到右 从下到上
-	    var _loop = async function _loop(_i) {
+	    var _loop = async function _loop(i) {
 	        var _loop2 = async function _loop2(j) {
 	            var infos = [];
-	            var progressStart = (_i * cH + j) / (cW * cH),
-	              progressEnd = (_i * cH + j + 1) / (cW * cH);
+	            var progressStart = (i * cH + j) / (cW * cH),
+	              progressEnd = (i * cH + j + 1) / (cW * cH);
 	            if (interrupt) {
 	              return {
 	                v: {
@@ -81675,14 +81691,14 @@
 	            Potree.settings.pointDensity = 'screenshot'; //恢复为nodeMaxLevel
 	            //最高处朝下看,找挖方的顶部
 	            _this.view.pitch = -Math.PI / 2;
-	            var endPosition = new Vector3(center.x + (_i - cW / 2 + 0.5) * boundSize_.x, center.y + (j - cH / 2 + 0.5) * boundSize_.y, center.z);
+	            var endPosition = new Vector3(center.x + (i - cW / 2 + 0.5) * boundSize_.x, center.y + (j - cH / 2 + 0.5) * boundSize_.y, center.z);
 	            _this.view.moveOrthoCamera(_this.viewport, {
 	              boundSize: boundSize_,
 	              endPosition
 	            }, 0);
 	            var endPercent = _this.computingObject.model ? 0.7 : 0.4;
 	            await _this.render({
-	              i: _i,
+	              i,
 	              j,
 	              index: 1,
 	              cW,
@@ -81702,7 +81718,7 @@
 	              //水平面朝下看,找填方
 	              _this.view.position.z = horizonZ + _this.camera.near;
 	              await _this.render({
-	                i: _i,
+	                i,
 	                j,
 	                index: 2,
 	                cW,
@@ -81720,7 +81736,7 @@
 
 	            var result = {
 	              index: {
-	                i: _i,
+	                i,
 	                j
 	              },
 	              allFills: [],
@@ -81816,7 +81832,7 @@
 	                    return; //出界
 	                  }
 	                } else {
-	                  if (_this.getModelZByRes(u, v, cW, cH, _i, j) == void 0) {
+	                  if (_this.getModelZByRes(u, v, cW, cH, i, j) == void 0) {
 	                    return; //出界
 	                  }
 	                }
@@ -81924,8 +81940,8 @@
 	        }
 	      },
 	      _ret;
-	    for (var _i = 0; _i < cW; _i++) {
-	      _ret = await _loop(_i);
+	    for (var i = 0; i < cW; i++) {
+	      _ret = await _loop(i);
 	      if (_ret) return _ret.v;
 	    }
 	    var Vupper = 0,
@@ -89251,6 +89267,7 @@
 	    viewer.addTimeMark('renderOverlay', 'end');
 	  }
 	  renderOverlay1(params) {
+	    //渲染主要的mesh
 	    var camera = params.camera ? params.camera : this.scene.getActiveCamera();
 	    var renderer = params.renderer || this.renderer;
 	    this.reticule.updateAtViewports(params.viewport);
@@ -89272,8 +89289,9 @@
 	      if ('renderBeforeCloud' in params) {
 	        this.scene.scene.traverse(object => {
 	          if (object.material) {
-	            Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud && (object.material.opacity < 1 || !object.material.depthTest) || !params.renderBeforeCloud && object.material.opacity == 1 && object.material.depthTest ? false : true);
-	            //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。  depthTest==false的也最后渲染
+	            var transparent = object.material.opacity < 1 || object.material.mapTransparent || !object.material.depthTest;
+	            Potree.Utils.updateVisible(object, 'renderOpa', params.renderBeforeCloud != transparent);
+	            //点云之前渲染的话隐藏半透明的, 点云之后渲染的话隐藏不透明的。  depthTest==false的也最后渲染。 mapTransparent是手动加的,代表确定该贴图含有透明部分,即使opacity为1
 	          }
 	        }); //ground的材质中opacity为1,所以被当做不透明了
 	      }
@@ -89297,6 +89315,7 @@
 	    });
 	  }
 	  renderOverlay2(params) {
+	    //渲染剩余部分
 	    var renderer = params.renderer || this.renderer;
 	    var camera = params.camera ? params.camera : this.scene.getActiveCamera();
 	    //清除深度 !!!!
@@ -92450,10 +92469,13 @@
 	  model.is4dkkModel = true;
 	  model.panos = [];
 	  //模拟点云,需要rotX(90)+平移一段才能和四维看看的bound一样
-	  var rot1M = new THREE.Matrix4().makeRotationX(Math.PI / 2);
+	  var rot1M = new THREE.Matrix4();
 	  var pos1 = new THREE.Vector3();
-	  pos1.fromArray(model.runtime.getTileset().tileset.root.boundingVolume.box.slice(0, 3)); //必须要平移一段才能重合 
-	  pos1.copy(Potree.math.convertVector.ZupToYup(pos1));
+	  if (model.fileType == '3dTiles') {
+	    pos1.fromArray(model.runtime.getTileset().tileset.root.boundingVolume.box.slice(0, 3)); //必须要平移一段才能重合 
+	    pos1.copy(Potree.math.convertVector.ZupToYup(pos1));
+	    rot1M.makeRotationX(Math.PI / 2);
+	  }
 	  var pos1M = new THREE.Matrix4().setPosition(pos1);
 	  model.posRot1MatrixInvert = new THREE.Matrix4().multiplyMatrices(pos1M, rot1M).invert();
 	  model.rot1MatrixInvert = rot1M.clone().invert();
@@ -92514,6 +92536,68 @@
 	    fetchMethod: 'post'
 	  }, callback, callback);
 	}
+	function setLonlat(lon, lat) {
+	  var locationLonLat = [lon, lat];
+	  if (window.AMapWith84) {
+	    //需要转换为高德的,但该函数不准确,转入后再转出,和原来的有偏差.    navvis的我看data中存的globalLocation直接输入到高德地图后的定位和其要展示的定位一致,而我们要转为高德后才一致,猜测是navvis后台转为了高德可用的经纬度。 若不转的话,其他看起来没问题,仅高德地图定位不准确,因其为被加密后的火星坐标系。
+	    locationLonLat = AMapWith84.wgs84ToAMap({
+	      x: lon,
+	      y: lat
+	    });
+	    locationLonLat = [locationLonLat.x, locationLonLat.y];
+	  }
+	  proj4.defs("LOCAL", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //高德坐标系
+	  proj4.defs("LOCAL_MAP", "+proj=tmerc +ellps=WGS84 +lon_0=" + locationLonLat[0].toPrecision(15) + " +lat_0=" + locationLonLat[1].toPrecision(15)); //地图和本地一样
+	  proj4.defs("WGS84", "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs");
+	  var transform1 = proj4("WGS84", "LOCAL"); //这个ok 是展开的平面投影  LOCAL即NAVVIS:TMERC
+	  var 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  
+	  };
+	  if (window.AMapWith84 && Potree.settings.mapCompany != 'google') {
+	    //需要转换, 因本地高德用的lonlat和数据里的84不一样. (google地图在国内也用的高德,国外84)
+	    var change = transform => {
+	      var forward = transform.forward;
+	      var inverse = transform.inverse;
+	      transform.forward = function (e, not84) {
+	        var needTran = e.x == void 0;
+	        if (needTran) var a1 = {
+	          x: e[0],
+	          y: e[1]
+	        };else var a1 = e;
+	        var a = not84 ? a1 : AMapWith84.wgs84ToAMap(a1);
+	        if (needTran) {
+	          a = [a.x, a.y];
+	          e[2] != void 0 && (a[2] = e[2]);
+	        } else {
+	          e.z != void 0 && (a.z = e.z);
+	        }
+	        return forward(a);
+	      };
+	      transform.inverse = function (e, not84) {
+	        var needTran = e.x == void 0;
+	        var a = inverse(e);
+	        needTran && (a = {
+	          x: a[0],
+	          y: a[1]
+	        });
+	        a = not84 ? a : AMapWith84.aMapToWgs84(a);
+	        if (needTran) {
+	          a = [a.x, a.y];
+	          e[2] != void 0 && (a[2] = e[2]);
+	        } else {
+	          e.z != void 0 && (a.z = e.z);
+	        }
+	        return a;
+	      };
+	    };
+	    for (var f in viewer.transform) {
+	      change(viewer.transform[f]);
+	    }
+	  }
+	}
 
 	//site_model
 	/* {
@@ -92835,6 +92919,7 @@
 	exports.pointBudget = pointBudget;
 	exports.resourcePath = resourcePath;
 	exports.saveProject = saveProject;
+	exports.setLonlat = setLonlat;
 	exports.settings = settings;
 	exports.start = start;
 	exports.version = version;

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
public/lib/potree/potree.js.map


+ 2 - 1
src/sdk/cover/index.js

@@ -598,6 +598,7 @@ export const enter = (dom, mapDom, isLocal, lonlat) => {
             }
             let getDefaultRotation = ()=>{
                 //0看看,1看见,2深时,3用户上传三维模型,4深时mesh,5深光点云,6深光mesh
+                console.log(props.name, 'getDefaultRotation')
                 if(props.fromType == 1 || props.fromType == 6 || props.fromType == 4 && props.type != 'glb'    ){//来自4dkk的3dtiles初始需要转90度
                     return new THREE.Euler(Math.PI/2, 0,0)
                 }else return new THREE.Euler(0,0,0)
@@ -699,7 +700,7 @@ export const enter = (dom, mapDom, isLocal, lonlat) => {
                     }
                      
                     msg = Potree.Common.CloneObject(msg)
-                    //console.log(msg)
+                    console.log(model.name, 'transformChanged',msg)
                     bus.emit('transformChanged', msg )
                 }) 
                 spliceFromArr(model,true)