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

上周刚结束的UE5特效进阶班上,一位学员盯着自己做的瀑布特效问我:“老师,为什么我的水看起来像塑料片?用了Niagara的Fluid模块,但粒子完全没流动感。”这个问题其实戳中了很多特效师的痛点——不是不知道Niagara有流体功能,而是不知道如何让流体“活”起来。

今天这篇文章,我们就用UE5.4版本(当前最新稳定版)的Niagara系统,拆解水、火、烟三种常见流体的真实感制作逻辑。我会直接给参数、给步骤、给避坑指南,不绕弯子。

一、水的真实感:从“塑料片”到“动态流体”

核心问题:为什么会像塑料片?

很多新手用Niagara做水时,直接拖入`Fountain`模板,然后调高粒子数量。但这样做出来的水,每个粒子都是独立的球体,没有“水体”的连续感。真实的水流有表面张力、有流动方向、有碰撞反馈。

实操案例:瀑布水流

步骤1:创建基础流体发射器

打开Niagara系统编辑器,新建`NiagaraEmitter`,选择`Fluid`模板(UE5.4路径:`FX > Niagara > Templates > Fluid`)。这里注意:不要选`Simple`或`Sprite`模板,它们无法启用流体模拟的物理约束。

在`Emitter Properties`中设置:

  • `Sim Target`:`GPU Compute Sim`(必须选GPU,CPU无法实时计算流体交互)
  • `Allocation Mode`:`Manual`,`Max Particles`设为`50000`(根据硬件调整,RTX 3060可跑8万粒子)
  • `Fluid Simulation`:启用`Enable Fluid`,`Fluid Grid Size`设为`128x128x64`(网格精度影响流体细节,但不要超过256,否则帧率会崩)
  • 步骤2:配置流体物理参数

    在`Fluid Simulation`模块下,找到`Fluid Parameters`:

  • `Viscosity`:`0.5`(水的粘度通常在0.3-0.7之间,数值越大越粘稠,瀑布需要低粘度保持流动感)
  • `Surface Tension`:`0.8`(关键参数!默认0.0会让水变成雾状,提高到0.6以上才会形成表面张力,产生水花飞溅效果)
  • `Buoyancy`:`0.0`(水不需要浮力,设为0)
  • `Gravity`:`(0, 0, -980)`(UE默认重力的100倍,因为流体模拟需要更强的力来驱动粒子)
  • 步骤3:添加流动方向控制

    在`Particle Spawn`阶段添加`Add Velocity`模块:

  • `Velocity`:`(0, 0, -500)`(持续向下流动)
  • `Random Velocity`:`(50, 50, 20)`(给粒子初始随机速度,模拟水流湍急感)
  • 在`Particle Update`阶段添加`Fluid Force`模块:

  • `Force Mode`:`Directional`,`Force`:`(0, 0, -200)`(持续向下拉力)
  • `Turbulence`:`0.3`(湍流强度,0.1-0.5之间,数值越大水流越乱)
  • 步骤4:材质与渲染设置

    新建`Material`,材质域设为`Surface`,混合模式`Translucent`。核心节点:

  • `Particle Color`:`(0.2, 0.5, 0.8, 0.6)`(半透明蓝色)
  • `Opacity`:用`Particle Alpha`控制,但需要连接`Custom`节点,公式:`1 – saturate(length(WorldPosition – CameraPosition) * 0.01)`(让近处透明、远处半透明,模拟水体深度)
  • `Roughness`:`0.1`(水的高光反射)
  • 回到Niagara,在`Renderer`中设置`Material`为刚才创建的材质,`Blend Mode`选`AlphaComposite`。

    水的流体网格参数设置

    避坑提示:如果水花飞溅时出现“方块状”粒子,说明`Fluid Grid Size`精度不够。可以尝试`256x128x64`,或者降低`Surface Tension`到`0.6`,让表面张力稍弱,粒子更容易分散。

    二、火焰的动态燃烧:粒子与流体混合

    为什么火焰不能只用Sprite粒子?

    纯Sprite粒子做的火焰,旋转视角时会有“纸片感”。真实火焰是体积气体,有上升涡旋、有内外温差、有燃料燃烧的随机性。我们需要用Niagara的`Fluid`模块模拟热气流,同时用`Sprite`粒子做火焰核心。

    实操案例:篝火火焰

    步骤1:创建双层发射器

    在Niagara系统中新建两个发射器:

  • 发射器A(火焰核心):`Sprite`模板,负责火焰的亮部
  • 发射器B(热气流):`Fluid`模板,负责火焰的形态和上升运动
  • 发射器A参数:

  • `Spawn Rate`:`200`(每秒200个粒子)
  • `Lifetime`:`0.5-1.5`秒(随机范围)
  • `Initial Size`:`(5, 5)`到`(20, 20)`(随机)
  • `Color`:随时间从`(1.0, 0.8, 0.2)`渐变到`(0.8, 0.1, 0.0)`
  • `Opacity`:初始1.0,生命末期降为0.0
  • 发射器B参数:

  • `Fluid Grid Size`:`64x64x32`(火焰区域小,精度可以降低)
  • `Viscosity`:`0.1`(热空气粘度低)
  • `Buoyancy`:`2.0`(正浮力,让热气流上升)
  • `Gravity`:`(0, 0, 50)`(轻微向下抵消浮力,避免火焰无限上升)
  • 步骤2:用流体驱动粒子运动

    关键技巧:让发射器A的粒子位置受发射器B的流体场影响。

    在发射器A的`Particle Update`阶段添加`Fluid Query`模块:

  • `Fluid Source`:选择发射器B
  • `Query Mode`:`Velocity`(获取流体速度向量)
  • `Scale`:`1.5`(放大速度影响,让粒子跟随热气流)
  • 这样,火焰核心的Sprite粒子就会随着热气流上升、旋转,形成自然的涡旋。

    步骤3:颜色与光照

    火焰的颜色需要动态调整。在发射器A的`Particle Spawn`阶段添加`Color Over Life`模块:

  • 曲线:起点`(1.0, 0.6, 0.1)`,中点`(1.0, 0.2, 0.0)`,终点`(0.3, 0.0, 0.0)`
  • 透明度曲线:起点1.0,终点0.0(火焰边缘消散)
  • 想要火焰照亮周围环境?在`Renderer`中启用`Light`选项:

  • `Light Intensity`:`500`
  • `Light Color`:`(1.0, 0.6, 0.2)`
  • `Attenuation`:`500`(光照范围)
  • 火焰粒子与流体场交互效果

    进阶技巧:添加`Noise`模块到流体发射器,让热气流产生随机扰动。在`Fluid Simulation`模块下找到`Noise`:

  • `Noise Strength`:`0.3`
  • `Noise Scale`:`10`(数值越小,扰动越细碎)
  • `Noise Frequency`:`2.0`(频率越高,变化越快)
  • 三、烟雾的衰减与消散:体积感的核心

    烟雾为什么容易变成“棉花糖”?

    烟雾的难点在于:它需要同时保持体积感,又要有消散的透明感。很多特效师用大量Sprite粒子堆叠,结果看起来像一团实心棉花糖。正确做法是用`Fluid`模块模拟烟雾的扩散,配合`Volume`渲染器。

    实操案例:爆炸烟雾

    步骤1:创建体积烟雾发射器

    新建`Fluid`模板发射器,关键设置:

  • `Fluid Grid Size`:`128x128x128`(烟雾需要三维扩散,网格必须立方体)
  • `Viscosity`:`0.8`(烟雾粘度高,扩散慢)
  • `Buoyancy`:`1.5`(热烟雾上升)
  • `Gravity`:`(0, 0, -50)`(轻微向下,模拟烟雾下沉)
  • `Diffusion`:`0.2`(扩散系数,控制烟雾向外扩散速度)
  • 步骤2:动态衰减控制

    在`Particle Update`阶段添加`Scalar Field`模块:

  • `Field Type`:`Density`(密度场)
  • `Initial Density`:`1.0`(初始浓度)
  • `Decay Rate`:`0.5`(每秒衰减50%,控制烟雾消散速度)
  • 添加`Temperature`模块:

  • `Initial Temperature`:`500`(高温烟雾)
  • `Cooling Rate`:`100`(每秒降温100度,温度下降后烟雾会下沉)
  • 步骤3:渲染为体积

    在`Renderer`中选择`Volume`渲染器(不是Sprite!):

  • `Material`:新建体积材质,材质域设为`Surface`,混合模式`Additive`
  • `Density Scale`:`5.0`(密度缩放,数值越大烟雾越浓)
  • `Albedo`:`(0.6, 0.6, 0.6)`(灰色烟雾)
  • `Extinction`:`1.0`(消光系数,控制光线穿透深度)
  • 步骤4:添加扰动

    在`Fluid Simulation`模块下添加`Vorticity`:

  • `Vorticity Strength`:`0.8`(涡旋强度,��烟雾产生翻滚效果)
  • `Vorticity Scale`:`20`(涡旋尺寸)
  • 烟雾体积渲染参数

    性能提示:体积渲染非常消耗性能。如果帧率下降,可以:
    1. 降低`Fluid Grid Size`到`64x64x64`
    2. 在`Volume`渲染器中启用`Half Resolution`(半精度渲染)
    3. 限制粒子数量,`Max Particles`设为`30000`

    总结与进阶建议

    核心原则回顾

    1. :低粘度(0.3-0.5)+ 高表面张力(0.6-0.8)+ 重力驱动
    2. :双层结构(Sprite核心 + Fluid热气流)+ 浮力 + 噪声扰动
    3. :高粘度(0.8-1.0)+ 密度衰减 + 体积渲染 + 涡旋

    进阶学习路径

    如果这篇文章的内容你已经掌握,下一步可以挑战:

    1. 流体与场景交互:用`Fluid Collision`模块让水流撞击岩石后产生飞溅
    2. 多流体混合:在一个Niagara系统中同时模拟水和烟雾(比如蒸汽)
    3. 材质深度定制:用`Custom HLSL`写粒子着色器,实现次表面散射效果

    推荐学习资源:UE官方文档的`Niagara Fluids`章节、YouTube频道`UnrealFX`的实战案例。

    常见问题 FAQ

    Q1:我的显卡是RTX 2060,能跑流体模拟吗?
    A:可以,但需要控制粒子数量。建议`Max Particles`不超过30000,`Fluid Grid Size`不超过64x64x64。如果卡顿,在Niagara编辑器中启用`Simulation > Performance > Low Resolution`。

    Q2:流体粒子为什么总是穿透地面?
    A:检查`Collision`模块设置。在`Particle Update`阶段添加`Collision`,`Collision Mode`选`Physics`,`Restitution`设为0.2(弹力),`Friction`设为0.8(摩擦力)。注意:流体模拟需要启用`Fluid Collision`,而不是普通碰撞。

    Q3:火焰的颜色怎么调出蓝色?
    A:在`Color Over Life`模块中,将起点颜色改为`(0.2, 0.5, 1.0)`,终点改为`(0.0, 0.2, 0.8)`。同时降低`Temperature`初始值到200,因为蓝色火焰温度更高(现实中蓝色火焰温度约1500°C,但UE中温度值只是相对参数)。

    Q4:烟雾消散得特别慢,怎么调整?
    A:增大`Decay Rate`数值。如果当前是0.5,改为1.0会让烟雾衰减速度翻倍。同时检查`Diffusion`,如果数值太大,烟雾会扩散到整个场景,看起来消散慢。建议`Diffusion`不超过0.3。

    Q5:Niagara流体能用于VR项目吗?
    A:目前不建议。流体模拟需要GPU计算,VR需要双视角渲染(每帧渲染两次),性能压力过大。如果必须用,建议将粒子数量控制在5000以内,并启用`Fixed Frame Rate`锁定30fps。

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