找回密码
 立即注册
查看: 325|回复: 1

(四)Cesium for Unreal将对象放置在地球上(译)

[复制链接]
发表于 2022-11-8 16:49 | 显示全部楼层 |阅读模式
原文请参考Cesium官方文档:Placing Objects on the Globe
上一篇:(三)Cesium for Unreal使用自定义控制器(译)
创建了一个关卡并导入了诸如Cesium World Terrain或城市的倾斜摄影模型之类的现实世界资产后,您可能要做的下一步就是从标准虚幻引擎工具箱中添加一些其他对象:网格体、植被、角色等等。很幸运的是,Cesium for Unreal与您已经熟悉的虚幻引擎工作流程可以很好地集成在一起。


在本教程中,您将学习如何:

  • 将一些简单的虚幻引擎对象添加到关卡中。
  • 详细了解Cesium for Unreal如何和虚幻引擎集成,这将帮助您在创建关卡时避免踩雷。
准备工作


  • 您已经用Cesium for Unreal创建了一个关卡,可能是通过(一)Cesium for Unreal快速入门(译)或(二)添加倾斜摄影模型(译)教程创建的。现在,您将要添加更多虚幻引擎对象。
将静态网格体添加到Cesium for Unreal关卡中

CesiumGeoreference的原点附近添加对象与将它们添加到任何其他虚幻引擎关卡中的流程是一样的。



  • 如果编辑器镜头位置不在CesiumGeoreference合理的范围(几公里)内,在Wold Outliner中选中CesiumGeoreference,然后Details面板中单击Place Georeference Origin Here。您可能还需要将FloatingPawnLocation重置为(0,0,0),以便运行时从编辑器镜头的同一位置开始。
  • 单击Window -> Place Actors以打开Place Actors面板。
  • 将静态网格体(例如Cone)拖到关卡窗口中。
  • 使用关卡编辑窗口可以根据需要移动、旋转和缩放静态网格体。
任何普通的虚幻引擎对象都可以按常规方式添加到关卡中。但是,了解一些细节会对您更有帮助,下面将对其进行讨论。
重置世界坐标原点

重置坐标原点是虚幻引擎的功能,有利于在非常大的场景中保持顶点坐标的精度。它通过将单独的OriginLocation保留为一组整数(而不是浮点数)坐标值来工作。当OriginLocation改变时,关卡中的每个对象的浮点坐标值被更新,使得所有的对象的相对坐标保持不变,但现在新指定的OriginLocation是游戏世界的中心点(0 ,0,0)。
默认情况下,当观察者在世界中移动时,CesiumGeoreference会自动将世界原点重新设定为靠近观察者的位置。这确保了观察者附近的对象具有较小的坐标值,因此可以被非常精确地定位。因此,这避免了称为“抖动”的渲染瑕疵,在这种情况下,镜头和镜头附近的另一个对象的坐标值都很大,小数点精度问题会导致该对象在镜头或对象移动时跳来跳去,一直抖动。


在此图片中,将镜头缩放到离原点很远的圆锥体附近。圆锥体和变换轴出现了“抖动”现象,在镜头的微小运动中会跳跃甚至消失
即使有重置世界坐标原点功能,远处的对象的坐标值也很大,并且无法精确地表示。但是这种不精确性不成问题,因为远处的物体显示在屏幕时,只有不到一个像素大小。
重置世界坐标原点很有用,但它有两个缺点:

  • OriginLocation更改时,需要频繁地更新关卡中每个对象的位置,这样会降低性能。
  • 某些虚幻引擎对象根本不支持世界坐标原点重置。重置世界坐标原点后,此类对象的位置可能出错,或者出现其他问题。
如果您的镜头位置一直在原点附近,或者在里原点很远的位置不看很近的物体时,则可以安全地禁用世界坐标原点重置功能。您只需取消选中CesiumGeoreferenceKeep World Origin Near Camera属性:


你没有看到就得不到

