Niagara 流体模拟实战:水、火、烟的真实感制作技巧

上周有位学员在群里发来一段视频:他用标准粒子系统做了个瀑布,结果看起来像“蓝色塑料珠帘”,完全没水的质感。这个问题很典型——很多新手以为粒子堆得越多越逼真,实际上,Niagara 的流体模拟核心在于控制粒子的行为逻辑,而非单纯增加数量。

今天我们就用 UE5.4 的 Niagara 系统,从水、火、烟三个实战案例,拆解真实感流体制作的关键技巧。全程可跟练,版本号 UE5.4.4,Niagara 版本 5.4。

一、水的制作:从“塑料珠”到“流体感”

1.1 核心问题分析

水的视觉核心是表面张力连续性。普通粒子系统默认是球体碰撞,水珠之间不会粘连,看起来就像一堆散弹。我们需要用 Niagara 的 `Fluid Surface` 模块来模拟表面张力。

操作步骤:

1. 创建 Niagara 系统,选择 `Emitter Type` 为 `Fluid`(注意不是 `Sprite` 或 `Ribbon`)。
2. 在 `Emitter Update` 中添加 `Fluid Surface` 模块。参数设置:
– `Surface Tension`(表面张力):设为 `0.8`(值越高,水珠越圆润)
– `Cohesion`(内��力):设为 `0.6`(控制水珠之间的粘连)
– `Rest Density`(静止密度):设为 `1000`(模拟水的密度)
3. 添加 `Simulation Stage` → `Particle Attribute Reader`,勾选 `Fluid Density` 和 `Fluid Pressure`。
4. 在 `Particle Spawn` 中设置初始速度:`Random Range(X: -100~100, Y: -100~100, Z: 200~500)`,让水珠有自然散落感。

水粒子表面张力参数设置

关键检查点:运行后如果水珠还是散开的,说明 `Cohesion` 值太低;如果水珠粘成一大坨,则 `Surface Tension` 过高。

1.2 碰撞与飞溅效果

真实的水流遇到障碍物会产生飞溅。我们需要在 `Collision` 模块中做分支处理。

1. 在 `Particle Update` 中添加 `Collision` 模块,选择 `Planar Collision` 或 `Mesh Collision`。
2. 添加 `Event Handler` → `On Collision`,创建一个新的 `Event` 类型为 `Spawn Particles`。
3. 在生成的子粒子中,设置:
– `Lifetime`:`0.3~0.8` 秒(飞溅水珠寿命短)
– `Color`:`LinearColor(0.8, 0.9, 1.0, 1.0)`(半透明蓝白)
– `Size`:`Random Range(0.5~2.0)`(小水珠)

飞溅粒子事件分支

提示:主粒子用 `Fluid` 类型,飞溅子粒子用 `Sprite` 类型,材质用半透明 `Translucent`,Blend Mode 选 `AlphaComposite`。

二、火的制作:动态燃烧与热浪扭曲

火的核心是温度梯度随机性。很多教程只教用 `Sprite` 粒子加火焰贴图,但那样做出来的是“纸片火”。我们要用 `Ribbon` 粒子 + 温度场控制。

2.1 火焰主体:Ribbon 粒子链

1. 新建 Niagara 系统,Emitter 类型选 `Ribbon`。
2. 在 `Particle Spawn` 中设置:
– `Lifetime`:`0.5~1.5` 秒
– `Ribbon Width`:`Random Range(10~30)`
– `Ribbon Twist`:`Sine Wave(Amplitude=15, Frequency=3)`
3. 在 `Particle Update` 中添加 `Vortex` 力场:
– `Vortex Strength`:`50~100`
– `Vortex Radius`:`100~200`
– `Vortex Axis`:`(0,0,1)`(向上旋转)

这样火焰会有自然的螺旋上升感。

2.2 温度与颜色映射

真实火焰从内到外颜色不同:中心白热 → 黄色 → 橙色 → 红色 → 半透明。用 `Color Over Life` 模块实现:

1. 添加 `Color Over Life` 模块,曲线设置:
– Time 0.0:`White (1,1,1,1)`
– Time 0.2:`Yellow (1,0.8,0,1)`
– Time 0.5:`Orange (1,0.4,0,1)`
– Time 1.0:`Dark Red (0.5,0,0,0)`
2. 添加 `Size Over Life`,让粒子从中心向外扩散时变大���

2.3 热浪扭曲效果

火焰上方需要热浪扭曲,这需要用到 `Render Target` + `Post Process`。但为了简化,我们可以在 Niagara 中直接模拟:

