损伤凹陷与晶格
凹陷与晶格
足够猛烈的命中会把车身金属压进去,凹陷会一直保留,直到车身被修复。一个数据资产(配置文件)决定所有凹陷的形状。本页介绍影响凹陷形状的设置,以及修复车身的方法。承载凹陷的晶格、绘制凹陷的图集,以及从物理接触到命中的路径,都在核心概念中说明。如果对这些术语还不熟悉,请先阅读该页。
受到命中的面板会在命中处向内凹陷。金属会像薄板金属那样变形:凹陷从接触点向后延伸,像手风琴一样折叠,横跨命中处扩散,并随命中力度增大而加深,直到达到上限。轻微的碰触不会影响车身。
漆面会在同样的位置磨损。参见漆面与划痕。
- 命中。 命中是车身沿接触法线损失的速度,单位为 m/s。只有命中速度超过 Min Delta V(
UCFProfile::MinDeltaV,0.5 m/s)时,车身才会凹陷。较慢的接触不会造成凹陷。 - 深度。 每超过 Min Delta V 1 m/s,一次命中就会下压 Stiffness(
UCFProfile::Stiffness,每 m/s 3 cm),但最多下压 Max Dent Per Hit(UCFProfile::MaxDentPerHit,20 cm)。使用默认值时,15 m/s 的命中要求下压 43.5 cm,实际只下压 20 cm。这个上限让单次命中远低于 Max Displacement,因此重复命中仍能使凹陷加深。 - 宽度。 凹陷半径等于 Base Radius(
UCFProfile::BaseRadius,30 cm),加上 Radius Per Delta V(每 m/s 1.5 cm)乘以命中的速度。半径不会小于 1.25 个晶格单元。Lateral Scale(1.5)使凹陷横向加宽。宽而浅的凹陷看起来像被压皱的金属;窄而圆的凹陷看起来像橡胶。 - 褶皱。 对单点的命中(例如撞上柱子)会使接触点后方的金属压溃。Crumple Ratio(3)设定压溃的范围,以凹陷深度的倍数表示。在平面(例如墙面)上扩散的命中会把面板压平。
- 粗糙的边缘。 Noise Amount(0.3)会随机地从每个节点上减去一小部分深度,因此剧烈碰撞留下的是参差的金属,而不是平板。命中沿表面滑动时,Drag Fraction(0.3)会把凹陷沿表面拖拽。
- 上限。 没有任何节点会超过 Max Displacement(
UCFProfile::MaxDisplacement,60 cm)。车身材质必须使用相同的数值作为其位移边界。核心概念说明了这部分的连接方式。 - 修复。
UCFDeformComponent::Repair会在每一端清除所有凹陷和划痕,并使铰接部件和玻璃恢复原状。它只在服务器(权威端)上生效,其他端随之同步。污垢会保留,Wash会清除污垢。 - 自动修复。 Auto Repair Delay(
UCFSettings::AutoRepairDelay)会在车身最近一次受损后的指定秒数自动修复车身。默认为 0,表示从不自动修复。
这些步骤用于创建凹陷配置文件。车辆的设置与快速入门相同。
- 在 Content Browser 中选择 Add > Miscellaneous > Data Asset,选中 CFProfile,然后为你项目中的资产命名。
- 打开配置文件。保持 Dents 开启,并从下表的默认值开始。Lattice 下的 Resolution 是每个轴上的晶格节点数。每个轴都必须是 4 的倍数,并且当晶格无法放入一个图集槽位时,资产验证会发出警告。
| Lattice | ||
|---|---|---|
| Resolution | 1688 | |
| Lattice Margin | 10.0 | |
| Use Explicit Bounds | ||
| Explicit Bounds | ||
| Min Radius in Cells | 1.25 | |
| Components | ||
| Include Tags | 0 Array element | |
| Exclude Tags | 0 Array element | |
| Dents | ||
| Dents | ||
| Deform Collision | ||
| Hinged Parts | ||
| Dented Part Collision | ||
| Min Delta V | 0.5 | |
| Stiffness | 3.0 | |
| Max Dent Per Hit | 20.0 | |
| Base Radius | 30.0 | |
| Radius Per Delta V | 1.5 | |
| Lateral Scale | 1.5 | |
| Crumple Ratio | 3.0 | |
| Drag Fraction | ||
| Noise Amount | ||
| Bulge | ||
| Bulge Down Share | ||
| Max Displacement | 60.0 | |
| Stiffness Zones | 0 Array element | |
- 为车身指定配置文件。车辆适配器会为你创建形变组件:选中适配器并设置 Deform Profile。如果是你自己的 Actor,请从 Add 的 Crushform 分组中添加 CFDeform,并将 Profile 设为该资产。没有配置文件,组件不会产生任何作用。
- 按快速入门第 1 步连接车身的材质。未连接的网格体不会移动。
蓝图只需一次调用即可修复车身:Repair。下图在自定义事件 RepairCar 触发时运行。它通过 Get Deform 获取轿车适配器持有的形变组件,并对其调用 Repair。
在 C++ 中,如果车身撞碎了一个道具却没有直接接触,而物理系统没有报告这次命中,可以用 ApplyWorldHit 补充这次命中:
// A 12 m/s hit where the prop stood. Only the machine that simulates the body applies it.const FVector PropLocation = Prop->GetActorLocation();const bool bApplied = Deform->ApplyWorldHit(PropLocation, FVector::UpVector, 12.0f);当命中点位于晶格之外、命中过轻而无法造成凹陷,或者本端不允许对该车身施加命中时,ApplyWorldHit 返回 false。
| 属性 | 作用 | 默认值 |
|---|---|---|
UCFProfile::bDents | 关闭时:命中和挤压都不会使车身凹陷或被划伤。污垢仍然有效。 | 开 |
UCFProfile::MinDeltaV | 速度变化量(m/s),低于该值的命中不会造成凹陷。 | 0.5 |
UCFProfile::Stiffness | 超过 Min Delta V 每 1 m/s 的凹陷深度(cm)。 | 3 |
UCFProfile::MaxDentPerHit | 一次命中最深能造成的凹陷(cm),以该区域的刚度为 1 计。 | 20 |
UCFProfile::BaseRadius | 零速度时的凹陷半径(cm)。 | 30 |
UCFProfile::RadiusPerDeltaV | 命中每 1 m/s 增加的凹陷半径(cm)。 | 1.5 |
UCFProfile::LateralScale | 使凹陷横向加宽。 | 1.5 |
UCFProfile::CrumpleRatio | 点状命中使金属压溃的范围,以其深度的倍数计。 | 3 |
UCFProfile::NoiseAmount | 点状命中的深度中,每个节点被随机减去的比例,最高 0.9。 | 0.3 |
UCFProfile::MaxDisplacement | 任一节点能移动的最远距离(cm)。车身材质以此作为位移边界。 | 60 |
UCFSettings::AutoRepairDelay | 车身最近一次受损后,经过多少秒自动修复。0 表示从不。 | 0 |
检查是否正常工作
Section titled “检查是否正常工作”在 Play In Editor 中打开 Proving Ground 演示。该指令会跳过你驾驶的车辆,因此目标是第二辆车:把一辆按上述配置文件设置好的车放在视野内,并记下它在 World Outliner 中显示的名称。
- 输入
Crushform.DebugImpact 15 <car name>,将<car name>替换为该车的名称。它会从你所在的位置以 15 m/s 命中指定的车辆,日志会显示it is now damaged。 - 输入
Crushform.Debug 2。晶格会以节点和梁的形式显示。每次近期的命中都会留下一个蓝色球体和法线箭头,持续几秒。 - 输入
Crushform.RepairAll。日志会报告修复了多少个车身,凹陷随之消失。
Crushform.Debug、Crushform.DebugImpact 和 Crushform.RepairAll 是作弊指令:它们在除 Shipping 之外的所有构建以及编辑器中都可以使用。
命中没有留下凹陷
Section titled “命中没有留下凹陷”原因。 速度变化量等于或低于 Min Delta V。只有超过它的命中才会造成凹陷。
修复。 降低 Min Delta V,或使命中更猛烈。要检查车身本身,可对它运行 Crushform.DebugImpact 15 <car name>(见上文“检查是否正常工作”)。如果这次命中使车身凹陷,说明游戏中的命中太轻了。
凹陷比命中浅
Section titled “凹陷比命中浅”原因。 Max Dent Per Hit 默认把一次命中限制在 20 cm。更猛烈的命中也不会挖得比这个上限更深。
修复。 提高 Max Dent Per Hit,但应保持远低于 Max Displacement,以便重复命中仍能使凹陷加深。
凹陷自行消失
Section titled “凹陷自行消失”原因。 Auto Repair Delay 大于 0。车身会在最近一次受损后经过该秒数自动修复。
修复。 在 Project Settings > Plugins > Crushform 的 Repair 下,将 Auto Repair Delay 设为 0,或设为你需要的延迟。
部分面板会凹陷,另一些从不凹陷
Section titled “部分面板会凹陷,另一些从不凹陷”原因。 配置文件中的 Include Tags 和 Exclude Tags 会筛选可以弯曲的网格体。带有被排除标签的网格体永远不会凹陷;相对车身会移动的部件必须被排除。
修复。 检查面板的组件标签,以及配置文件中的这两个列表。