Chaos破坏 系统是虚幻引擎4(UE4)中的工具集,可用于实时实现电影级破坏。除出色的视觉效果外,该系统还进行了性能优化,让美术和设计师在创建内容时进行更好控制。 该系统依赖 几何体集(用于定义要销毁的项目)碎裂(Fracturing)(用于定义几何体集破坏方式的工具)和 (定义拆分几何体集的不同程度)。还有一些其他工具可用于控制破坏几何体集,包括 连接图表(几何体集碎片相连方式)和 (与碎片直接互动和控制碎片的方法)。

碎裂编辑器

如需使用Chaos破坏的功能,打开 模式 下拉菜单然后选择 碎裂(Fracture)

FractureEditorSelect.png

碎裂编辑器(Fracture Editor) 以及 模式工具栏(Mode Toolbar) 将会显示。 

FractureEditorEnabled.png

借助 碎裂编辑器 和 模式工具栏(Mode Toolbar),你可以创建 几何体集,还能控制几何体集的碎裂和簇。 

几何体集合

Chaos系统中的破坏将从名为几何体集的新资源类型开始。可在一个或多个静态网格体中构建此类资源,包括在蓝图或嵌套蓝图中收集而来的网格体。 获得几何体集后,可使用碎裂编辑器将其破坏,并定义设置以决定碎裂方式。开始使用Chaos工具碎裂和破坏前,建议先决定要破坏的对象,以及几何体集的构造方式,以获得最佳效果。 

构建最佳方法

创建几何体集时,建议模块化设置内容,并确保水密性,确保无任何相互穿插。如此便可更加灵活地控制几何体集的碎裂。其中一种方法是使用 蓝图 和多个 静态网格体组件,如下所示。 

 
Video thumbnail

欲动手实践本页面讲解的概念,可在 Epic Launcher 的 学习(Learn)选项卡 下查看 Chaos破坏系统演示 项目。

在上述视频中,几何体集资源由单个蓝图组成,其中包含构成建筑物窗户部分的所有网格体。 如你之前接触过破坏系统,那么便会比较熟悉模块化和无相互穿插水密性的重要性。如初次接触破坏系统,则不能忽视该部分的碎裂学习。 各碎片需要拥有质量,知道被调用碎裂时的行为。 

另外,建议在构建模块时枢轴遵从虚幻的网格系统。标准化宽度和高度时使用网格,开发更复杂的内容将更为轻松。 

 
Video thumbnail

要考虑的另一个概念是 材质 指定,即使模块的材质相同,也应每个材质类型应用唯一的材质ID。这样在碎裂时可生成第二个材质ID,然后即可指定适当的内部材质。 在下方视频中,几何体集由两个网格体组成,而这两个网格体共享相同纹理,但使用两个不同的材质类型。因此,石料和混凝土的内面均可使用唯一材质;如果一种材质已被使用,则可将一个材质ID指定到内面。 

 
Video thumbnail

拥有一个或一组模块后,可开始考虑将其转换为几何体集。在以下范例中,建筑物侧面由五个不同的模块组成,各模块均应用了多个材质实例。 转换为几何体集会将所有共享材质合并为一个ID,从而降低绘制调用。 

Construction_BuildingPack.png

可以用任意组合将网格体转换为几何体集。小模块的放置更为灵活,但在结构中复制时有较高风险发生绘制调用、可见接缝和重复的问题。 合并模块越大、灵活性越低,但可通过碎裂和簇来隐藏接缝。在下图中,左侧四个支柱是单独的几何体集资源,而右侧较大支柱为单个几何体集。 

Construction_BuildingDetails.png

碎裂各个单独碎片时,可能会发生相似碎裂和硬边的问题。在较大碎片上,碎裂会散布到整个碎片,从而呈现更好效果。 

创建几何体集

在大致了解推荐的内容构造法的情况下,在 模式工具栏 的 碎裂(Fracture) 选项卡中,选择 新建(New) 按钮,将内容转换为几何体集,如下方所示。 

GeoCollection_01.png

