问题描述:
在UE中使用CesiumForUnreal插件,利用url加载地形数据时,如果地形数据不全,则会出现缺块问题。
解决思路:
修改Cesium For Unreal插件代码,如果当前层没有数据则加载上一层,如果上一层也没有,则继续向上索引,直至有数据。
解决步骤:
将引擎中的插件代码复制到项目的Plugins目录下
引擎插件目录:…\UE_5.2\Engine\Plugins\Marketplace
注:建议删除引擎目录下的原插件,否则在打包时可能会出现问题
修改Cesium3DTileset.cpp里的ACesium3DTileset::showTilesToRender函数
for (Cesium3DTilesSelection::Tile* pTile : tiles) {
//添加如下代码,加载状态为Failed时,就是没有请求到数据,因此向上寻找父结点
while (pTile->getState() == Cesium3DTilesSelection::TileLoadState::Failed)
{
pTile = pTile->getParent();
}
if (pTile->getState() != Cesium3DTilesSelection::TileLoadState::Done) {
continue;
}
....
}
修改后重新编译测试,问题已解决。即使视角拉到地面,也不会发生缺块不渲染的现象。
后记:
与此同时也带来了一个新的问题,在Cesium For Unreal里地形和影像的层级是绑定的,因此影像的显示层级受限于地形的层级,如上图所示,即使我拥有很高精度的影像,在拉到地面时仍然不会显示出来。
此部分的逻辑在CesiumRasterOverlay.cpp的UCesiumRasterOverlay::AddToTileset函数里:
if (pOverlay) {
this->_pOverlay = pOverlay.release();
pTileset->getOverlays().add(this->_pOverlay);
this->OnAdd(pTileset, this->_pOverlay);
}
只可惜这部分内部的处理被封装在了插件的三方库里,不太好修改,目前先暂时放下,日后有时间再进行进一步探索。