在 Unreal Engine Niagara 中用 Scratch Pad 实现《Returnal》风格的触手与绳索模拟
动态触手与绳索
受 Housemarque 在 GDC 上关于《Returnal》的演讲启发——他们在其中利用自定义的 GPU 驱动链条系统来处理投射物、触手和植被——我想看看能否完全在虚幻引擎的 Niagara 框架内构建类似的方案,而不依赖自定义的 C++ 架构。


Niagara 系统及其 Scratch Pad 不再只是用于爆炸和魔法的工具–它们是一个完全可自定义的 HLSL 计算环境,附带大量来自 Epic Games 开发者本人的预设和示例,你可以轻松打开并查看每个模块内部发生了什么,从 ColorScaler 到 GPU Collision 逻辑和 RayTracing。
初始设置
当我开始做这个时,我完全不知道 HLSL 是什么,也不知道从哪里入手。因为关于 Niagara Scratch Pads 的教程甚至文档都不多。我不得不参考虚幻引擎的高级示例,并通过逆向工程来学习。
Niagara 有一个 Attribute Reader,它允许发射器和粒子从其他粒子中提取数据,并根据输出为自身分配变量。

因此,为了制作绳索约束模拟,我需要实现一种子级到父级的约束逻辑。这会在按链式顺序排列的粒子数组之间建立层级关系。
通过管理 Niagara 的原生属性(如 UniqueID、RibbonLinkOrder 和 RibbonID),你可以逐个索引和计算粒子,从而让 Attribute Reader 在整个链条上映射数据。
最后,我成功让它作为一种单侧约束行为工作:如果我们已经对顺序进行了排序,并使用 Attribute Reader 读取父级位置,我们就可以更改粒子的位置并将它们吸附到父级上。

HLSL 会检查子粒子是否已离父粒子过远(由 maxDistance 定义),如果确实过远,则将子粒子吸附回父粒子的钳制位置。

环境距离场碰撞
默认碰撞模块已经提供了很多功能,但它带有一些“安全”选项,会在粒子穿透表面过深时杀死或剔除粒子。所以我需要一套简单但可靠的“不许穿模,也不许死亡”逻辑。尤其是当绳索上有一个粒子死亡时,它会破坏相邻粒子的顺序以及约束逻辑本身。
为了绕过这个问题,我编写了一个自定义的简化碰撞脚本,使用与原始碰撞模块相同的 Signed Distance Field(SDF,有符号距离场)。

该脚本访问 CollisionQuery 值,粒子由此可以读取到 Distance Field 的位置和距离,并在粒子穿透表面时将其吸附回表面。

我们来看一下效果:

模块的顺序至关重要:
- Velocity 由于 PBD 机制,应在约束阶段之前计算。
- SDF_OffsetCorrection 在 约束 之后执行,因为它是一个优先级模块,在发生碰撞时会覆盖之前的值。
- CalculateAccurateVelocity 应放在最后,在所有位置修改之后。
最终,整个发射器看起来是这样的:

双向约束与 PBD
单向约束效果不错,但不够真实,无法像真正的绳子那样表现。
为了实现一种稳定、双向的约束,使其表现自然,并且可以从两端拉拽/固定,我使用 Verlet 积分编写了一个自定义的基于位置的动力学(PBD)求解器。
下面这篇有启发性的文章介绍了 Verlet 绳索逻辑和 PBD:

代码和发射器有点长,无法在本文中详细解释,但我会展示要点:


它的工作方式基本上与单边约束(one-sided constraint)相同,但在这种情况下,它还会读取子级参数:

并且,粒子不是被吸附回父级约束,而是吸附到父级修正与子级修正之间的中间值:

在此基础上,还有一个端点约束模块,它基本上通过使用归一化的 RibbonLinkOrder(用于定义它是否是链中的第零个/最后一个粒子)来将第零个和最后一个 ribbon 粒子锁定在指定位置:

此外,有一条硬性规则:不要在 PBD 中计算速度。它会在所有位置变换之后由 CalculateAccurateVelocity 求解,使用位置增量 – 这是 PBD 求解器的基础 – 取上一位置和当前位置,并根据它们的增量计算速度。

我最终制作的不只是一个 VFX 资源包,而是一个可以以多种方式使用的工具:不仅能制作触手,还能制作植被、藤蔓、草、绳索、链条等等。
以下是成果和可能的用途:
资产包
我将整个研究打包成两套独立工具集,已在 FAB 上通过 FXology 提供。两个包都将参与 Fab Summer Mega Sale(7 月 21 日至 29 日);现在就把它们加入愿望单,以便享受折扣:
- 动态触手与绳索(高级 Niagara VFX)
包含完整的双面 PBD 求解器、Grid3D 自碰撞,以及 48 个带注释的示例设置(UE 5.5+)。 - 动态触手(Niagara VFX)
原始工作流包含更轻量的单面约束行为(UE 5.1+)。

如果你有任何问题,可以在 FAB、X、YouTube、Discord 和 LinkedIn 上找到我。
Adiyar Aidarbekov,高级 VFX 艺术家
相关链接
原文链接:https://80.lv/articles/how-to-create-dynamic-tentacle-and-rope-simulation-inspired-by-returnal
喜欢这篇内容吗?