命名新几何体集资源并保存其路径后,网格体将在视口中更新,显示绘制图表来指示你所选择的碎裂类型,便于你了解碎裂的大致外观。 

 

GeoCollection_02a.png

GeoCollection_02.png

Before Fracture Type Selection

After Fracture Type Selection

在 内容浏览器 中打开几何体集资源后,即可定义任何 材质元素(如下图1所示)或 碰撞设置(如下图2所示)。 

 

GeoColl_Materials.png

GeoColl_ChaosPhysics.png

Material Elements

Collision Settings

上图中"材质"部分下包括外部材质(元素0)、内部材质(元素1)和调试绘制材质(元素2),可对其选择要应用的材质资产。 

利用 碰撞设置(Collision Settings) 可定义几何体集的碰撞行为。拥有多个可供选择的不同选项,每个皆有各自的优缺点。 碰撞类型(Collision Type) 定义为 粒子-隐式(Particle-Implicit) 或 *隐式-隐式(Implicit-Implicit)**。 

然后可选择 隐式类型(Implicit Type),定义碰撞结构的初始化方式。主要有两种形式:分析碰撞体积(Analytic Collision Volumes) 或 关卡集体积(Level Set Volumes)。 

  • 分析碰撞体积(Analytic Collision Volumes)——提供刚体的简单表示,包含盒体、球体或胶囊体。 盒体以类似于边界框的形式包裹形体,而球体和胶囊体则放置在刚体内部来适应空间。 在模拟期间,这能加快计算速度并降低内存占用率,但会降低精度。 使用分析碰撞的另一缺点是模拟可能先以形体相交开始,然后模拟开始时你会看到它们会互相推开。 调整 碰撞对象减少百分比(Collision Object Reduction Percentage) 属性可改善此状况。但可能需进行一些微调才能实现理想效果。

胶囊体目前功能有限,建议不要使用。 

  • 关卡集体积(Level Set Volumes)——此类体积使用体素化网格对刚体采样,并生成几何体的有向距离场。 可使用资源的 最小(Min) 或 最大关卡集分辨率(Max Level Set Resolution) 设置来指定关卡集体积的分辨率。 虽然关卡集体积精度较高且可进行调整以满足性能需求,但内存占用率同样较高(体积进度的立方缩放会使用内存)。

使用关卡集时,应将 碰撞设置(Collision Setting) 设为 粒子-隐式(Particle-Implicit)。也可将其设为 隐式-隐式(Implicit-Implicit),但其在后台仍会检查隐式表面的碰撞粒子。 

完成几何体集的设置后,可开始在 碎裂编辑器 中对网格体进行碎裂和分簇。 

碎裂和分簇

碎裂方法有多种不同类型,结合不同技巧便能产生更为有趣的破坏效果。可尝试使用不同选项和设置来实现理想效果。 

碎裂

获得几何体集后,你可以通过模式工具栏的碎裂选项卡选择要执行的碎裂类型(如下所示),并在碎裂面板中选择碎裂的设置。

FractureSettings.png

FracturePanel.png

 

碎裂方法 

说明 

统一Voronoi

利用标准的统一Voronoi可定义站的最小和最大数量,以创建碎裂的单元体积。

簇Voronoi

簇Voronoi碎裂围绕基本Voronoi模式创建额外点,从而创造更多变体。

半径Voronoi

半径Voronoi碎裂在中心点创建Voronoi单元的径向分布(如破墙锤撞向墙壁)。

平面Voronoi

此类碎裂可用于在几何体集中沿平面剪切。可将噪点应用到平面剪切,以获得更自然的效果。

切片Voronoi

利用切片Voronoi碎裂方法可定义X、Y和Z片段的数量,同时提供随机角度和偏移变化。

砖块Voronoi

利用此类碎裂可定义用于执行碎裂的模式以及要碎裂的的向前和向上轴。还可调整砖块长度、高度和深度来呈现不同的效果。

可参见在Epic Launcher中的 Chaos破坏系统演示 项目中的 ChaosExamples_02_Fracture 地图,了解碎裂的不同类型范例及分簇技巧。 