Cesium for UnrealCesium3DTileset actors以不依赖于镜头位置的方式将海量数据集流式传输到您的应用程序中。它们拥有两个非常重要的功能:细节层次(level-of-detail)剔除(culling),这样就可以轻松加载TB级的数据。
细节层次(level-of-detail) 意味着将整个瓦片集分解为多个不同分辨率的金字塔一样的单体瓦片。从广义上讲,Cesium for Unreal为靠近镜头的模型选择高分辨率的瓦片,为离镜头较远的模型选择较低分辨率的瓦片。
剔除(culling) 意味着我们不会加载或渲染不可见的模型部分。剔除(culling) 的一种关键形式是视锥体剔除,它排除了镜头后面或者之外的瓦片。剔除这些瓦片意味着下载更少的瓦片,虚幻引擎也加载和显示更少的瓦片,从而提高了运行时性能和效率。
但是,剔除(culling) 伴随着一个重要的注意事项:如果您看不到它,那么它就不存在。剔除后的图块根本不会发送到虚幻引擎,这意味着:

  • 它们不能投射阴影。
  • 它们不会引起任何物理相互作用。
想象一下,站在您面前的在Cesium World Terrain地面上的角色。虚幻引擎的重力模拟将角色停留在地面上。现在,您转过身来,背对角色。角色站立的瓦片不再可见,因此将被剔除。突然,角色徘徊就处在悬空之中,然后他们开始坠向深渊!
同样,当您转向时,身后高耸的建筑物将不再投射阴影,因为它在虚幻引擎世界中已经不复存在了。
为避免这些问题,我们可以禁用视锥体剔除。单击World Outliner中的Cesium3DTileset,在Details面板中找到Cesium -> Tile Culling部分,然后取消选中Enable Frustum Culling


如前所述,禁用视锥体剔除确实会降低性能,但是对于某些应用场景而言,这是是很有用的。
地球是一个椭球

由于地球表面曲率的问题,我们离CesiumGeoreference的原点位置越远,虚幻引擎的负Z轴就越不能准确表示局部向下的方向。准确地说,我们从原点每移动一公里,向下的方向大约改变0.01度。距原点一百公里的地方,重力方向将偏差大约1度。对于大多数应用而言,这可能并不算太糟糕,但是当我们到达地球的另一侧时,重力方向便与我们期望的方向成180度。放置在地球另一侧而且配置了虚幻引擎重力感应的物体将掉入太空!
地球表面的曲率不仅影响物理特性,还影响虚幻引擎的其他行为。镜头向上的方向通常是垂直向上,但是向上的概念对于圆形行星是不正确的。Cesium自带的FloatingPawn自动考虑了这一点,但其他Pawn不会。
要处理地球是园的不幸事实,需要采用下列从简单到复杂的技巧之一:

  • 让镜头留在相对较小的区域内,比如大概一百公里左右。
  • 在地球的每个需要放置三维物体的地方设置独立的子关卡,每个子关卡都有自己的CesiumGeoreference。在使用子关卡构建全球场景教程中对该方法进行了介绍。
  • 使用CesiumGeoreferenceComponent可以将有限的地球是圆的意识添加到任何虚幻Actor中(下文会详细介绍)。
  • 手动扩展游戏引擎对象,以适应圆形的地球。
普通的虚幻引擎对象定位于游戏世界中,而不是真实世界中

