个人学习笔记,解决过程为个人探索,可能不太合适或存在纰漏,敬请谅解。
需求:
在Cesium for unreal 的地球上叠加显示海水
遇到的问题:
1.Cesium for unreal自带一个水掩膜效果,包裹了整个地球,在Cesium world terrain或Cesium3DTileset中打开Enable Water Mask即可,但效果欠佳,且只是一个面片,无体积,无浮力
2.与之相比Oceanology插件效果较好,但在Cesium球上直接使用不能很好适配
(1)BP_Oceanology_Infinity会一直跟随视角在海洋初设高度的水平面上移动,如果当前视角远离Cesium的世界原点时,Oceanology海洋的位置将不正确,离地表越来越远
(2)如果给BP_Oceanology_Infinity添加CesiumGlobeAnchor组件后绑定经纬度,强行设定高度和旋转角度后,海洋的中间精细部分有时会发现偏移,显示不正确。即使不偏移,此时海平面和地球地表相切,添加了旋转角度,使得海平面不再和在UE世界坐标的XY平面平行,如果这个角度过大,海浪的显示将完全不正确。
解决方法:
前置修改:
修改cesium for unreal 插件源码,增加可以在运行时调用重设世界原点的函数:
CesiumGeoreference类下添加:
CesiumGeoreference.h:
UFUNCTION(BlueprintCallable, Category = "CesiumGeoreference")
void
UpdateGeoreferenceOrigin(const FVector& TargetLongitudeLatitudeHeight);
CesiumGeoreference.cpp:
void ACesiumGeoreference::UpdateGeoreferenceOrigin(const FVector& TargetLongitudeLatitudeHeight)
{
glm::dvec3 targetGeoreferenceOrigin = VecMath::createVector3D(TargetLongitudeLatitudeHeight);
this->_setGeoreferenceOrigin(
targetGeoreferenceOrigin.x,
targetGeoreferenceOrigin.y,
targetGeoreferenceOrigin.z);
}
使用过程:
注意点:
1.确保整个场景中的所有静态对象都带有Cesium地理参考组件CesiumGlobeAnchor,否则重设世界原点后没有绑定地理坐标的对象将重新定位从而脱离原先位置
2.更改海洋位置为世界原点时需要连续调两次才能显示正确,暂不清楚为什么。
3.只有在程序开始运行时在当前视角处动态生成一个Oceanology海洋后,经过上述操作后才会显示正确。如果在编辑器中事先添加一个Oceanology海洋,此时程序运行后,如果初始位置不在海洋的初设位置时,重设原点并移动海洋后,海洋中间一块将会发生偏移从而显示不正确,暂不清楚为什么。
测试效果:
世界初始原点设在台湾东海岸附近
TestPawn2在台湾东海岸
TestPawn3在海南南海岸
二者显示均正确