摄影圈子 hqmana.com

Cesium 之加载倾斜摄影3d模型(解决倾斜漂移问题)

        以Cesium3DTileset方式加载服务发布的倾斜摄影静态资源Json文件,参考如下:

item.url='倾斜摄影的json地址/tileset.json';
let tileset = window.viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
     url: item.url,
     // modelMatrix: Cesium.Matrix4.fromArray([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]),
     baseScreenSpaceError: 1024,
     //【重要】数值加大,能让最终成像变模糊
     skipScreenSpaceErrorFactor: 16,
     skipLevels: 1,
     immediatelyLoadDesiredLevelOfDetail: false,
     loadSiblings: false,
     cullWithChildrenBounds: true,
     skipLevelOfDetail: true, //开启跳级加载
     //这个参数默认是false,同等条件下,叶子节点会优先加载。但是Cesium的tile加载优先级有很多考虑条件,
     //这个只是其中之一,如果skipLevelOfDetail=false,这个参数几乎无意义。所以要配合skipLevelOfDetail=true来使用,
     //此时设置preferLeaves=true。这样我们就能最快的看见符合当前视觉精度的块,对于提升大数据以及网络环境不好的前提下有一点点改善意义。
      preferLeaves: true,
      //【重要】内存建议显存大小的50%左右,内存分配变小有利于倾斜摄影数据回收,提升性能体验
      maximumMemoryUsage: 1024
      //控制切片视角显示的数量,可调整性能
      // maximumScreenSpaceError: 2,//最大的屏幕空间误差
      // maximumNumberOfLoadedTiles: 100000, //最大加载瓦片个数
}));

 加载完后,打开浏览器往往会发现不尽人意,并且有可能与真实位置不匹配,与影像底图不贴合或者偏移了很远,这是可能是因为坐标系问题导致倾斜的中心点定位有问题,需要调整中心点位置。

        下面以代码方式动态调整倾斜中心点坐标。

    item.longitudeOffset=..
    item.latitudeOffset=..
    item.heightOffset=..
tileset.readyPromise.then(function (palaceTileset) {
     var longitude = item.longitudeOffset //模型需要改变的经度
     var latitude = item.latitudeOffset //模型需要改变的纬度
     //获取3Dtlies的bounds范围
     var boundingSphere = palaceTileset.boundingSphere;
     //获取3Dtlies的范围中心点的弧度
     var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
     //定义3Dtlies改变之后中心点的弧度
      var offsetvalue = Cesium.Cartographic.fromDegrees(longitude, latitude, item.heightOffset)
     // debugger
     //模型本身的位置
     var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, cartographic.height);
     //模型改变的位置
     var offset = Cesium.Cartesian3.fromRadians(offsetvalue.longitude, offsetvalue.latitude, item.heightOffset);
     //定义模型的改变状态
     var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
     //修改模型的位置
     palaceTileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
 
     var headingAngle = item.headingAngle;
     var pitchAngle = item.pitchAngle;
     var rollAngle = item.rollAngle;
     var lon = item.lon;
     var lat = item.lat;
     var height = item.height;
     if (headingAngle && pitchAngle && rollAngle && lon && lat && height) {
     window.viewer.scene.camera.setView({
     // 初始化相机经纬度
     destination: Cesium.Cartesian3.fromDegrees(lon, lat, height),
     orientation: {
     heading: Cesium.Math.toRadians(headingAngle),
     pitch: Cesium.Math.toRadians(pitchAngle), //从上往下看为-90
     roll: Cesium.Math.toRadians(rollAngle)
     }
   });
 
   } else {
       window.viewer.flyTo(tileset)
   }
})

通过以上设置如果发现

(1)首次加载时已经和影像底图贴合,但是移动视角后,仍然会出现倾斜漂移问题,如下图所示

说明倾斜的高度比实际地形更高,需要适当降低高度,直至调到合适高度为止。

(2)如果无论怎么设置,要么出现漂移,要么倾斜跑地下被挡住,这有可能是地形的精度不够或与倾斜精度相差太大所导致。

 

版权声明
本文为[汪小敏同学]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_44692055/article/details/126927817

Scroll to Top