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

上周有位学员在群里发了一段视频:瀑布从悬崖跌落,水花四溅,但粒子像塑料球一样弹跳,毫无真实感。他问:“为什么我的 Niagara 流体看起来像弹珠游戏?”这个问题很典型——很多人在 UE5 里做流体特效时,只关注粒子数量,却忽略了物理参数和渲染细节。今天,我就用三个经典案例(水、火、烟)拆解 Niagara 流体模拟的核心技巧,帮你从“粒子堆砌”升级到“真实流体”。

一、水:从瀑布到水花,用“约束”打破塑料感

1.1 问题根源:为什么你的水像弹珠?

默认的 Niagara 发射器(版本:UE5.3)粒子之间没有碰撞约束,它们只是独立运动的小球。真实的水分子之间有粘滞力和表面张力,所以水流会聚拢、飞溅时会拉伸成丝状。解决方案是引入 Fluid Simulation 模块。

1.2 实操:制作瀑布水流

步骤1:创建 Niagara 系统

  • 新建 `NiagaraSystem`,选择 `Empty` 模板。
  • 添加 `Grid Simulation Stage` 模块(版本5.3后改名为 `Fluid Simulation`)。
  • 设置网格分辨率:`Grid Resolution` 设为 `{X:64, Y:32, Z:128}`(瀑布高度方向Z轴分辨率要够)。
  • 步骤2:配置流体参数

  • 在 `Fluid Simulation` 模块中,关键参数:
  • – `Viscosity`(粘度):0.5(水约0.3-0.8,数值越大越粘稠)。
    – `Surface Tension`(表面张力):0.2(让水自动聚拢成束)。
    – `Gravity`:`(0,0,-980)`(UE默认单位是cm/s²)。

  • 打开 `Enable Vorticity`(涡度),设为0.8,让水流产生旋转细节。
  • 步骤3:粒子发射与渲染

  • 在 `Emitter State` 中,`Spawn Rate` 设为5000(瀑布需要大量粒子)。
  • 渲染用 `Sprite Renderer`,材质选择 `M_Water`(引擎自带的水材质,需要设置 `Opacity` 为0.3,并启用 `Subsurface Color` 模拟半透明)。
  • 关键一步:在 `Particle Spawn` 阶段添加 `Set Fluid Velocity` 模块,初始化速度 `(0,0,-500)` 让粒子向下流动。
  • 瀑布流体模拟网格显示

    1.3 进阶:水花飞溅的“二次发射”

    瀑布底部的水花需要更小的粒子模拟飞溅。方法:

  • 在 `Update` 阶段添加 `Spawn Burst` 模块,条件设为 `Particle Age > 1.0` 且 `Velocity Z > 200`(速度向上时触发)。
  • 子粒子用 `Point Renderer`,尺寸随机 0.5-2.0,生命周期 0.3-0.8秒,模拟水珠。
  • 二、火:从火焰到烟雾,用“温度场”控制形态

    2.1 真实火焰的物理逻辑

    火焰不是简单的粒子上升,而是燃料燃烧产生热气流,带动粒子向上并产生湍流。核心是 Temperature Field(温度场)和 Buoyancy(浮力)。

    2.2 实操:篝火火焰效果

    步骤1:创建火焰系统

  • 新建 `NiagaraSystem`,添加 `Fluid Simulation` 网格,分辨率 `{X:32, Y:32, Z:64}`(火焰纵向分辨率为主)。
  • 在 `Emitter State` 中,`Spawn Rate` 设为2000,生命周期 1.5-3.0秒。
  • 步骤2:温度与浮力配置

  • 在 `Fluid Simulation` 模块中,关键参数:
  • – `Temperature Diffusion`(温度扩散):0.1(数值小则火焰集中)。
    – `Buoyancy`(浮力):2.5(热空气上升强度)。
    – `Vorticity`:1.2(火焰的翻滚感)。

  • 添加 `Set Fluid Temperature` 模块:在粒子生成时,将 `Temperature` 设为 `1000 + RandomRange(-200,200)`(中心温度高,边缘低)。
  • 步骤3:颜色与形状控制

  • 在 `Update` 阶段,用 `Map Range` 将 `Temperature` 映射到颜色:
  • – 高温(>800):`(1.0, 0.3, 0.0)` 橙红色。
    – 中温(400-800):`(0.8, 0.1, 0.0)` 暗红色。
    – 低温(<400):`(0.2, 0.0, 0.0)` 黑色(模拟烟雾)。

  • 渲染用 `Sprite Renderer`,材质 `M_Fire`(需启用 `Additive` 混合模式,并基于温度调整 `Opacity`)。
  • 火焰温度��与颜色映射

    2.3 细节:火焰的“呼吸”与“卷吸”

  • 在 `Update` 阶段添加 `Noise` 模块,`Noise Strength` 设为0.3,`Frequency` 0.5,让火焰边缘不规则。
  • 添加 `Drag` 模块,`Drag Coefficient` 设为0.1(空气阻力),让火焰顶部更扩散。
  • 三、烟:从浓烟到消散,用“密度场”模拟扩散

    3.1 烟雾的物理特性

    烟雾是大量微小颗粒悬浮在空气中,受重力影响小,但受空气扰动明显。核心是 Density Field(密度场)和 Diffusion(扩散)。

    3.2 实操:爆炸后的浓烟

    步骤1:创建烟雾系统

  • 用 `Grid Simulation Stage`,分辨率 `{X:64, Y:64, Z:64}`(立体扩散需要各向同性)。
  • `Emitter State` 设为 `Burst` 模式,一次发射5000粒子,生命周期 5-10秒。
  • 步骤2:密度与扩散配置

  • 在 `Fluid Simulation` 模块:
  • – `Density Diffusion`:0.05(烟雾扩散速度,数值大则消散快)。
    – `Buoyancy`:0.3(烟雾轻微上升,数值小则平铺)。
    – `Vorticity`:0.8(模拟空气湍流)。

  • 添加 `Set Fluid Density` 模块:初始化 `Density` 为 `1.0`(最大浓度)。
  • 步骤3:渲染优化

  • 渲���用 `Volume Renderer`(体积渲染,支持透明度混合),材质 `M_Smoke`(需启用 `Unlit` 和 `Translucent`)。
  • 在材质中,将 `Density` 映射到 `Opacity`:`Opacity = saturate(Density * 2.0)`(浓度高时更不透明)。
  • 关键技巧:添加 `Wind` 力场模块,`Wind Velocity` 设为 `(100, 50, 20)`,让烟雾向一个方向飘散。
  • 烟雾密度场与体积渲染

    3.3 进阶:烟雾的“分层”效果

    真实烟雾有内部浓、外部淡的层次感。方法:

  • 在 `Update` 阶段,用 `Curl Noise` 模块(卷曲噪声)扰动粒子位置,`Noise Amplitude` 0.5,`Frequency` 0.3。
  • 添加 `Scale Color` 模块:根据粒子 `Distance to Center` 调整透明度,中心 `Opacity 0.8`,边缘 `0.2`。
  • 四、总结与进阶建议

    4.1 核心要点回顾

  • :靠 `Viscosity` 和 `Surface Tension` 约束粒子,二次发射模拟水花。
  • :用 `Temperature` 驱动 `Buoyancy`,颜色映射区分火焰与烟雾。
  • :`Density Diffusion` 控制消散速度,`Volume Renderer` 提升体积感。
  • 4.2 进阶学习路径

    1. 掌握网格分辨率与性能平衡:网格分辨率越高,细节越丰富,但计算量指数级增加。建议从 `32^3` 开始,逐步上调。
    2. 学习自定义力场:用 `Blueprint` 或 `Niagara` 的 `Force` 模块添加风、重力场,模拟复杂环境。
    3. 尝试 GPU 模拟:在 `Niagara System` 属性中启用 `GPU Compute`,利用显卡并行计算,支持更高分辨率(如 `128^3`)。
    4. 结合 AIGC 生成纹理:用 Stable Diffusion 生成火、烟、水的纹理贴图(如法线贴图),提升渲染细节。

    常见问题 FAQ

    Q1:我的流体模拟跑起来很卡,怎么优化?
    A:降低网格分辨率(从64^3降到32^3),减少粒子数量(从10000降到3000),关闭不必要的模块(如 `Vorticity` 可改为手动噪声)。

    Q2:为什么我的水没有飞溅效果?
    A:检查是否添加了 `Spawn Burst` 模块,且触发条件里的速度阈值是否合理(建议 `Velocity Z > 150`)。另外,子粒子的生命周期要短(0.2-0.5秒)。

    Q3:火焰颜色总是偏黄,怎么调成蓝色?
    A:在 `Map Range` 中降低温度映射范围。蓝色火焰温度更高(>1500°C),将 `Temperature` 映射到 `(0.2, 0.5, 1.0)` 即可。

    Q4:烟雾的密度场总是瞬间消散,怎么办?
    A:减小 `Density Diffusion` 值(如从0.05降到0.01),同时增大 `Density` 初始值(设为2.0)。另外,`Buoyancy` 设小(0.1)让烟雾更集中。

    Q5:Niagara 流体模拟和 Houdini 比有什么优劣?
    A:Niagara 优势是实时渲染、与 UE5 无缝集成,适合游戏和实时交互;Houdini 优势是离线模拟精度极高,适合影视级特效。建议中小型项目用 Niagara,大型项目用 Houdini 导出缓存。

    如果你在练习中遇到具体问题,欢迎在评论区留言,我会挑选典型问题在下期文章中详细拆解。记住:流体模拟没有“万能参数”,只有通过反复调整 `Viscosity`、`Buoyancy`、`Diffusion` 这三个核心参数,才能找到最适合你场景的“手感”。

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