1. 在 `Particle Update` 中添加 `Noise` 模块,`Noise Mode` 选 `Perlin Noise`,`Frequency` 设为 `0.5`,`Amplitude` 设为 `10`。
2. 将这个 Noise 值绑定到粒子的 `Position` 偏移,形成扭曲感。

注意:火焰粒子数控制在 500~2000 之间,太多会导致性能问题。

三、烟的制作:体积感与消散

烟最难的是体积感消散逻辑。用 `Sprite` 粒子做烟,无论怎么堆叠都像“棉花糖”。我们需要用 `Volume` 模式 + `Opacity` 曲线控制。

3.1 体积烟粒子

1. 创建 Niagara 系统,Emitter 类型选 `Volume`(需要开启 `Volume Renderer`)。
2. 在 `Particle Spawn` 中:
– `Lifetime`:`3~6` 秒
– `Size`:`Random Range(50~150)`
– `Density`:`0.5~1.0`
3. 在 `Particle Update` 中添加 `Drag` 模块,`Drag Coefficient` 设为 `0.8`(模拟空气阻力)。

3.2 消散控制

烟的消散不是均匀变淡,而是从边缘开始。用 `Opacity Over Life` 曲线控制:

  • Time 0.0:`Opacity 0.0`(刚生成时透明)
  • Time 0.1:`Opacity 0.8`(快速变浓)
  • Time 0.5:`Opacity 0.6`(保持)
  • Time 0.8:`Opacity 0.2`(开始消散)
  • Time 1.0:`Opacity 0.0`(完全消散)
  • 3.3 风场与湍流

    烟需要随气流飘散。添加 `Wind` 力场:

    1. `Wind Velocity`:`(10, 5, 3)`(水平飘移)
    2. `Turbulence`:`Scale 20, Frequency 0.3`(模拟湍流)

    材质提示:烟的材质用 `Unlit` 模式,Blend Mode 选 `AlphaComposite`,贴图用 `Noise` 纹理(Perlin Noise 生成),这样会有自然的絮状感。

    总结与进阶建议

    以上三个案例覆盖了流体模拟的三种典型状态:液体(水)、燃烧(火)、气体(烟)。核心要点:

    1. :依赖 `Fluid Surface` 模块的 `Cohesion` 和 `Surface Tension`,飞溅用 `Event Handler`。
    2. :用 `Ribbon` 粒子 + `Vortex` 力场 + `Color Over Life`,注意粒子数控制。
    3. :用 `Volume` 模式 + `Opacity Over Life` 曲线 + 风场。

    进阶方向

  • 尝试用 `Data Interface` 读取外部流体模拟数据(如 Houdini 导出的 .vdb 文件)
  • 结合 `GPU Particles` 和 `Compute Shader` 实现超大规模模拟(10万+粒子)
  • 在 Niagara 中调用 `Custom HLSL` 自定义物理规则
  • 常见问题 FAQ

    Q1:为什么我的水粒子看起来像“果冻”?
    A:检查 `Fluid Surface` 模块的 `Surface Tension` 是否过高(超过 1.0 会导致弹性感)。建议先设为 0.6~0.8,再配合 `Cohesion` 微调。

    Q2:火焰粒子数超过 2000 就卡顿?
    A:开启 `GPU Simulation`(在 Niagara 系统属性中勾选 `Force GPU`),并将 `Ribbon` 粒子改为 `Sprite` 模式,用 `Texture Sheet` 模拟火焰动画。

    Q3:烟的消散速度太快或太慢怎么办?
    A:调整 `Opacity Over Life` 曲线的时间轴,或者修改 `Lifetime` 范围。如果想控制消散速度,还可以在 `Particle Update` 中添加 `Scale Lifetime` 模块。

    Q4:水、火、烟可以混合使用吗?
    A:可以,但注意 `Sort Mode` 要设为 `Sort by Distance`(深度排序),否则粒子穿插会导致视觉错误。不同系统的 `Blend Mode` 建议统一为 `AlphaComposite`。

    Q5:我的 Niagara 版本没有 `Fluid Surface` 模块?
    A:`Fluid Surface` 在 UE5.3 之后才加入,请确认引擎版本。如果版本较旧,可以用 `SPH`(Smoothed Particle Hydrodynamics)模块替代,参数类似。

    学习建议:不要试图一次性做出完美效果。先从单个系统(比如只做水)开始,参数调通后再叠加其他模块。Niagara 的调试工具非常强大——右键粒子 → `Debug Visualization` → 勾选 `Density`、`Velocity`、`Pressure`,可以实时看到物理数据。多练习,多观察真实物理现象,你的流体效果会越来越自然。

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。