当我们像上面圆锥体一样放置常规的虚幻引擎对象时,我们为它们设置了游戏世界中的指定坐标。到目前为止,这可能不足为怪。
但是,游戏世界中的坐标系与现实世界之间的关系不是固定的。它由CesiumGeoreference actor的origin属性定义,并且可以更改。需要注意的重要一点是,当CesiumGeoreference的原点发生变化时,整个虚幻引擎世界中的所有对象都将移动到地球上新的位置。
如果将对象放置在丹佛附近的山脉上,然后更改CesiumGeoreference的原点,以便观察意大利北部的山脉,则该对象将移动到意大利北部。因此,通常很总要的一点是:在开始构建关卡后,不要移动CesiumGeoreference的原点。
(译者注:这里新手很容易被绕晕,我给大家用白话详细解释一下。首先,为什么要指定原点,我原点放在地球球心也挺好的呀?问题是虚幻引擎默认的浮点数没法精准表示这么大的数,所以最好是将原点设置在你关注的地点附近。将普通虚幻引擎对象放置到关卡中后,这个对象的坐标是相对于原点的,当原点改变后,这个对象的坐标没有变,但是相当于地球的位置变了。)



锥体在丹佛附近的山中放置



当我们将CesiumGeoreference更改为意大利北部时,圆锥也会移动

地理参考对象遵循不同的规则

上面的内容适用于虚幻引擎中的几乎所有对象,但是有些对象遵循不同的规则。我们称这些对象为地理参考对象(Georeferenced objects)
与固定在游戏世界上的常规对象不同,地理参考对象固定在地球上。它的位置用双精度的、以地球为中心的、固定于地球(ECEF)的浮点数坐标表示,或等效地表示为经度、纬度和高度。例如,如果将这些坐标放置在费城市政厅顶部的威廉·佩恩雕像旁边,即使我们在CesiumGeoreference中调整了原点坐标,以使关卡镜头移动到澳大利亚的悉尼歌剧院,它也将一直停留在该位置,直到我们将其移动。
Cesium FloatingPawn就是一个地理参考对象的示例。这就是为什么,如(一)Cesium for Unreal快速入门(译)描述的那样,更改CesiumGeoreference的原点,FloatingPawn相对于地球的位置没有改变。另一个重要的地理参考对象是Cesium3DTileset。分片集有经纬度信息,知道自己应该放在地球上的什么位置上,而且一直停留在原地。
我们可以将动态对象转换为地理参考对象

通过将一个CesiumGeoreferenceComponent组件附加到Actor上,我们可以将一个普通的虚幻引擎Actor变成一个地理参考对象:
1. 在World Outliner面板中选中该Actor,然后将Actor的Mobility属性修改为Movable。更改的原因下面会解释。



2. 单击Details面板中的Add Component


3. 查找或搜索CesiumGeoreference组件,然后单击将其添加到Actor。


只需添加CesiumGeoreference组件,我们就可以将该Actor转换为地理参考对象。现在,如果我们更改CesiumGeoreference Actor的原点(请注意不要混淆CesiumGeoreference组件和CesiumGeoreference actor),该对象还是留在原来相对于地球的位置。我们还可以直接在CesiumGeoreference组件上指定经度/纬度/高度或以地球为中心的地球固定坐标,以使用精确的数字坐标放置对象。
但是,有两个限制值得注意:

  • 上面提到了第一个:我们只能将CesiumGeoreference组件添加到可移动的actor中。即使此物体永远不会相对于地球移动,但是修改CesiumGeoreference Actor的原点坐标,游戏世界中的所有对象的位置都将改变。因此,从虚幻引擎的角度来看,它是可移动的。
  • 第二个限制是,给Actor一个相对于地球的精确且和现实世界一致的坐标并不能自动解决所有问题。特别是,当物体远离原点时,虚幻引擎的重力还是会以错误的方向拉动地理参考对象。
如果您希望在全球不同地区拥有多个场景,并且都具有合理的物理特性,并且还能够受益于使用静态对象带来的性能优化,那么这就需要用到子关卡。
下一步

继续阅读下一个教程(五)使用地理参考子关卡搭建全球场景(译)。
都看到这里了,加个技术交流群一起组队研究呗^^

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
 楼主| 发表于 2022-11-8 16:58 | 显示全部楼层
老哥我想问下,cesiumGeoreference组件搜不到,用什么别的办法可以获取或者设置ue4actor的经纬度吗
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 06:34 , Processed in 0.090526 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表