使用产品:iserver 10i 操作系统:win11 x64
问题详细描述:使用CesiumLab处理倾斜摄影模型生成b3dm(3dtiles)文件,用超图iserver发布后加载有位置偏差,不进行高度设置的话,定位模型会定位到地下,进行高度设置的话,低于6000高度模型不可见,只有设置高度为6000时,模型才看见而且位置有很大偏移。
问题重现步骤:
1.不设置高度,模型的定位在地下,且不可见,而且定位有很大偏差
var tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({ url: 'http://localhost:8090/iserver/services/3D-ThreeDTilesCache-tileset/rest/realspace/datas/tileset/config', isSuperMapiServer: true }))
console.log(tileset);
tileset.readyPromise.then(function () {
var boundingSphere = tileset.boundingSphere;
viewer.camera.viewBoundingSphere(boundingSphere, new Cesium.HeadingPitchRange(0.0, -0.5, boundingSphere.radius));
viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY);
}).otherwise(function (error) {
throw (error);
});
viewer.zoomTo(tileset);
2.设置高度的话,模型可见,定位同样有很大偏差
var heightOffset = 6000.0;
// 计算tileset的绑定范围
var boundingSphere = tileset.boundingSphere;
//计算中心点位置
var cartographic = Cesium.Cartographic.fromCartesian(boundingSphere.center);
//计算中心点位置的地表坐标
var surface = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
//偏移后的坐标
var offset = Cesium.Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, heightOffset);
var translation = Cesium.Cartesian3.subtract(offset, surface, new Cesium.Cartesian3());
//tileset.modelMatrix转换
tileset.modelMatrix = Cesium.Matrix4.fromTranslation(translation);
// viewer.camera.flyTo({
// destination: Cesium.Cartesian3.fromDegrees(105.43018982213219, 30.83879006845878, 177.4158198337222),
// orientation: {
// heading: 6.283185307179586,
// pitch: -0.50001587749796,
// roll: 6.283185307179586
// }
// });
补充:之后通过测试,发现转换得到的3dtile在原生Cesium中通过本地调用的方法不会发生位置偏移,初始加载高度也正常,是supermap webgl使用的椭球不同的问题吗?但是我之前的功能都是基于超图实现的,所以想知道有转换的方法吗?