虚幻引擎5提供了一组用于实时模拟流体效果的工具。
该工具集专为美术师设计,包括各种基于GPU的模拟器、可复用模块和强大的数据结构,这些都可以在Niagara编辑器中使用。高级用户可以利用广泛的公开参数修改模拟,以便满足自己的需求。
流体模拟系统旨在为可用于游戏和过场动画的实时环境生成复杂的流体效果。该系统还可以用于将复杂的模拟烘焙到各种用例的图像序列视图纹理。
流体模拟的关键概念
概述
流体模拟就是通过算法生成数据来呈现气体或液体等流体的运动。该模拟数据可以表示为网格或粒子,具体取决于所使用的算法。
虚幻引擎流体模拟系统使用网格来模拟气体,并混合使用粒子和网格来模拟液体。
网格
气体模拟用网格表示,其中每个单元都包含表示该位置介质密度、温度和速度的数据。网格单元的尺寸越小,模拟的质量越高,但是质量提高的同时,计算成本会增加。
在渲染烟雾模拟时,一般是将密度网格可视化。密度越高越不透明。火模拟的功能类似,其中温度控制每个网格单元中火的颜色。在火模拟中,由于浮力,温度越高会导致气体上升得更快。
流体运动
模拟具有逼真移动效果的流体时,一个主要组成部分是"压力解算"过程。该技术涉及求解方程组,该方程组旨在确保流体正确地围绕对象流动,并产生逼真的漩涡运动。
此模拟涉及迭代过程,迭代次数越多,模拟就越准确。然而,迭代越多,计算成本越高。值得注意的是,有时"压力解算"技术会影响添加到模拟中的力并减弱力的效果。
碰撞对象
为了让流体对附近的对象做出响应,你必须首先设置"边界条件"。
为模拟设置边界条件涉及遮蔽模拟区域内对象所在的区域,确保没有流体可以占据这个空间。这些碰撞对象可以在场景中四处移动,速度用于置换它们周围的流体。
常见示例为对象掉入液体池中,在对象周围引起飞溅和涟漪。系统可以使用许多对象类型作为碰撞体,例如静态网格体、几何体集合和深度贴图。
液体
Niagara流体使用名为隐式粒子流体法(FLIP)的粒子网格混合算法来模拟液体,例如流动的水。在此系统中,流体的速度在网格上解算,然后将瞬时值送回到呈现流体形状的粒子。
请注意,液体模拟和气体模拟有几个相似之处,因此前面关于碰撞对象和流体运动的小节也适用于液体。
Niagara重要概念
所有流体模拟器均可从Niagara编辑器访问,并且能够利用各种Niagara功能。
| 注意要了解有关Niagara VFX系统的更多信息,请访问文档。|
网格数据接口
网格2D集合(Grid 2D Collection) 和 网格3D集合(Grid 3D Collection) 是分别用于在2D和3D网格中存储命名属性的数据接口。这些接口用于解算流体时所需的所有计算。
模拟阶段
对于气体模拟算法的每一步,虚幻引擎流体模拟系统可确保在进入下一步之前处理所有网格单元。该系统使用Niagara中的 模拟阶段(Simulation Stages) 来执行此操作。
在进入下一个阶段之前,每个模拟阶段都会迭代所有粒子(或由 迭代接口(Iteration Interface) 定义的网格单元)。如果迭代接口设置为 Grid3D集合(Grid3D Collection)(或2D变体),它将能够使用命名空间 Emitter.
有关如何在堆栈中设置 Emitter.SimGrid.Velocity 的示例,请参阅下面的屏幕截图。

