问题描述:

在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.cppUCesiumRasterOverlay::AddToTileset函数里:

  if (pOverlay) {
    this->_pOverlay = pOverlay.release();
    pTileset->getOverlays().add(this->_pOverlay);
    this->OnAdd(pTileset, this->_pOverlay);
  }

只可惜这部分内部的处理被封装在了插件的三方库里,不太好修改,目前先暂时放下,日后有时间再进行进一步探索。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