Chaos 物理与碰撞
Chaos Physics & Collision
Chaos 是 UE5 的物理与破碎系统。日常最常打交道的是碰撞模型:每个物理体有对象类型 (Object Type) 和对其他类型的 Block/Overlap/Ignore 响应,结果由双方共同决定;Hit 与 Overlap 事件都要显式开启。骨骼网格通过物理资产 (Physics Asset) 获得刚体与约束(布娃娃、物理动画);Chaos 破碎基于几何集合 (Geometry Collection) 的分级断裂、簇阈值、连接图与缓存回放,并能把事件交给 Niagara。物理体用盒/球/胶囊/凸包代理,原理对应游戏数学中的包围体与相交测试。
Chaos 是什么
官方:Chaos Physics 是 UE 中「为下一代游戏从零构建」的轻量物理模拟方案,涵盖破碎 (Destruction)、网络物理、Chaos 可视化调试器、刚体动力学、刚体动画节点与物理动画、布料、布娃娃、载具、物理场 (Physics Fields)、流体、毛发、肌肉 (Flesh) 与 Dataflow 图。(Physics in Unreal Engine)本页聚焦刚体、碰撞、物理资产和破碎。
刚体与物理代理形状
实时模拟不能直接用渲染网格,必须用代理形状:物理体 (Physics Body / Body Instance) 是简化网格,由盒、球、胶囊或凸包 (Convex Hull) 组成。(Physics Asset Editor / Physics Bodies)这与 包围体构建、相交测试基础与分离轴 的思路一致:用简单凸体换取快速、稳定的相交测试。刚体动力学提供碰撞响应、约束、阻尼与摩擦,并支持异步物理模拟;载具文档指出异步物理模式能提高确定性。(Physics in Unreal Engine)
碰撞:对象类型 × 响应
每个可碰撞对象有一个对象类型 (Object Type) 和对所有其他类型的响应 (Response):Block / Overlap / Ignore;射线检测 (Trace) 则按追踪通道 (Trace Channel)(默认 Visibility、Camera)决定被阻挡还是忽略。(Collision Overview、Collision Response Reference)
| 对象类型 | 用途 |
|---|---|
| WorldStatic | 不移动的物体 |
| WorldDynamic | 由动画或代码移动(运动学):电梯、门 |
| Pawn | 玩家控制的实体 |
| PhysicsBody | 由物理模拟驱动 |
| Vehicle / Destructible | 载具 / 可破坏物默认类型 |
结果由双方共同决定(Collision Response Reference)。可以把规则理解为取两者中“更弱”的响应:
| A 对 B \ B 对 A | Block | Overlap | Ignore |
|---|---|---|---|
| Block | 阻挡(Hit) | 重叠 | 无 |
| Overlap | 重叠 | 重叠 | 无 |
| Ignore | 无 | 无 | 无 |
(表格为对官方规则的归纳:双方都 Block 才阻挡;一方 Overlap 一方 Block 时只发生重叠;任一方 Ignore 则无事件。Collision Overview)
Collision Enabled 四态:No Collision(物理引擎中无表示,性能最好)、Query Only(只用于射线/扫掠/重叠查询,适合角色移动)、Physics Only(只模拟,如角色次级运动)、Collision Enabled(两者)。(Collision Response Reference)查询本身就是 光线求交测试 和 包围体重叠测试 的工程化。
事件开关的坑
- 双方 Block 只会物理阻挡;要触发蓝图 Event Hit / OnComponentHit 必须开 Simulation Generates Hit Events,且只有开了的一方收到事件。静止接触时 Hit 会每帧刷屏,需要过滤。
- Overlap 事件(BeginOverlap/EndOverlap)要求双方都开 Generate Overlap Events——这是性能设计:否则一方必须每帧 Tick 检查是否有人移进来。不开时 Overlap 与 Ignore 效果相同。
- 高速物体即使 Block 也可能产生 Overlap;官方不建议同一物体同时依赖碰撞和重叠事件。
- PIE 默认相机是 Pawn,会被阻挡;Simulate 模式相机不是。(以上 Collision Overview)
实践中通常在 Project Settings > Engine > Collision 定义自定义对象类型、追踪通道和预设 (Preset),组件只选预设,避免逐个手调。(预设位置见 Collision Response Reference)
物理资产 (Physics Asset)
物理资产为骨骼网格定义物理与碰撞:一组刚体与约束组成一个布娃娃(不限人形,也可是载具);每个骨骼网格只能有一个物理资产。可在导入时勾选 Create Physics Asset 生成,或之后创建,在 Physics Asset Editor 中编辑。(Physics Asset Editor / Physics Bodies)它同时服务于布娃娃、物理动画(刚体随动画模拟)和载具碰撞,与 动画蓝图与动画系统 中的刚体动画节点衔接。(Physics in Unreal Engine)
Chaos 破碎 (Destruction)
- 基于几何集合 (Geometry Collection):由一个或多个静态网格(含蓝图中嵌套的)构建,可多级、选择性地断裂 (Fracture),每个簇 (Cluster) 设损伤阈值 (Damage Threshold)。
- 连接图 (Connection Graph) 模拟结构完整性,决定受损后如何坍塌;World Support 把部分设为运动学,减少锚点场 (Anchor Field)。
- 缓存系统 记录逐帧变换与事件,压缩后用于高效回放;缓存的模拟被交互时可局部“转为实时”。
- 与 Niagara 深度集成:Niagara 读取断裂事件 (Break Events) 和碰撞事件生成粒子;物理场 可在空间区域内施力、打碎簇、锚定或禁用碎块。(以上 Physics in Unreal Engine)
断裂工具 (Fracture Mode):几何体集合 (Geometry Collection) 是 Chaos 破碎使用的资产类型,在 Fracture Mode 编辑器模式里离线切分。每切一次就多一层断裂层级,层级是一棵树:根骨骼下挂碎块骨骼,碎块还能继续细分;每层可以换用不同工具,也可以只切选中的碎块。(Fracturing Geometry Collections User Guide)
| 工具 | 算法/图案 |
|---|---|
| Uniform | Voronoi,用最少/最多站点数控制碎块数 |
| Cluster | Voronoi,站点聚成「岛」,碎块大小更不均匀 |
| Radial | 从中心放射分布站点(冲击点、弹孔) |
| Planar / Slice | 无限平面切割 / 按 X/Y/Z 轴成行成列切片,可加随机角度和偏移 |
| Brick | 砖块砌法图案(实验性) |
| Mesh | 用一个静态网格的形状当刀具 |
| Custom | 自定义 Voronoi 站点,可冻结站点;图案与集合独立,缩放集合后可得到细长的木刺状碎片 |
通用参数:Random Seed(-1 每次随机,固定值可复现)、Chance to Fracture、Grout(碎块间隙),以及 Perlin 噪声(Amplitude、Frequency、Octave 等)让切面不那么平。Point Spacing 越大,切面三角形越少,但噪声细节越粗,这是碎块面数与外观之间的取舍。(Fracturing Geometry Collections User Guide)运行时如何断裂见下一节。
破碎的运行时:应变、簇与场
5.x 没有找到 Destruction 概览页(chaos-destruction-in-unreal-engine 只是一个索引页),下面以 UE 4.27 的 Chaos Destruction Overview 为主(Chaos Destruction Overview),并用 UE 5.8 的 UGeometryCollectionComponent API 核对当前属性名(UGeometryCollectionComponent API)。
原理:簇 + 应变阈值。 断裂后的碎块按层级组成簇 (Cluster),簇内碎块之间的连接关系就是连接图 (Connection Graph)。施加到簇上的应变 (Strain) 超过该层的伤害阈值 (Damage Threshold) 时,簇就释放出下一层碎块。(4.27)
flowchart TD
A["碰撞(bEnableDamageFromCollision)<br/>或场 / ApplyExternalStrain"] --> S["簇上累积应变"]
S --> T{"应变 > 该层 Damage Threshold?"}
T -->|"否"| K["保持成簇"]
T -->|"是"| R["释放子层碎块<br/>(不超过 Max Cluster Level)"]
R --> P["碎块作为刚体模拟"]
P --> Z{"低速 / 进入 Sleep 或 Disable 场"}
Z --> SL["休眠:碰撞或场可唤醒"]
Z --> DI["禁用:移出模拟,只有场能重新激活"]图从上到下:碰撞或场产生应变,超过阈值才逐层释放碎块;碎块模拟一段时间后进入休眠或被禁用,两者被唤醒的方式不同。
| 机制 | 要点 | 版本/出处 |
|---|---|---|
| 伤害阈值 | 每层一个值,表示该层断裂需要多大应变;官方示例按层级递减设置,因为碎块下落时碰撞会降低速度,更细的层需要更低的阈值才能继续碎 | 4.27;5.8 API 中为 DamageThreshold 数组,另有 DamageModel、按尺寸阈值 bUseSizeSpecificDamageThreshold、按材质修正、DamagePropagationData |
| 层级设计 | 第一层少量大块,越往上越碎;不要一开始就碎成几千块,而是在建筑倒塌过程中逐步掉落小块;Max Cluster Level 限制最深断裂层 | 4.27;5.8 API 仍有 MaxClusterLevel、MaxSimulatedLevel |
| 碰撞造成伤害 | 打开后,碰撞会向集合施加应变 | 5.8 API bEnableDamageFromCollision |
| Cluster Group Index | 索引相同的多个集合合为一个 Level 0 簇,场数据共享 | 4.27 |
| 锚定 | 锚定场 (Anchor Field) 必须在构造脚本里用 Add Field Command 设置,因为连接图要在模拟前建立;被锚定的部分在受到应变前保持静止 | 4.27;5.8 API SetAnchoredByBox/ByIndex |
| 代码直接施加 | ApplyExternalStrain/ApplyInternalStrain(半径、传播深度、传播系数)、CrumbleCluster(直接碎成全部子块) | 5.8 API |
| 休眠与移除 | Sleep 场让刚体休眠,碰撞和场都能唤醒;Disable 场把刚体移出模拟,碰撞无法唤醒,开销很低,只有场能重新激活;5.8 有 RemovalOnSleep(休眠后移除) | 4.27 / 5.8 API |
场 (Fields):Field System Actor 蓝图里,Add Field Command 在模拟前设置初始化类场(如锚定),Apply Physics Field 在模拟中施加(如外部簇应变爆炸)。常用场:ExternalClusterStrain(超过阈值就释放碎块)、InternalClusterStrain(配合噪声做随时间坍塌)、LinearForce / AngularTorque、DynamicState、Kill、Sleep/Disable 阈值。坑:Disable、Sleep、Kill 类场外面必须加剔除场 (Culling Field),否则会覆盖地图中其他同类场的设置。(4.27)
性能取舍:碰撞体可用解析形状(快、省内存、不精确)或 Level Set 有符号距离场(精确,内存随分辨率立方增长)。Collision Particles Fraction 过低会导致碎块穿地。和玩家无关的背景破碎可以先录制成缓存 (Cache),再以 Kinematic 回放,消除运行时开销和卡顿;也可以把集合分配给自定义 Chaos Solver 分担计算。玩法上,打开 Notify Breaks/Collisions 后可绑定 OnChaosBreakEvent;Niagara 可通过 Chaos 数据接口读取碰撞、断裂和拖尾事件生成碎屑特效,见 Niagara 粒子系统。(4.27)4.27 与 5.x 的差异:伤害模型、传播数据、按尺寸阈值等是 5.x API 中出现的属性,4.27 页没有描述,具体行为未从官方概念文档核实。
网络物理
三种复制模式:Default(旧版)、Predictive Interpolation(服务器权威,修正客户端速度向服务器靠拢,可处理预测性的本地改动)、Resimulation(服务器权威的物理 Pawn,客户端预测,与历史状态比较差异过大时重新模拟)。(Physics in Unreal Engine)复制基础见 网络复制与 RPC。调试可用 Chaos Visual Debugger 录制并逐帧/逐子步回放。
取舍
| 选择 | 收益 | 代价 |
|---|---|---|
| Query Only 代替完整碰撞 | 省模拟树数据 | 不能被物理推动 |
| 简单基元代替凸包/复杂碰撞 | 快、稳定 | 贴合度低 |
| 破碎缓存回放 | 运行时开销小 | 交互性受限、占存储 |
| Resimulation | 物理 Pawn 手感好 | 实现与带宽/CPU 成本高 |
GEA 的视角:通用物理引擎原理与 Chaos 的对照(卷 II 14.2–14.5)
GEA 第 14 章讲的是通用碰撞/物理引擎(以 Havok、PhysX 为例)。与本页 Chaos 内容的对应如下:
| GEA 概念 | 本页中的对应 | 详见 |
|---|---|---|
| 碰撞图元(球、胶囊、盒、凸体) | 物理体的盒/球/胶囊/凸包代理形状 | 碰撞检测系统 |
| 碰撞过滤(碰撞层、回调) | 对象类型 × Block/Overlap/Ignore 响应 | 碰撞检测系统 |
| 射线/形状投射、幻影 | 追踪通道、Query Only、扫掠与重叠查询 | 碰撞查询 |
| 布娃娃 = 刚体 + 专用约束 + 动力约束 | 物理资产(刚体与约束)、物理动画 | 碰撞响应与约束求解 |
| 休眠与模拟岛 | 破碎中的 Sleep / Disable 场 | 碰撞响应与约束求解 |
| 用刚体实现可破坏物,按结构逐步坍塌 | 几何集合的分级断裂、簇与应变阈值 | 物理引擎与游戏的集成 |
- "对应"列是归纳,GEA 原文不讨论 Chaos。GEA 关于中间件的介绍(PhysX、Havok 等,部分信息已过时)见 游戏中的物理与中间件。
- 底层动力学见 刚体动力学 与 数值积分。
出处
- Physics in Unreal Engine UE 5.8 文档
- Collision Overview UE 5.8 文档
- Collision Response Reference UE 5.8 文档
- Physics Asset Editor / Physics Bodies UE 5.8 文档
- Fracturing Geometry Collections User Guide UE 5.8 文档
- Chaos Destruction Overview UE 4.27 文档(5.x 无对应概览页)
- UGeometryCollectionComponent API UE 5.8 API 参考
- Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
- Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 14 章 14.2–14.5 节