选择碎裂类型和设置后,点击 碎裂(Fracture) 按钮来碎裂几何体集。 

GeoCollection_04.png

借助模式工具栏碎裂选项卡中的 爆炸(Explode) 工具,可增大减少分解图百分比来查看骨骼。 

GeoCollection_05.png

几何体集上将以颜色标识骨骼,你可以按 Shift + B 或点击模式工具栏中的 颜色(Colors) 工具来开启和关闭此功能。使用 Shift + E 可增大分解图百分比,使用 Shift + Q 则减少分解图百分比。

还可按需对单个碎片进行子碎裂,产生更加有趣的效果。 

Subfractured_Pillar.png

以上范例使用稀疏Voronoi碎裂,并将站的最小/最大数设为8来对支柱进行碎裂。中心碎片将重新碎裂为较小碎片,同时将顶部和底部碎片保持为大块。 

 
Video thumbnail

在 碎裂编辑器(Fracture Editor) 的 查看(View) 部分中,点击 级别(Levels) 下拉菜单可查看不同级别的破坏。 

 
Video thumbnail

还可按 Shift + W(下一级)和 Shift + S(上一级)在级别间移动。 

分簇

利用模式工具栏 分簇(Cluster) 选项卡中的 分簇(Clustering) 选项,你可以控制碎裂网格体的视觉质量和性能。 

ChaosClusterOptions.png

点击 自动簇(Auto Cluster) 选项将自动集中网格体的碎片(基于设置),然后将其指定到几何体集内部的 碎裂级别(Fracture Level)。 

下方范例视频将两个静态网格体转换为几何体集,并单步调试各个级别。最初级别0表示为完整实体,而级别1表示两根独立的骨骼。 碎裂几何体集时,各支柱都拥有单独碎片集,并新建级别2,以表示从各支柱碎裂的碎片。之后将所有骨骼平整到级别1,选择"自动碎裂(Auto Cluster)",在 大纲视图 中更新骨骼。级别1(而非两个独立碎片)现已应用基本碎裂,其中包含稍大的块,而级别2包含较小碎片。 

破坏建筑物等对象时,级别1通常需要少量簇(或较大碎片),随着级别的增加会发生更多破坏(较小碎片)。 最初碎裂时无需数千碎片以进行优化,而是在建筑物倒下时落下单独碎片。 优化的另一选择是定义要碎裂的 最大簇级别(Max Cluster Level)。 

MaxClusterLevel.png

可在关卡的几何体集上设置此选项,可定义限制碎裂的碎裂级别。设置后,几何体集不会超过定义的级别。 

进行分簇时,可以看到各簇中的碎片数量方为实用。选择几何体集后,可使用以下控制台命令来将统计数据打印到日志: 

GeometryCollection.PrintDetailedStatistics

在 **输出日志*(Output Log)* 中,可查看关于所选几何体集资源的信息。 

PrintDetailedStats.png

使用以下命令行即可获得简要版本,聚焦于各层级包含的刚体数量。 

GeometryCollection.PrintDetailedStatisticsSummary

还可逐Actor定义 破坏阈值(Damage Threshold),决定各后续级别碎裂所需张力。在 细节 面板的 簇(Clustering) 部分下可找到该选项。 

DamageThresholds.png

在以上范例的各升序级别设置中,按降序设置碎裂各级别所需的破坏阈值。 此设置意味着级别4将最先碎裂,随着破坏增加,前一级别也将开始碎裂。 在下图中,在级别1上碎片分簇在一起,构成较大的文件块(用 Shift + B开启和关闭)。 

DamageThresholds_01.png

下方为执行的实际模拟。 

此处的大型碎片将下落,同时阈值控制碰撞和力导致这些碎片进一步碎裂的程度。 通常情况下,随着簇下落,碰撞将降低其速度。也意味需要设置较低的阈值,确保较小的碎片进一步碎裂。

簇组索引

设置各Actor上的 簇组索引 属性为另一种可用于控制一组几何体集分簇的工具。 

ClusterGroupIndex.png

