损伤铰接部件
铰接部件
车门、引擎盖或后备箱挂在铰链上,碰撞可能使它松动。部件处的凹陷会使它绕铰链摆动。更猛烈的碰撞,或扯断关节的撞击,会让它脱落。本页介绍这些情况何时发生,以及如何设置铰链和挂点。凹陷本身在凹陷与晶格中说明。
仅凹陷的部件会留在铰链上,并向外摆开。受到足够猛烈挤压的部件会脱落,并躺在它掉落的位置。它会在地上停留 Detached Lifetime(60 s),然后在 Detached Sink Time(2 s)内下沉并隐藏。
- 状态。 铰接部件有三种状态:固定、在关节上摆动,或已脱落。在凹陷使其松动之前,它始终处于固定状态。
- 部件。 部件是铰链正下方的那一个静态网格体。玻璃和把手挂在部件下方,并随之移动。
- 凹陷的测量范围。 铰链从晶格读取三个数值。Max 是部件所在盒体内最深的凹陷。Mean 是该盒体内的平均值。Pin 是铰链销轴 Pin Radius 范围内最深的凹陷。
- 摆动。 当 Max 达到 Swing Threshold(8 cm)时,部件松动,并绕其周围凹陷最轻的挂点摆动。
- 稳定。 松动后的 Swing Settle Time(1 s)内,关节无法被扯断,部件也不会被甩脱。超过脱落阈值的凹陷不必等待这段时间。
- 立即脱落。 当 Mean 达到 Detach Mean Threshold(20 cm),或 Pin 达到 Detach Pin Threshold(30 cm)时,部件会在碰撞的同时脱落。当
UCFSettings::CollisionDeferFrames为 1(默认值)时,部件在碰撞之后的那一帧才开始摆动或脱落,而不是在碰撞的那一帧。 - 扯断。 摆动中的关节在其销轴上的受力超过 Break Force(9200 N),或力矩超过 Break Torque(5200 N*m)时被扯断。数值为 0 则永不扯断。只有决定损伤的那一端会扯断关节,脱落状态再同步到其他端。
- 甩脱。 当 Shake Off Travel 大于 0 时,部件在稳定时间之后,若累计摆动的角度达到该值,就会脱落。
- 保持就位。 只要另一辆车位于 Torn Part Hold Margin(20 cm)以内,或正快速靠近,被扯断的部件就会留在原处。该车驶离后部件才会掉落,因此它不会在两辆车之间脱落。它还会等待车身碰撞体在其位置周围切割完成。在掉落之前,它可能在原位悬着,或继续在铰链上摆动,持续一帧(如果它脱落时另一次碰撞构建正在运行,则持续两帧),因此它绝不会从车身内部开始。当
UCFSettings::CollisionDeferFrames为 0 时它不等待切割:脱落的那一帧就掉落,除非有车辆拦住它。 - 挂点。 Mounts 是部件松脱后可以挂住的位置,例如保险杠的两端。没有挂点时,部件会绕铰链自身的轴按 Open Angle 摆动。
- 声音。 摆动的部件撞上止点时,会通过部件撞击反馈播放其撞击声和特效,前提是车辆的 Impact Feedback 和 Dirt and Dents 已开启。参见撞击反馈。
- 配置文件。 配置文件中的 Hinged Parts 会开启以上全部功能。关闭时,部件永远不会摆动、脱落或被扯断。
- 修复。 Repair 会把每个脱落的部件放回蓝图中原本的位置。
- 在车辆的蓝图中,将车门的静态网格体直接放在 CFHinge 之下。该组件从 Add 中添加,位于 Crushform 分组。将组件放在铰链销轴的位置:它的位置即为销轴,它的 Z 轴即为销轴的方向。
- 为部件添加标签,例如
CF_NoDeform,并将该标签列入配置文件的 Exclude Tags。晶格在游戏开始时固定到车身上,因此相对车身会移动的部件不能随之弯曲。 - 在铰链上,先保留默认值:Open Angle 70,Part Mass 20 kg,Swing Threshold 8,Detach Mean Threshold 20,Detach Pin Threshold 30,Pin Radius 40。两个脱落阈值中较小的那个必须低于配置文件的 Max Displacement,也要低于部件周围区域的 Max Depth。否则凹陷永远无法让部件脱落,并且日志会发出警告。
- 对于两端挂住的保险杠,为每一端添加一个挂点。在蓝图视口中右键点击铰链,从 Hinge Mounts 菜单中选择 Add Mount。第一个挂点会复制铰链自身的销轴;之后的挂点则从部件的中央开始。 只有选中某个挂点时,菜单中才会出现 Duplicate、Delete 和 Mirror:请先点击挂点的圆环以选中它。Duplicate 会将它沿部件的长边复制到 10 cm 远处,Mirror 会添加一个关于部件中央的镜像,Delete(或 Delete 键)则删除它。 在关卡 Actor 上选中铰链时,同样的菜单和控件也可以使用。在 Play In Editor 中,挂点会显示,但无法编辑。
| Hinge | ||
|---|---|---|
| Open Angle | ||
| Part Mass | 22.0 | |
| Dented Part Collision | ||
| Swing Threshold | 8.0 | |
| Detach Mean Threshold | 20.0 | |
| Detach Pin Threshold | 30.0 | |
| Pin Radius | 40.0 | |
| Break Force | 9200.0 | |
| Break Torque | 5200.0 | |
| Mounts | 0 Array element | |
- 在配置文件中,保持 Hinged Parts 开启。
铰链的蓝图事件有:On Started Swinging(部件松脱)、On Detached(部件脱落;若本机首次看到该车时它已经脱落,例如中途加入的玩家,则 bHiddenAtOnce 为 true)、On Reattached(修复将其放回)和 On Stop Hit(摆动的部件撞上行程的末端)。它们会在运行铰链物理的每个端上触发,专用服务器上从不触发,并在计时器的下一次 tick 时送达蓝图。Get State 和 Get Part 用于读取铰链。蓝图可以通过 Get Damage in Box 读取部件的凹陷程度,它返回盒体内凹陷的 Max 和 Mean,以配置文件的 Max Displacement 的占比表示。下面的图表在轿车的适配器上调用它,并打印最深的凹陷,即 Max。恢复铰接部件的 Repair 调用在凹陷与晶格中说明。
在 C++ 中,铰链有两个委托。以下代码区分车门的撞止与扯断:
// Called on every machine that runs the hinge's physics, when a swinging part slams into an end of its travel.void AMyCar::OnDoorSlam(UCFHingeComponent* Hinge, const FCFHingeStopHit& Hit){ UE_LOG(LogTemp, Log, TEXT("%s slammed at %.0f cm/s"), *Hinge->GetName(), Hit.Speed);}
// Called once when a swinging joint tears.void AMyCar::OnPartTorn(UCFHingeComponent* Hinge){ UE_LOG(LogTemp, Log, TEXT("%s came off"), *Hinge->GetName());}
// In BeginPlay, for each hinge:Hinge->OnStopHit.AddUObject(this, &AMyCar::OnDoorSlam);Hinge->OnTorn.AddUObject(this, &AMyCar::OnPartTorn);| 属性 | 作用 | 默认值 |
|---|---|---|
UCFHingeComponent::OpenAngle | 从关闭到完全打开的行程,单位为度。 | 70 |
UCFHingeComponent::PartMass | 部件摆动或松脱时的质量,单位 kg。 | 20 |
UCFHingeComponent::SwingThreshold | 部件周围最深的凹陷(cm),达到该值时部件开始摆动。 | 8 |
UCFHingeComponent::DetachMeanThreshold | 部件上的平均凹陷(cm),达到该值时部件脱落。 | 20 |
UCFHingeComponent::DetachPinThreshold | Pin Radius 内、距销轴最深的凹陷(cm),达到该值时部件脱落。 | 30 |
UCFHingeComponent::PinRadius | 距销轴多远的凹陷计为销轴处的凹陷(cm)。 | 40 |
UCFHingeComponent::BreakForce | 销轴上的力(N),达到该值时扯断摆动中的部件。0 表示永不。 | 9200 |
UCFHingeComponent::BreakTorque | 销轴上的力矩(N*m),达到该值时扯断摆动中的部件。0 表示永不。 | 5200 |
UCFHingeComponent::Mounts | 部件松脱后挂住的位置。 | 空 |
UCFHingeComponent::ShakeOffTravel | 部件累计摆动的角度(度),达到该值后才能被甩脱。0 表示永不。 | 0 |
UCFProfile::bHingedParts | 关闭时:铰接部件永远不会摆动、脱落或被扯断。 | 开 |
UCFSettings::SwingSettleTime | 部件松动后,其关节能被扯断之前的秒数。 | 1 |
UCFSettings::DetachedLifetime | 脱落的部件躺在地上,直到开始下沉之前的秒数。 | 60 |
UCFSettings::DetachedSinkTime | 部件按自身高度下沉入地面并隐藏所需的秒数。 | 2 |
UCFSettings::TornPartHoldMargin | 另一辆车与被扯断部件原位之间须保持的距离(cm),部件才会留在原位。 | 20 |
检查是否正常工作
Section titled “检查是否正常工作”- 在 Play In Editor 中打开 Proving Ground 演示,并在你的车辆视野内放置一辆按上述铰链和配置文件设置好的第二辆车。该指令会跳过你驾驶的车辆。将你的车辆摄像机对准第二辆车的车门,输入
Crushform.DebugImpact 18,即以 18 m/s 命中。命中会落在你视线中心所指的位置,即视线首先相交的车身。若要按名称瞄准一辆车,输入Crushform.DebugImpact 18 <car name>:此时命中会落在离该车中心最近的车身上,而这不一定是车门。 - 车门会向外摆开。Output Log 中
LogCrushform下会显示一行,记录部件松动时的情况,另一行记录摆动开始时的情况。 - 再次输入
Crushform.DebugImpact 18。一次命中最多只能挖出 Max Dent Per Hit(20 cm),因此车门需要多次命中才会脱落。或者让你的车高速撞上墙壁,车门就会脱落并躺在地上。 - 输入
Crushform.RepairAll。所有部件都会回到各自的铰链上。
Crushform.DebugImpact 和 Crushform.RepairAll 是作弊指令:它们在除 Shipping 之外的所有构建以及编辑器中都可以使用。
部件从不摆动
Section titled “部件从不摆动”原因。 部件所在盒体内最深的凹陷仍低于 Swing Threshold。或者配置文件中的 Hinged Parts 已关闭,这时所有部件都不会摆动。
修复。 更猛烈地命中部件,或降低 Swing Threshold。检查 Hinged Parts 是否已开启。
部件在平整的道路上脱落
Section titled “部件在平整的道路上脱落”原因。 对于部件的 Open Angle 而言,Shake Off Travel 太低。稳定时间过后,累计摆动超过 Shake Off Travel 的部件会被甩脱。部件自身的开启角度也计入这段行程。
修复。 将 Shake Off Travel 设为 Open Angle 的两到三倍,或设为 0 以使其永不被甩脱。
被扯断的部件悬在另一辆车旁边
Section titled “被扯断的部件悬在另一辆车旁边”原因。 这是保持机制在起作用,并非故障。另一辆车位于部件原位的 Torn Part Hold Margin 之内,或正在靠近,因此部件会留在那里,并在该车离开后掉落。
修复。 如果希望它更快掉落,降低 Torn Part Hold Margin。部件在车辆仍然贴近时被放开,可能会从车身中被甩出,或嵌入车身。
凹陷永远无法使部件脱落
Section titled “凹陷永远无法使部件脱落”原因。 某个脱落阈值比配置文件允许的、部件周围最深的凹陷还要深。这个最深值由 Max Displacement 或区域的 Max Depth 决定。此时日志会发出警告,并给出部件需要的凹陷深度。
修复。 降低该阈值,或提高 Max Displacement 或区域的 Max Depth 使其与之匹配。