你可以限制模拟阶段的数量,从而优化性能。请注意,你可以在进入下一阶段前多次运行模拟阶段,只要修改该阶段的 迭代(Iteration) 属性即可。
可复用模块
许多流体行为在模块中定义,可以在Niagara系统堆栈中移动。一些模块用于2D、3D、气体和液体模拟器,并且通常编写得非常通用。高级用户可以修改或替换各种模块,从而修改核心流体解算器行为。
用户参数
某些系统(例如 Grid3D_Flip_Pool)使用用户参数在Actor本身的大纲视图中公开功能。你可以修改各种流体属性,例如水位高度、碰撞速度乘数和模拟分辨率。
模拟器类型
2D气体
这是一种气体模拟,流动仅发生在二维空间中。这种模拟通常比3D模拟快得多,最适合用于游戏和实时模拟。然而,这种模拟通常缺乏3D模拟支持的复杂湍流。
需要注意的是,3D对象可以与2D模拟交互。这些类型的模拟可以设置为始终面向摄像机并模拟3D行为。这通常用于创建火炬或其他需要深度的火焰效果。
3D气体
这是最常见的气体模拟类型。与2D气体相比,3D气体需要使用更高的内存和GPU成本模拟深度和更复杂的流。
这种类型的模拟器最适合用于实时应用程序中的英雄特效和过场动画。结果也可以烘焙到纹理中,以便实时提高性能。
2D翻转
2D翻转会确定3D粒子的瞬时值并生成2D模拟域,在该域中解算压力并应用FLIP算法来更新粒子。通常,域与摄像机对齐,支持复杂的3D外观流,但使用的是2D流体力。此功能可用于模拟令人信服的飞溅效果,但不适用于水池。
浅水
与2D翻转不同,浅水(Shallow Water)可用于模拟没有多少飞溅效果的水池。这在模拟船尾波或模拟物体在水中移动时形成的简单交互非常有用。
3D翻转
3D翻转模拟是强大的液体模拟,能够模拟各种效果,例如海滩上的波浪、河流和复杂的对象交互。请注意,这些复杂模拟的计算成本可能很高。
控制模拟
| 注意有关更多细节,请参阅《流体模拟参考指南》。|
Niagara流体模拟包括各种参数、模块和预配置系统,而这些系统控制Niagara编辑器中的模拟生成方式。本指南总结了最常见的要点。
质量(Quality)
最大轴的最大单元数(Num Cells Max Axis) 参数控制世界空间中沿模拟域最大轴的最大单元数。
压力迭代(Pressure Iterations) 参数描述了模拟中的迭代次数。数字越大,流越准确。对于液体,该值通常更高。
寻源(Sourcing)
Grid3D_Gas_ParticleSource 系统通常用于气体模拟,因为粒子通常用于将值标记到模拟网格中。
力(Forces)
有几个Niagara模块可用于生成力来控制流体模拟。对于FLIP模拟,粒子更新(Particle Update) 可以用于修改流体行为。
碰撞(Collision)
对于3D模拟,Grid3D_ComputeBoundary 模块包含所有碰撞选项。该模块可以配置3D气体或液体与对象之间的碰撞,例如静态网格体距离场、物理资产、几何体集合、深度缓冲区和地形。
渲染
气体
光源烘焙(Light Baking)
使用烘焙光照的气体模拟通过将阴影烘焙到网格中实现自投影。然后,将此数据传递给材质进行渲染。
在3D气体模拟中,查看各种参数的计算光照模拟阶段。可以在 网格3D烘焙定向光源(Grid 3D Bake Directional Light) 和 网格3D烘焙点光源(Grid 3D Bake Point Light) 模块内修改这些参数。
光线步进着色器(Ray Marching Shaders)
对于使用光线步进着色器的气体模拟,系统将渲染流体边界框,并使用位于NiagaraFluidsContent文件夹中的光线步进着色器,例如 M_RayMarch_Fire。
自定义HLSL 光线步进体积(Raymarch Volume) 将定义着色器如何计算给定光线步进的光源亮度、散射和消光。质量由材质实例中的 步长倍数(Step Size Mult) 参数控制。
液体
表面化(Surfacing)
液体最好呈现为表面,但液体被模拟为点。该系统在FLIP发射器的填充光栅化网格模拟阶段将粒子转换为有向距离场。
球体追踪(Sphere Tracing)
该系统将使用球体追踪,根据距被模拟液体表面的有向距离场的距离来调整光线步进的步长。
M_WaterSDF 材质将使用这种技术以及 单层水(Single Layer Water) 着色模型来模拟流体表面。