Niagara 流体模拟实战:水、火、烟的真实感制作技巧
上周有位学员发来一段作品,水花像碎玻璃,火焰像静态贴图,烟雾像棉花糖。这是很多 UE5 初学者的通病——Niagara 粒子系统参数调了一大堆,但真实感就是出不来。问题不在参数数量,而在对流体物理本质的理解。今天我用三个实战案例,把水、火、烟的真实感制作逻辑拆开讲透。
—
一、水的真实感:从“碎玻璃”到“液态流体”
1.1 核心痛点:粒子行为缺乏表面张力
水的视觉真实感取决于两个关键点:表面张力和碰撞响应。很多学员直接用 Niagara 自带的“Water”模板,但默认参数下粒子之间几乎没有相互作用力,导致水花散开后无法回缩成水滴。
操作步骤(UE5.4 版本,使用 Niagara Fluids 插件):
1. 创建 Niagara 系统,选择“Fluid Simulation”模板(需提前在 Edit→Plugins 中启用 Niagara Fluids 插件)。
2. 在“Fluid Simulation”模块中,将 Grid Size 设为 `128x128x128`(网格越大,细节越多,但性能消耗也大)。
3. 关键参数调整:
– Viscosity(粘度):设为 `0.5`(水在 20℃ 时粘度约 0.001 Pa·s,但游戏里为了视觉效果需调高)
– Surface Tension(表面张力):设为 `2.0`(默认 0.5 会导致水花无法回缩)
– Rest Density(静止密度):设为 `1000.0`(对应真实水的密度)
4. 在“Emitter”模块中,将 Spawn Rate 设为 `500` 粒子/秒,Lifetime 设为 `3.0` 秒。
效果验证: 播放时观察水花溅落到地面后,粒子应快速聚拢成球状水滴,而非散开成雾状。如果仍像碎玻璃,检查 Surface Tension 是否低于 1.0。
1.2 进阶技巧:用“Vortex”模块模拟漩涡
真实水流遇到障碍物会产生旋转,Niagara 的“Vortex”模块可以模拟这种涡流效应。
1. 在 Niagara 系统的“Particle Update”阶段添加 Vortex 模块。
2. 参数设置:
– Vortex Strength:`50.0`(强度过高粒子会飞散)
– Radius:`30.0`(单位是厘米,对应实际场景尺寸)
– Falloff:`2.0`(指数衰减,让外围粒子受影响更小)
3. 将 Vortex 的中心位置绑定到场景中的障碍物(如岩石或管道),通过 User Exposed 暴露位置参数。
—
二、火的真实感:从“静态贴图”到“动态燃烧”
2.1 核心痛点:火焰缺乏分层结构
学员常犯的错误是只用一张火焰贴图做粒子,导致火焰看起来像平面剪纸。真实火焰至少有三层结构:内焰(蓝色/白色)、外焰(橙色/红色)、烟尘(黑色)。Niagara 的“Color Over Life”模块只能做线性渐变,无法模拟这种立体分层。
操作步骤(UE5.4,使用 Niagara 粒子系统 + 自定义材质):
1. 创建 Niagara 系统,选择“Empty”模板。
2. 在“Particle Spawn”阶段添加 Sphere Location 模块,半径设为 `10.0` 厘米(火焰底部宽度)。
3. 在“Particle Update”阶段添加 Drag 模块,设为 `0.3`(让火焰上升时有空气阻力)。
4. 关键步骤:创建材质函数模拟火焰分层。
– 新建材质函数 `MF_FlameLayers`
– 输入参数:`ParticleAge`(粒子年龄)、`ParticleLife`(粒子生命周期)
– 输出:`BaseColor`、`Opacity`
– 逻辑:用 `Age/Life` 计算粒子在火焰中的位置,顶部(Age接近Life)输出橙色(RGB: 1.0, 0.5, 0.0),底部(Age接近0)输出蓝色(RGB: 0.2, 0.5, 1.0),中间用 `SmoothStep` 混合。
5. 在 Niagara 的“Render”模块中,将材质设为上述函数生成的动态材质实���。
2.2 特殊效果:用“Noise”模块模拟火焰跳动
火焰的不规则跳动来自风力和燃料分布不均,Niagara 的“Noise”模块可以模拟这种随机性。
1. 在“Particle Update”阶段添加 Noise 模块。
2. 参数设置:
– Noise Strength:`(30.0, 50.0, 10.0)`(X轴横向摆动,Y轴纵向摆动,Z轴垂直方向影响小)
– Frequency:`0.5`(频率越低,摆动越平滑,适合火焰)
– Octaves:`3`(层数越多,细节越丰富,但性能消耗增加)
3. 将 Noise 模块的 Update Mode 设为 `Continuous`,这样火焰会持续随机摆动。
—
三、烟的真实感:从“棉花糖”到“体积散射”
3.1 核心痛点:烟雾缺乏体积感
烟雾的真实感来自光线在粒子群中的多次散射。默认的 Niagara 粒子渲染是平面透明,无法模拟这种效果。解决方案是使用 Volume Rendering 结合 Custom HLSL 节点。
操作步骤(UE5.4,使用 Niagara 粒子系统 + 体积渲染材质):
1. 创建 Niagara 系统,选择“Smoke”模板(UE5.4 自带)。
2. 在“Particle Spawn”阶段,将 Initial Size 设为 `(50.0, 50.0, 50.0)` 厘米(烟雾粒子初始大小)。
3. 在“Particle Update”阶段添加 Scale Over Life 模块:
– Scale Curve:从 1.0 到 5.0(烟雾扩散时体积增大)
– Curve Type:`Exponential`(真实烟雾扩散符合指数规律)
4. 关键步骤:创建体积渲染材质。
– 新建材质,Shading Model 设为 `Unlit`,Blend Mode 设为 `Additive`。
– 在材质中添加 Custom HLSL 节点,输入以下代码(模拟单次散射):
float3 lightDir = normalize(float3(1.0, 1.0, -1.0)); // 平行光方向
float3 viewDir = normalize(CameraVector);
float phase = (1.0 - 0.5 dot(lightDir, viewDir)) / (4.0 3.14159); // Henyey-Greenstein 相位函数
return float4(phase 0.8, phase 0.6, phase * 0.4, 1.0); // 烟的颜色偏灰
– 将输出连接到 Emissive Color 和 Opacity。
3.2 高级技巧:用“Vortex”+“Noise”模拟烟雾翻滚
烟雾的翻滚效果是真实感的关键,单纯用 Noise 模块无法形成卷曲。
1. 在“Particle Update”阶段同时添加 Vortex 和 Noise 模块。
2. Vortex 参数:
– Vortex Strength:`20.0`
– Radius:`100.0` 厘米
– Axis:`(0.0, 0.0, 1.0)`(沿 Z 轴旋转)
3. Noise 参数:
– Noise Strength:`(10.0, 10.0, 5.0)`
– Frequency:`0.2`
4. 将两个模块的顺序调整为:先执行 Noise 产生随机扰动,再执行 Vortex 产生旋转,这样烟雾会形成“翻滚上升”��效果。
—
总结与进阶建议
水、火、烟的真实感制作,本质上是对物理规律的艺术化模拟。你需要理解三个核心参数:
- Viscosity(粘度):控制流体内部摩擦力
进阶学习路径:
1. 掌握 Niagara 的 Data Interface(如 Grid2D、VolumeTexture),这是实现复杂流体模拟的基础。
2. 学习 Custom HLSL 编写,很多高级效果(如次表面散射、焦散)都需要手写 Shader。
3. 关注 UE5.5 的 Fluid Simulation 2.0 更新,新版本增加了 SPH 算法支持,能大幅提升流体真实感。
—
常见问题 FAQ
Q1:为什么我的流体模拟粒子数量一多就卡顿?
A:检查 Grid Size 是否过高(建议不超过 128x128x128),同时降低粒子 Lifetime(不超过 3 秒)。如果仍卡顿,将 Render 模块的 Sort Mode 改为 `None`(关闭排序可提升 30% 性能)。
Q2:火焰颜色怎么调都不像真实火焰?
A:真实火焰颜色取决于温度分布。在材质中使用 `ParticleAge / ParticleLife` 作为温度参数,低温区(0.0-0.3)输出蓝色,中温区(0.3-0.7)输出橙色,高温区(0.7-1.0)输出白色。不要在材质中直接使用固定颜色。
Q3:烟雾粒子边缘有锯齿怎么办?
A:在材质中将 Opacity 设为平滑衰减。使用 `1.0 – abs(ParticleAge / ParticleLife – 0.5) * 2.0` 计算不透明度,让粒子边缘自然淡出。同时开启材质的 Two Sided 选项。
Q4:我的水花溅到地面后直接消失,没有溅射效果?
A:检查 Collision 模块的 Restitution(弹性系数),设为 `0.5` 以上才能产生溅射。同时确保 Collision Mode 设为 `Surface`(而非 `Volume`),否则粒子会穿透地面。
Q5:如何让多个流体系统(如火+烟)协同工作?
A:使用 Niagara 的 System State 功能。在火焰系统中暴露一个 `float SpawnSmoke` 参数,当火焰粒子 Lifetime 超过 0.7 时,通过 Event Handler 触发烟雾系统的粒子生成。这样火焰燃烧后期会自动产生烟雾,无需手动控制。

评论(0)