1. Chaos基本概念
1.1 什么是Chaos
Chaos是UE自研的新一代物理引擎,以提供影视级的实时破碎方案作为阶段性的核心目标,但Chaos的最终目标不仅于此,其最终是希望提供包括流体模拟、布娃娃模拟、布料模拟在内的所有主流物理特性的整套方案,不过目前展出且开发完成度较高的为其破碎方案,这也是我们此次介绍的主体。
1.2 Chaos的优越之处
UE更换了原有的Physx物理组件目的就是希望能有所突破,那么Chaos相对于Physx方案而言有什么样的优点呢?
总的来说,其优点主要可以归纳成如下四个方面:
- 首先是能够提供影视级的破碎效果,这个我们后面的视频中会展示
- 其次则是提供了极为丰富且易用的工具箱,为玩家的编辑与交互控制提供了十分全面的支持
- 第三则是自研的方案可以非常方便的实现与原生Gameplay逻辑的绑定,包括特效、音效以及网络等的联动,这项特性将极大的提升了显示的效果与联网游戏中物理方案的易用性
- 最后则是能够充分的保证物理的运行性能在掌控之中,避免不受控制的性能热点等
破碎的表现可以参见之前UE发布的宣传视频。
1.3 Chaos与GamePlay的互动
Epic在GDC2019中还给大家展示一下Chaos跟Gameplay的交互表现:
2. Chaos实现流程
下面来看下Chaos的实现流程,主要分成五个部分。
2.1 Geometry Collection
首先是Geometry Collection,什么是Geometry Collection,这是UE专为物理破碎新增的一种Asset,由一个或多个StaticMesh组成,用于表示需要破碎的物件。在Geometry Collection中,所有共享一个材质的StaticMesh都会在两个DrawCall中画完,一个用于绘制破碎物件的外部面片,一个则用于绘制破碎物件的内部面片。
2.2 Fracture
Chaos破碎的实现以对Geometry Collection的划分开始,如下图所示
UE提供了包括标准的Voronoi划分、径向划分等在内的众多划分模式,这个划分是可以根据需要进行递归的,比如下图所示,
我们通常会对一些大块的碎片进行再次的细分,直到划分方案满足我们的需求为止。
2.3 Cluster
划分后的每个碎片,我们将之Group到一个Cluster中,而Cluster是可以级联的,因此一个Geometry Collection的所有Cluster会构成一个树状结构,这棵树的不同层级对应于不同的划分粒度,如下图所示:
在编辑划分阶段,我们就可以指定一个物件的破碎级别,下方的动图给出了不同层级的破碎对应的效果。
这里并不局限于所有的cluster都按照相同的层级进行破碎,实际上我们可以为每个Cluster设置破碎的强度,通过为不同的Cluster设置不同的强度我们可以得到较为随机的破碎效果,比如我们可以将最粗粒度的cluster的破碎强度设置为1,最细粒度的cluster的破碎强度设置为10,这样在受力逐渐加大的时候,破碎的粒度就会变得越来越小,从而得到一种更为真实的破碎感,当然实际情况中,为了使得破碎表现更为自然,我们通常会为不同的cluster设置一个较为随机的破碎强度,而不会将破碎强度设置得如此统一。
2.4 Connection Graph
刚才说到了破碎强度,那么破碎强度是如何作用的呢?这就要介绍到Connection Graph了,Connection Graph是多个Cluster(非叶子Cluster,叶子Cluster则指的是多个碎片)之间的连接线组成的一张Graph,如左图所示,在这张Graph中,每个节点对应于一个Cluster,而每条边代表着某个Cluster与一个相邻的Cluster的连接强度,当作用力超出某个设定的阈值之后,这条边就会断裂,当某个Cluster的所有边都断裂了之后,就会根据受力计算其接下来的运动轨迹,从而完成破碎效果。
上图给出的是最粗粒度的Cluster的Connection Graph,实际上在每个Cluster内部应该也有对应的Sub Connection Graph以实现更为细腻的破碎粒度。
2.5 Field
Connection Graph给出了碎片之间的连接关系,那么碎片之间的连接强度以及物件比如说子弹碰撞时施加的破碎力度又是怎么指定的呢?这一切都要依赖于我们最后这里说到的Field,一个Field就是一个一定形状的Volume,这个Volume会对其覆盖范围内的Cluster施加影响,比如说指定Connection Graph中的连接强度,比如说在这个Volume内部施加一个随着到中心点的距离的增加而不断降低的径向破坏力,如果将这个Field附加在一枚炮弹上,就能实现碎片朝着四面八方飞溅的效果。
Field主要有很多种,下面介绍其中常用的几种:
- Sleep Field,用于对Volume内部的碎片执行低消耗的睡眠模式,以降低其模拟消耗。处于Sleep Field的碎片在特定的条件下可以重新唤醒,与之相对的还有一个Disable Field,处于其中的碎片则会永久的沉睡。
- Strain Field,用于对物件进行不断的侵蚀,侵蚀导致Connection
Graph的连接强度不断降低,当强度降低到某个阈值之下之后就会产生对应的破碎
- Anchor Field,指的是将对应区域的物件锁定,禁止产生破碎,如下图中所示的保留建筑底座与部分天花板的残骸,以形成一种更为逼真的效果。
- Force Field,用于对Volume覆盖的区域施加一个力场,比如下面动图中蓝色小球所表示的Force Field,就施加了一个从中心点出发径向力以产生一种爆炸效果。
3. 性能
前面介绍了Chaos的实现流程,下面简单介绍下Chaos是如何在如此大范围的破碎的情况下保持一个实时帧率的,主要有如下的几个原因:
首先,碎片的切分包括碎片Mesh的生成,顶点属性的计算等都是在离线完成的,这就简化了很大一部分破碎模拟的工作量了
其次,借助了Intel的ISPC并行计算方案,可以很好的利用CPU的多核特性来进行多线并行模拟,进一步降低时间消耗
第三,在一些低端设备上,会开启Simulation Cache,将碎片受力后的破碎效果离线计算并Cache下来,并在运行时播放,虽然表现质量上有所损失,但是并不明显,而计算效率则是直线上升
不管破碎生成了多少个碎片,最终同一材质的碎片都会在一个DrawCall中绘制完成,从而减轻了碎片增加导致的渲染压力
通过将破碎拆分成不同层级的多个Cluster,按需破碎来降低同一时间破碎的碎片数量以减轻模拟压力
通过Sleep/Disable Field减少需要模拟的碎片数量来减少计算消耗
当然除此之外,可能还有一些其他的策略,比如将物理模拟拆出到一个单独的线程,通过灵活控制其模拟频率来减轻消耗等,
参考文献
[1] Order from Chaos - Destruction in UE4 | GDC 2019 | Unreal Engine
[2] Chaos Destruction Overview
[3] 如何评价Unreal Engine 4.23版的Chaos物理与破坏系统?
[4] Chaos Physics in Unreal Engine 5
[5] Async Tick Physics Overview