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