将各Actor指定到相同簇组时,该Actor的簇组行为为级别0。在以下范例中,不同的破坏阈值设置用于在破坏期间控制单独支柱。 

使用簇组索引时,使用相同索引的所有几何体集之间将共享应用的场数据。 

碰撞粒子部分

在 Chaos物理(Chaos Physics) 部分下的 几何体集(Geometry Collection) 里,提高 碰撞粒子部分(Collision Particles Fraction) 属性即可增加三角剖分表面上将用于碰撞的粒子数量。 

CollisionParticlesFraction.png

由于较低的数值通常会导致错误碰撞行为(例如滚到地板以下),因此此属性十分重要,共享簇组索引值时尤为如此。 

Chaos破坏系统工具中的  系统通过占据空间的区域(使用不同参数)来产生不同行为或破坏效果,从而直接影响物理模拟。 可在 内容浏览器 中创建场,其为纯数据容器(无法作为资源打开)。 

FieldSystemCreation.png

之后可创建 场系统Actor 类的蓝图,其包含可设置要使用场系统的 场系统组件。 

FieldSystemComponent.png

在场系统蓝图中可定义场逻辑。 

创建 场系统Actor 蓝图时,其的唯一 场系统 资源需包含正被创建的场系统数据。 

在蓝图中,可使用 添加场命令(Add Field Command) 或 应用物理场(Apply Physics Field) 来指定受场影响的属性类型。 

AddFieldCommand.png

  • 在蓝图中的 构造(Construction) 阶段使用 添加场命令(Add Field Command)。其将在模拟前堆叠属性。锚一类的初始化场便是较好范例。 

  • 应用物理场(Apply Physics Field) 用于在模拟时指定属性。使用力和速度并基于外部簇张力的爆炸是较好的范例。

下表为各项的简要概述。 

 

场类型 

描述 

DynamicState

可用于将几何体集状态更新为睡眠(Sleeping)、运动(Kinematic)、静态(Static)、动态(Dynamic)或用户定义状态。

LinearForce

可用于在几何体集中用户指定的位置和方向应用力。

ExternalClusterStrain

用于在给定体积内应用张力,若该值大于几何体集 破坏阈值,将释放簇碎片。

Kill

此类场可用于在刚体落入指定体积内时停止模拟刚体。

LinearVelocity

可用于沿起点和终点生成冲击速度。

AngularVelocity

可用于在给定半径内生成冲击速度。

AngularTorque

可用于将指定(或随机)扭矩量应用到刚体,以获得更有趣的模拟。

InternalClusterStrain

用于对场内所有刚体设置张力值。

DisableThreshold

可用于在超过定义阈值时禁用刚体模拟。将完全移除模拟中的已禁用刚体。移除后可利用场(非碰撞)重新激活。

SleepingThreshold

可用于在超过定义阈值时让刚体开始睡眠。场和碰撞可唤醒并继续模拟睡眠刚体。

DynamicConstraint

可用于约束几何体集的部分。

CollisionGroup

用于影响指定碰撞组中的几何体集。

ActivateDisabled

重新激活被禁用粒子。

以下章节概括了部分常见场,可混合并搭配不同场来获得不同效果。 

锚场

锚场(Anchor Fields) 可用于将几何体集部分锁定在一处,而对几何体集其余部分实施碎裂。 锚场与多数场系统节点不同,由于须在模拟前建立连接图表,因此必须在构造阶段建立锚场。 因此,其逻辑在 场系统Actor 蓝图的 构造脚本 中定义,并使用 添加场命名(Add Field Command) 节点(无法使用 应用物理场(Apply Physics Field))进行引用。模拟时,如启用 分簇,在使用 张力场 应用 张力 前,抛锚几何体集将保持静态。 

以下是 Chaos破坏系统演示 项目中的范例: 

簇拉力场

簇拉力场(Cluster Strain Field) 可用于在超过几何体集 破坏阈值 时对几何体集的部分执行破坏和碎裂。 在下方视频中,锚场(黄色盒体)用于锁定建筑物部分,而 簇张力场(粉色球体)指示要应用张力的位置。 呈现效果为建筑物部分碎裂,而其余部分保持不变(如以下范例所示)。 

