XbsjEarth
该库提供Obj.Tileset
方法,加载3dtile
模型,但是在地图上却无法显示出该模型,且控制台也没有报错,核心代码如下所示:
const getEarth = (...p) => {
for(let pi of p){
if(pi instanceof XE.Earth){
return pi;
}
if(typeof pi === 'object'){
let v = null;
for(let k in pi){
v = pi[k];
if(v instanceof XE.Earth){
return v;
}
}
}
}
return null;
};
function TilesetModel(option) {
const _url = option.url
const _id = option.id
...
const instance = new XE.Obj.Tileset(getEarth(...arguments) || _earthsdk);
var conf = {
"xbsjType": "Tileset",
url:_url,
"xbsjRotation": [_heading,_pitch,_roll],
xbsjScale:[_scale,_scale,_scale],
...
}
instance.xbsjFromJSON(conf);
instance.xbsjGuid = _id;
instance._tileset.guid = _id;
if (!isNaN(option.colorBlendMode)) {
instance._tileset.colorBlendMode = option.colorBlendMode;
}
if (!isNaN(option.colorBlendAmount)) {
instance._tileset.colorBlendAmount = option.colorBlendAmount;
}
}
但用它加载某特定的3dTile
数据时,却无法在地图上显示,控制台也没报错
推断 -> 可能是该3dTile
数据的部分属性没有获取到(或封装的参数不兼容),从而导致模型没有加载在地图上。
该如何解决呢?既然XbsjEarth
是基于Cesium
库而封装的,那直接使用原生Cesium
去加载该3dTile
,是不是可以解决该问题呢?
Cesium
其部分核心代码如下所示:
const viewer = new Cesium.Viewer("cesiumContainer");
const tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url
}));
viewer.flyTo(tileset)
使用该方法,便能成功加载上面的3dTile
了。
结论:看来封装的库虽好,但某些时候可能会出现一些意想不到的问题,建议大家多了解底层代码,这样才能从根本上去解决问题