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

大家好,我是火星人教育的UE5特效讲师。上周有个学员发来一个项目截图——一个火山喷发场景,粒子效果看着像一堆彩色泡泡,毫无真实感。他问我:“老师,我按教程调了参数,为什么火不像火,水不像水?”这问题太典型了。很多同学把Niagara当成“粒子发射器”,却忘了它本质是流体力学模拟器。今天我们就用UE5.3/5.4的Niagara系统,手把手做出能骗过眼睛的水、火、烟效果。

一、水:从“弹珠”到“流体”的蜕变

1.1 问题诊断:为什么你的水看起来像塑料球?

在UE5.3中打开Niagara系统,默认的Sprite渲染器会把每个粒子渲染成圆形贴片。如果你直接发射一堆粒子,它们会像弹珠一样弹跳——因为缺乏表面张力粘性。真实的水是连续体,粒子之间需要相互作用。

核心解决思路:用Fluid Surface Renderer(流体表面渲染器)替代Sprite,配合Position Solver(位置解算器)实现粒子间的吸引力。

1.2 实操:制作一滩流动的水

步骤1:创建Niagara系统

  • 在内容浏览器右键 → FX → Niagara System → 选择 Empty(空模板)
  • 双击打开,在Emitter Properties中设置:
  • Spawn Rate:500(每秒发射500个粒子,太少不连贯)
    Lifetime:3.0秒(水粒子存活时间)
    Initial Size:2.0(粒子大小,后续会被流体渲染覆盖)

    步骤2:添加流体解算器

  • 在Emitter Stack中点击“+” → Particle SpawnAdd ModuleFluid Surface(UE5.3新增)
  • 关键参数:
  • Surface Tension:0.8(表面张力,值越高水越容易聚成水滴)
    Viscosity:0.3(粘性,0.1像水,0.5像蜂蜜)
    Rest Density:1.0(目标密度,粒子间距的平衡值)

  • Particle Update中添加 Fluid Solver → 勾选 Enable Pressure Solver(压力解算器,防止粒子穿透)
  • 步骤3:材质与渲染

  • 创建材质:右键 → Material → 选择 Surface → 在材质蓝图中:
  • – 连接 Particle Color 到 Base Color(颜色节点)
    – 连接 Opacity 到 Opacity Mask(透明度,建议0.3-0.5)

  • 在Niagara渲染器设置中,把渲染器改为 Fluid Surface Renderer → 指定刚才的材质
  • 步骤4:添加碰撞

  • Particle Update中添加 CollisionPlane Collision
  • 设置 Collision Plane 为世界Z=0(地面)
  • 调整 Bounce:0.2(水落地不弹跳,像泥巴)
  • 结果:现在粒子会聚集成流动的水面,表面有波纹感,落地后像果冻一样摊开。

    实操小练习1:制作水花飞溅

    1. 复制当前Emitter,改名为“Splash”
    2. 设置Spawn Rate为2000,Lifetime 0.5秒
    3. 在Particle Spawn中添加 Initial Velocity → 设置Z轴速度:500-1000(随机)
    4. 在Particle Update中添加 Gravity → 重力值:-980(模拟重力)
    5. 观察:高速粒子撞到地面后向四周飞散,形成水花

    二、火:用温度场驱动粒子行为

    2.1 火的本质:不是发光,是流动

    很多同学做火时,只调颜色和大小,结果火像静态的贴图。真实火焰是热空气上升驱动的,粒子应该受温度场影响:中心温度高,边缘温度低,粒子速度随温度变化。

    2.2 实操:制作动态火焰

    步骤1:创建基础发射器

  • 新建Niagara系统 → 选择 Empty
  • Emitter设置:
  • Spawn Rate:300
    Lifetime:1.0-2.0秒(随机)
    Initial Size:5.0(火粒子的基础大小)

    步骤2:添加温度场

  • Particle Update中添加 Attribute Reader → 读取 Particle ID(粒子ID)
  • 添加 Custom Hlsl(自定义HLSL代码):
  •   float Temp = 1.0 - (ParticleID % 100) / 100.0; // 温度随ID递增
      Particle.Velocity.Z += Temp * 50.0; // 温度越高上升越快
      
  • Particle Spawn中添加 Set Particle Color → 用温度值映射颜色:
  • – 温度1.0 → 白色(火焰核心)
    – 温度0.5 → 橙色
    – 温度0.0 → 红色(边缘)

    步骤3:添加湍流

  • Particle Update中添加 NoiseVortex Noise(涡旋噪声)
  • 参数:
  • Noise Strength:20.0(扰动强度)
    Frequency:0.5(频率越低,火焰越柔和)
    Octaves:3(细节层数,值越大越破碎)

    步骤4:渲染优化

  • 渲染器选择 SpriteMaterial 设为半透明材质
  • 材质中:OpacityParticle Alpha 控制,边缘透明度随温度降低而增加
  • 勾选 Sort OrderSort by Distance(按距离排序,避免半透明穿插)
  • 结果:火焰会像真实火焰一样摇曳,中心亮白,外圈橙红,粒子向上飘散。

    实操小练习2:制作爆炸火焰

    1. 复制火焰Emitter,改名为“Explosion”
    2. 设置Spawn Rate为5000(一次性爆发)
    3. 在Particle Spawn中添加 Burst → 勾选 Burst Instant(瞬间爆发)
    4. 在Particle Update中添加 Scale → 大���从0.5快速增大到2.0(模拟膨胀)
    5. 添加 Color 渐变:白色→橙色→黑色(模拟燃烧后熄灭)

    三、烟:从“棉花糖”到“真实烟雾”

    3.1 烟的难点:扩散与消散

    烟雾最难的是扩散消散。很多同学做的烟像棉花糖一样聚成一团,因为忽略了涡旋密度衰减。真实烟雾在上升过程中会不断旋转、稀释,最终消失。

    3.2 实操:制作袅袅升起的烟雾

    步骤1:创建烟雾发射器

  • 新建Niagara系统 → 选择 Empty
  • Emitter设置:
  • Spawn Rate:200
    Lifetime:5.0秒(烟雾存活时间长)
    Initial Size:10.0(初始大粒子)

    步骤2:添加扩散与涡旋

  • Particle Update中添加 Vortex Noise
  • Noise Strength:30.0
    Frequency:0.2(低频让烟雾缓慢旋转)
    Scale:随时间增大(用 Particle.Age 控制)

  • 添加 Drag(阻力):
  • Drag Coefficient:0.5(模拟空气阻力,让烟雾减速)

    步骤3:密度衰减

  • Particle Update中添加 Custom Hlsl
  •   float Density = 1.0 - Particle.Age / Particle.Lifetime;
      Particle.Alpha = Density * 0.6; // 透明度随年龄增加
      Particle.Size *= 1.0 + Density * 0.5; // 大小随密度减小而增大(扩散)
      

    步骤4:渲染技巧

  • 渲染器选择 Sprite → 材质用 Unlit(不受光照,烟雾自发光)
  • 材质中:OpacityParticle Alpha 控制,Base Color 设为灰色(RGB 0.7,0.7,0.7)
  • 勾选 Blend ModeTranslucent(半透明)
  • 结果:烟雾会缓慢上升,边缘逐渐模糊,最终消散在空气中。

    实操小练习3:制作烟雾柱(像烟囱冒烟)

    1. 修改Emitter的Spawn ShapeCylinder(圆柱体,模拟烟囱口)
    2. 设置Initial Velocity的Z轴为100-200(上升速度)
    3. 在Particle Update中添加 Wind(风) → 设置X轴风向:50(让烟雾飘散)
    4. 调整Noise Strength为50.0(更强的湍流,让烟雾更自然)
    5. 观察:烟雾从圆柱体底部升起,被风吹斜,逐渐扩散消失

    四、总结与进阶建议

    今天我们通过三个案例,掌握了Niagara流体模拟的核心技巧:

  • :用Fluid Surface Renderer和Pressure Solver实现流体表面
  • :用温度场和Vortex Noise驱动粒子行为
  • :用密度衰减和涡旋模拟扩散消散
  • 下一步学习建议
    1. 深入学习HLSL:在Niagara中使用Custom Hlsl可以写出更复杂的物理规则,比如热力学模拟
    2. 尝试GPU模拟:UE5.4的GPU Particle支持更大量的粒子(10万+),适合大规模水流
    3. 研究Niagara Data Interface:可以用它读取骨骼动画或地形数据,制作角色喷火、地面岩浆等效果

    常见问题FAQ

    Q1:为什么我的水粒子会穿透地面?
    A:检查是否添加了Collision模块,并且Collision Plane的坐标正确。另外,Pressure Solver的迭代次数建议设为3-5,次数太少会导致穿透。

    Q2:火焰粒子总是飘向同一方向,不自然怎么办?
    A:在Vortex Noise中增加Random Seed的随机性,或者添加Wind模块模拟随机风向。也可以给每个粒子一个随机初始速度。

    Q3:烟雾渲染出现半透明排序错误?
    A:在渲染器设置中勾选Sort OrderSort by Distance,如果还有问题,尝试把材质Blend Mode改为Additive(叠加模式),虽然颜色会变亮,但能避免排序问题。

    Q4:粒子数量太多导致性能下降怎么办?
    A:降低Spawn Rate,同时增大粒子Size来补偿视觉效果。另外,使用LOD(细节层次)让远处粒子减少数量。

    Q5:UE5.3和5.4的Niagara有什么区别?
    A:UE5.4新增了Fluid Surface Renderer(流体表面渲染器)和Position Solver(位置解算器),这是制作水效果的关键。如果你还在用5.3,需要手动添加SPH Solver模块,但效果不如5.4流畅。

    流体模拟效果展示
    火焰温度场分布
    烟雾扩散与涡旋

    希望今天的分享能帮大家打开Niagara流体模拟的大门。记住,特效的本质是物理模拟,而不是美术堆砌。如果你在练习中遇到问题,欢迎在评论区留言,我会一一解答。

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