在 Unreal Engine Niagara 中用 Scratch Pad 实现《Returnal》风格的触手与绳索模拟

AI3D 发表于 4 周前 浏览 1 分类 创作分享

动态触手与绳索

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal
How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

Niagara 系统及其 Scratch Pad 不再只是用于爆炸和魔法的工具–它们是一个完全可自定义的 HLSL 计算环境,附带大量来自 Epic Games 开发者本人的预设和示例,你可以轻松打开并查看每个模块内部发生了什么,从 ColorScaler 到 GPU Collision 逻辑和 RayTracing。

初始设置

当我开始做这个时,我完全不知道 HLSL 是什么,也不知道从哪里入手。因为关于 Niagara Scratch Pads 的教程甚至文档都不多。我不得不参考虚幻引擎的高级示例,并通过逆向工程来学习。

Niagara 有一个 Attribute Reader,它允许发射器和粒子从其他粒子中提取数据,并根据输出为自身分配变量。

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

因此,为了制作绳索约束模拟,我需要实现一种子级到父级的约束逻辑。这会在按链式顺序排列的粒子数组之间建立层级关系。

通过管理 Niagara 的原生属性(如 UniqueID、RibbonLinkOrder 和 RibbonID),你可以逐个索引和计算粒子,从而让 Attribute Reader 在整个链条上映射数据。

最后,我成功让它作为一种单侧约束行为工作:如果我们已经对顺序进行了排序,并使用 Attribute Reader 读取父级位置,我们就可以更改粒子的位置并将它们吸附到父级上。

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

环境距离场碰撞

默认碰撞模块已经提供了很多功能,但它带有一些“安全”选项,会在粒子穿透表面过深时杀死或剔除粒子。所以我需要一套简单但可靠的“不许穿模,也不许死亡”逻辑。尤其是当绳索上有一个粒子死亡时,它会破坏相邻粒子的顺序以及约束逻辑本身。

为了绕过这个问题,我编写了一个自定义的简化碰撞脚本,使用与原始碰撞模块相同的 Signed Distance Field(SDF,有符号距离场)。

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

我们来看一下效果:

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

模块的顺序至关重要:

  • Velocity 由于 PBD 机制,应在约束阶段之前计算。
  • SDF_OffsetCorrection 在 约束 之后执行,因为它是一个优先级模块,在发生碰撞时会覆盖之前的值。
  • CalculateAccurateVelocity 应放在最后,在所有位置修改之后。

最终,整个发射器看起来是这样的:

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

双向约束与 PBD

单向约束效果不错,但不够真实,无法像真正的绳子那样表现。 

为了实现一种稳定、双向的约束,使其表现自然,并且可以从两端拉拽/固定,我使用 Verlet 积分编写了一个自定义的基于位置的动力学(PBD)求解器。

下面这篇有启发性的文章介绍了 Verlet 绳索逻辑和 PBD:

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal
How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

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

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

我最终制作的不只是一个 VFX 资源包,而是一个可以以多种方式使用的工具:不仅能制作触手,还能制作植被、藤蔓、草、绳索、链条等等。

以下是成果和可能的用途:

资产包

我将整个研究打包成两套独立工具集,已在 FAB 上通过 FXology 提供。两个包都将参与 Fab Summer Mega Sale(7 月 21 日至 29 日);现在就把它们加入愿望单,以便享受折扣:

How to Create Dynamic Tentacle and Rope Simulation Inspired by Returnal

如果你有任何问题,可以在 FAB、X、YouTube、Discord 和 LinkedIn 上找到我。

Adiyar Aidarbekov,高级 VFX 艺术家

相关链接

原文链接:https://80.lv/articles/how-to-create-dynamic-tentacle-and-rope-simulation-inspired-by-returnal

喜欢这篇内容吗?