Cesium For Unreal球上叠加Oceanology海洋的解决方法

本文讲述了在Cesiumforunreal中叠加显示海水遇到的问题,如水掩膜效果欠佳、Oceanology插件适配问题,以及作者提出的修改Cesiumforunreal源码并重设世界原点的方法,以及使用注意事项和测试结果。
摘要由CSDN通过智能技术生成

个人学习笔记,解决过程为个人探索,可能不太合适或存在纰漏,敬请谅解。

需求:

在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在海南南海岸
在这里插入图片描述

二者显示均正确

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值