力场

力场(Force Field) 将指定力应用到给定体积内的刚体。在下方视频中,锚场(黄色盒体)和 力场(蓝色球体)的组合导致建筑物会基于被应用的力向外炸开。 该特定范例无衰减,意味着每次触发蓝图时,场景中所有活跃刚体都会受到影响。 

角扭矩

和之前的 力场 范例一样,此范例使用 角扭矩 和球体衰减体积来限制应用的力。 通过对角扭矩应用随机向量,此范例中的建筑物会向外炸开,从而创造出更加多变有趣的效果。 

噪点和剔除场

通过添加 噪点场(NoiseField) 组件和使用 设置噪点场(Set Noise Field) 函数决定最小和最大范围,以对任意场应用噪点。 可以类似方式添加剔除场,即通过添加 剔除场(Culling Field) 组件并指定要应用剔除的衰减。 剔除场约束给定体积的操作,便于最大化性能并防止意外的场泄漏。 

睡眠和禁用场

睡眠场(Sleep Field) 和 禁用场(Disable Field) 都会在刚体进入指定体积时使刚体进入休眠状态。 禁用场不同于睡眠场,碰撞无法重新激活已禁用节点,使其在模拟期间开销极低。 但其他场可重新激活此类节点。 

使用禁用阈值、睡眠阈值或终止场时,务必在外部应用剔除。 如未应用剔除,可能会破坏地图中的其他类似场,其将忽略当前阈值外设置的阈值。 

在以下范例中,左侧的睡眠场用于使刚体休息(碰撞会唤醒刚体,以便继续模拟)。右侧禁用场用于完全停止模拟。

内部张力场

利用 内部簇张力(Internal Cluster Strain) 可影响场内所有刚体值,用于获得建筑物随时间倒塌的效果。 为此,每次tick时都会更新张力值,会从噪点场中减去之前值(使用缩放参数)。剔除场也用于模拟期间包含效果。 

几何体集缓存

要改善较大模拟时的性能,建议尝试将运行时模拟改为缓存模拟。 缓存模拟适用于发生在背景中或未涉入玩家交互的破坏。Chaos未来的版本将支持在模拟和缓存模拟之间动态切换。 需首先记录缓存模拟,才能进行播放。 

记录并播放缓存模拟的方法: 

  1. 选择碎裂几何体集,然后在 细节(Details) 面板中,将 缓存参数(Cache Parameters) 下的 缓存模式(Cache Mode) 改为 记录(Record)。 

    GeoCache_01.png

    其他参数可用于定义要记录的数据。 

  2. 在编辑器中模拟或播放,几何体集将碎裂。 

     
  • Video thumbnail

    在以上视频中,发生模拟时性能受到了些许影响。停止会话后,将以储存数据更新 目标缓存(Target Cache)(同时创建资源并将之添加到 内容浏览器)。 

  • 将几何体集改为 运动(Kinematic),指定 目标缓存(Target Cache),将 缓存模式(Cache Mode) 改为 播放(Play),然后 在编辑器中播放(或模拟)

     
  1. Video thumbnail

    在以上视频中,最初运行的是完全动态的模拟(对性能有些许影响)。之后切换为 运动 并 播放 选中的 目标缓存。 由于运行时不再执行计算,因此销毁建筑时性能将得到改善,并且不会出现卡顿。

除了设置几何体集来播放缓存,还可使用 蓝图 来修改播放模式或对添加的播放功能按钮使用 Sequencer。 

GeoCache_02.png

在上图中,将几何体集Actor、几何体集组件和几何体集一同添加到关卡序列。在 属性(Properties) 下,可指定 几何体集缓存(Geometry Collection Cache) 在序列中播放。 此外,将 完成时(When Finished) 状态设为 保持状态(Keep State),以便在播放缓存且销毁建筑后继续保持状态。 利用Sequencer可控制播放速度,并能在缓存动画中向前和向后移动。 

Chaos解算器

