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

上周一位学员在群里发来他做的火焰特效——粒子像糖豆一样弹跳,完全没有火焰的流动感。他问我:“老师,我照着教程调了大小和颜色,为什么看起来还是假?”这个问题其实戳中了80%初学者的痛点:我们太依赖预设参数,却忽略了流体运动的核心逻辑——力场、温度场和密度场的协同作用。

今天,我就用UE5.3的Niagara系统,带你拆解水、火、烟三种流体的真实感制作。不讲空话,直接上操作。

一、火焰:从“糖豆”到“火焰”的质变

1.1 火焰的物理本质:温差驱动的湍流

火焰不是一堆飘动的球,而是高温气体在重力场中受浮力驱动形成的湍流结构。在Niagara中,我们需要模拟三个关键因素:

  • 浮力:高温气体密度低,向上加速
  • 湍流:随机涡旋使火焰边缘卷曲
  • 温度衰减:远离火源温度下降,粒子变小变暗
  • 1.2 实操:创建火焰系统(UE5.3版本)

    步骤1:新建Niagara系统

  • 右键Content Browser → FX → Niagara System → 选择`Empty`模板
  • 命名为`NS_Fire_Realistic`
  • 步骤2:设置发射器

  • 在Emitter Properties中,将`Spawn Rate`设为200(每秒200个粒子)
  • `Lifetime`设为1.0-2.5秒,用Random Range分布:`Min 1.0, Max 2.5`
  • 步骤3:关键模块配置
    在Particle Update阶段添加以下模块:

    A. 浮力模拟(Force模块)

  • 添加`Add Velocity`模块
  • 设置`Velocity`为`(0, 0, 300)`,代表每秒向上300cm
  • 关键:勾选`Apply in World Space`,确保粒子受全局重力影响
  • B. 湍流效果(Noise模块)

  • 添加`Noise Field`模块(注意不是`Perlin Noise`)
  • 参数:
  • – `Noise Strength`: 100-300(控制抖动幅度)
    – `Frequency`: 0.5-1.0(频率越高抖动越细碎)
    – `Octaves`: 3(叠加3层噪声,产生复杂涡旋)
    – `Amplitude`: 0.5(每层衰减比例)

    C. 温度衰减模拟

  • 添加`Scale Color`模块
  • 使用`Lifetime`作为驱动:
  • – 生命周期0-0.3s:Color从`(1.0, 0.8, 0.3)`(亮黄)渐变为`(1.0, 0.4, 0.1)`(橙红)
    – 生命周期0.3-1.0s:继续变暗至`(0.3, 0.05, 0.0)`(暗红)

  • 同时添加`Scale Size`模块:初始大小`5.0`,生命周期结束时缩小到`0.5`
  • 步骤4:渲染优化

  • 在Renderer中,材质选择`M_Flame`(需提前创建半透明材质,Blend Mode设为Translucent)
  • 勾选`Sort Order`为`Sorted`,防止粒子穿插
  • 火焰粒子参数配置面板

    完��以上设置,播放看效果。如果粒子仍然太“飘”,可以增加`Drag`模块(阻尼系数设为0.1),模拟空气阻力。

    二、水流:粘性流体的表面张力与飞溅

    2.1 水的特殊挑战

    水比火焰难做,因为需要同时模拟:

  • 主体流动:受重力主导,沿地形或容器表面流动
  • 飞溅:碰撞时产生小液滴
  • 表面张力:液滴呈球状,不会散成烟雾
  • 2.2 实操:创建水流系统

    步骤1:基础发射器

  • 新建Niagara系统`NS_Water_Flow`
  • 发射器类型选择`Grid Spawn`(网格发射),模拟水流从管道口流出
  • `Spawn Rate`: 500粒子/秒,`Lifetime`: 2.0-4.0秒
  • 步骤2:重力与碰撞

  • 添加`Gravity Force`模块,`Gravity`设为`(0, 0, -980)`(厘米/秒²)
  • 添加`Collision`模块,选择`World Collision`,碰撞响应设为`Bounce`(反弹)
  • 关键参数:`Restitution`(弹性系数)设为0.1,模拟水无弹性碰撞;`Friction`设为0.3
  • 步骤3:粘性与表面张力(关键技巧)

  • 添加`Viscosity`模块(需从Module库手动添加)
  • – `Viscosity`: 0.8(数值越高,粒子���“粘稠”)
    – 注意:这个模块会消耗性能,建议只在近景使用

  • 添加`Attraction Force`模块模拟表面张力:
  • – `Attraction Radius`: 10.0(粒子在10cm内相互吸引)
    – `Attraction Strength`: 50.0(吸引力强度)
    – 效果:粒子聚集形成水团,而不是散开

    步骤4:飞溅效果

  • 在粒子碰撞事件中触发子发射器:
  • – 在Emitter的`Event Handlers`中添加`On Collision`事件
    – 生成子发射器`NS_Water_Splash`(单独创建)
    – 子发射器参数:粒子大小0.5-2.0,生命周期0.3-0.8秒,速度方向随机

    步骤5:渲染与材质

  • 使用`M_Water_Drop`材质(Translucent,高光强度0.8,粗糙度0.1)
  • 在Renderer中开启`Motion Blur`,模拟水流拖尾
  • 水流粒子系统结构图

    2.3 性能优化技巧

    水流粒子数通常很大(1000+),建议:

  • 使用`Fixed Bounds`代替自动边界计算,减少CPU开销
  • 在`Particle Spawn`阶段预计算颜色和大小,避免Update阶段重复计算
  • 开启`GPU Simulation`(在Emitter Properties中勾选`GPU`)
  • 三、烟雾:从火焰到烟尘的过渡

    3.1 烟雾的物理特性

    烟雾是火焰的“延续”——当燃料燃烧不完全时,碳颗粒悬浮在空气中形成烟。关键特性:

  • 缓慢扩散:受布朗运动和湍流驱动
  • 密度衰减:随时间变稀���直至消失
  • 颜色变化:从灰黑逐渐变淡白
  • 3.2 实操:创建烟雾系统

    步骤1:从火焰发射器继承

  • 右键`NS_Fire_Realistic` → Duplicate,重命名为`NS_Smoke`
  • 修改发射器:`Spawn Rate`改为100(烟雾粒子较少但生命周期长)
  • `Lifetime`: 5.0-10.0秒(烟雾存留时间长)
  • 步骤2:修改力场

  • 删除`Add Velocity`模块(烟雾不应有强烈的上升速度)
  • 添加`Brownian Motion`模块(模拟布朗运动):
  • – `Strength`: 20.0(随机扰动幅度)
    – `Frequency`: 0.5(扰动频率)

  • 保留`Noise Field`模块,但降低强度:`Noise Strength`设为50-100
  • 步骤3:密度与透明度

  • 在`Scale Color`模块中,使用Alpha通道控制透明度:
  • – 生命周期0-2s:Alpha从0.8降到0.3(烟雾变稀薄)
    – 生命周期2-5s:Alpha从0.3降到0.0(完全消散)

  • 添加`Scale Size`模块:初始大小10.0,生命周期结束时扩大到30.0(烟雾扩散)
  • 步骤4:材质设置

  • 材质使用`M_Smoke_Volume`(需包含`Opacity`节点与`Depth Fade`)
  • 关键:开启`Screen Alignment`为`Velocity Aligned`,让烟雾粒子沿运动方向拉伸
  • 3.3 混合效果:火焰+烟雾

    在实际项目中,火焰和烟雾是共存的。建议:
    1. 在同一Niagara系统中创建两个发射器
    2. 火焰发射器在前(渲染顺序优先级高)
    3. 烟雾发射器延迟0.5��产生(模拟燃烧后的烟)

    四、总结与进阶建议

    4.1 核心公式总结

    | 流体类型 | 主导力场 | 关键模块 | 典型参数 |
    |———|———|———|———|
    | 火焰 | 浮力+湍流 | Noise Field, Add Velocity | 上升速度300,Noise强度200 |
    | 水流 | 重力+粘性 | Viscosity, Attraction Force | 粘度0.8,吸引力50 |
    | 烟雾 | 布朗运动+湍流 | Brownian Motion, Scale Alpha | 布朗强度20,生命周期8秒 |

    4.2 进阶学习路径

    1. 掌握HLSL着色器:Niagara支持自定义GPU计算,用HLSL写流体方程(如Navier-Stokes)可以实现真正的物理模拟
    2. 学习流体纹理:使用`Fluid Surface`材质函数,将粒子渲染成连续的水面
    3. 结合AIGC:用Stable Diffusion生成流体纹理图(如烟雾的密度贴图),导入Niagara作为粒子纹理
    4. 性能预算:手游目标100-200粒子,PC端1000-3000,电影级可达10000+,根据平台调整参数

    常见问题 FAQ

    Q1:为什么我的火焰粒子总是呈直线上升,没有卷曲效果?
    A:检查`Noise Field`模块的`Octaves`是否设为3以上,同时确保`Noise Strength`不低于100。如果仍然无效,尝试在`Particle Update`中添加`Vortex`模块(涡旋力),强度设为50-100。

    Q2:水流粒子碰撞时全部弹飞,不像是水?
    A:将`Collision`模块的`Restitution`(弹性)设为0.05-0.1,`Friction`设为0.5以上。同时确保`Viscosity`模块已启用,数值0.5-0.8。

    Q3:烟雾粒子在远处变成半透明线条,怎么办?
    A:在材质中开启`Depth Fade`(深度淡出),调整`Fade Distance`为100-500cm。同时在Niagara Renderer中勾选`Sort Order`为`Sorted`,并增大粒子`Min Screen Size`(最小屏幕尺寸)为2-5像素。

    Q4:粒子数量一多就掉帧,如何优化?
    A:优先开启`GPU Simulation`(在Emitter Properties中),同时使用`Fixed Bounds`(固定边界)减少CPU计算。对于烟雾,可以将`Spawn Rate`降低到50-80,并用`Scale Size`放大粒子弥补密度。

    Q5:火焰和烟雾如何在同一系统中共存?
    A:创建两个Emitter,分别命名为`Emitter_Fire`和`Emitter_Smoke`。在`Emitter_Smoke`的`Spawn`阶段添加`Delay`(延迟0.3-0.5秒),并设置`Lifetime`为5-8秒。在渲染顺序中,火焰Emitter放在前面(索引0),烟雾放在后面(索引1)。

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