Chaos会默认自动生成 Chaos场景解算器(Chaos World Solver) 来处理Chaos相关计算。 要减少加载,可将几何体集分配至关卡中放置的自定义 Chaos解算器。 要创建 Chaos解算器,点击 内容浏览器 中的 新增(Add New) 按钮,然后选择 物理(Physics) 下的 Chaos解算器。 

ChaosSolver.png

此资源无法直接打开。要访问其属性,需将其放入关卡,之后便可在 细节(Details) 面板中访问属性。 

ChaosSolver_03.png

使用 Chaos物理(Chaos Physics) > Chaos解算器(Chaos Solver) 下的选项,可在各单独Actor上指定要使用该解算器的几何体集。 

ChaosSolver_02.png

Niagara整合

ChaosNiagara.png

Chaos破坏系统中的Chaos解算器可在运行模拟时存储一系列碰撞、破裂和拖尾事件。 在

[Niagara](RenderingAndGraphics/Niagara)

效果系统中,将通过 Chaos数据接口 聆听此类事件。 实现Chaos数据接口(默认)的Niagara系统,对于场景Chaos解算器驱动的所有刚体均有效,但也可将Niagara系统指向自定义Chaos解算器。 

 

以下步骤将对在Niagara系统中实现碰撞、破裂或拖尾事件的Chaos数据接口进行概述: 

  1. 创建所需的 Niagara发射器。 

  2. 创建 Niagara系统 并将其指向发射器。 

    Chaos_Niagara_01.png

  3. 在Niagara系统内的 系统公开参数(System Exposed Parameters) 下添加 Chaos破坏数据(Chaos Destruction Data) 参数。 

    Chaos_Niagara_02.png

    利用 数据源(Data Source) 属性可定义要追踪的 碰撞数据(Collision Data)破裂数据(Breaking Data) 或 拖尾数据(Trail Data)

    Chaos_Niagara_03.png

  4. 在 粒子生成(Particle Spawn) 下添加 应用Chaos数据(Apply Chaos Data) 模块。 

    Chaos_Niagara_04.png

  5. 将Niagara系统拖入关卡,然后可在系统Actor上覆盖 细节 面板中的 数据源(Data Source)。 

    Chaos_Niagara_05.png

    可创建多个版本的Niagara系统Actor,将数据源覆盖为碰撞、破裂和拖尾数据。

参考 Chaos破坏系统演示 项目和 ChaosExamples_04_Niagara 地图,了解相关范例。 

以下是碰撞、破裂和拖尾事件的范例。

Chaos和Gameplay

几何体集可发送用于出发gameplay的碰撞和破裂事件。 要使几何体集发送此类事件,须在几何体集Actor上启用 通知碰撞(Notify Collisions)(针对碰撞事件)或 通知破裂(Notify Breaks)(针对破裂事件)。 可在 细节(Details) 面板中的 常规(General) 部分下启用选中几何体集的此类选项。 

Chaos_NotifySettings.png

也可通过蓝图调用 SetNotifyBreaks 或 SetNotifyCollisions 启用/禁用此类属性。 

引用几何体集Actor(和其中几何体集组件),可绑定到 OnChaosBreakEvent,几何体集破裂时将触发该事件。 

Chaos_OnBreakEvent.png

Chaos碎裂事件结构体报告几何体集中所有破裂的相关信息,如基元组件、位置、速度、角速度和质量。 

各破裂将创建自身破裂事件。

与破裂事件类似,可使用 OnChaosPhysicsCollision 绑定到碰撞事件,几何体集与其他物体碰撞时将触发该事件。 

Chaos_OnCollisionEvent.png

可分拆 碰撞信息 结构体来获取碰撞相关信息,例如基元组件和涉及碰撞的其他组件、位置、法线、速度值和质量。 

同时使用破裂和碰撞事件的组合及场,可在gameplay事件中引发如武器开火等破坏。 使用碰撞事件中的信息,可在冲击位置生成场,导致以下视频中的破裂发生。 

额外Chaos练习

除了本页引述的信息之外,也可浏览以下 Chaos基础 Twitch流送,了解更多相关主题。