Unreal中的烟雾火焰流体模拟
- 作者:admin
- /
- 时间:2019年01月24日
- /
- 浏览:4239 次
- /
- 分类:博物纳新
前言
前几周介绍了Unreal引擎中集成的Nvidia GameWorks游戏开发工具Flex。本周继续给大家介绍其中另一个流体模拟工具Flow。Nvidia Flow是一个基于GPU的实时流体模拟工具,它采用了动态网格的方式模拟流体的运动以及物理碰撞等效果。在模拟过程中,它利用了D3D 11中的Volume Tiled Resources实现动态网格模拟。然后,采用Ray Marching以及Color Map等方法对该Volume进行绘制。因此,它能实时地模拟火焰、烟雾等流体与场景中实体交互的逼真效果。
开源库链接:
https://lab.uwa4d.com/lab/5b85680302004fb65975d352
下图显示了在Unreal引擎中使用Flow模拟的各种效果:
(1)烟雾与物体碰撞交互

(2)F形状的火焰

(3)燃料逐渐燃烧

(4)烟雾产生的自阴影

使用方法
在Unreal引擎中使用Flow插件非常容易。首先需要将NvFlow的插件集成好,并在Unreal引擎的Plugins设置中开启它:

然后,即可在工程中使用该插件的功能。本文以Unreal引擎中的默认场景为例,介绍Flow的使用方法。使用Flow制作流体时,需要使用两种特殊的Component:FlowGridComponent以及FlowEmitterComponent。
2.1 FlowGridComponent
Grid是上文中提到的动态网格,它是Flow工具中用来模拟动态流体的结构。FlowGridComponent则是用于在场景中设置Grid所占区域体的大小以及Grid分辨率的组件。使用FlowGridComponent需要先创建FlowGridAsset。创建方式如下图所示:

双击FlowGridAsset即可打开编辑器进行设置:

如上图所示,在FlowGridAsset中可以设置Grid的大小、分辨率、使用内存以及粒子相关的参数。参数的具体含义读者可参考官方文档,本文不再赘述。在默认情况下,FlowGridAsset的设置可以用于模拟火焰的效果。然后将该资源拖入场景,即可在场景中创建相应的FlowGridActor。选中该Actor可以看到其包含的Grid所占场景的范围:

如上图所示,蓝色方框即为场景中FlowGridActor有效范围的可视化结果。
2.2 FlowEmitterComponent
Emitter是场景中的粒子发射器,发射出的粒子会通过Grid进行运动的计算和模拟。使用FlowEmitterComponent需要先在场景中创建一个静态模型,然后通过添加蓝图脚本创建蓝图资源:

然后,对该蓝图资源添加FlowEmitterComponent:

并将该StaticMeshComponent的碰撞预设值改为Custom,同时将Flow那一类型的碰撞设置为Overlap:

最后,将该蓝图拖入场景即可。在控制台中输入FlowVis,还可以查看运行时Grid的使用情况:

性能测评
Flow由于需要D3D 11的支持,因此目前仅支持PC端的应用。我们利用UWA的性能测评工具对其进行了测试。测试设备参数如下:
CPU:Intel(R) Core(TM) i7-6700HQ
GPU:NVIDA Geforce GTX 1070
OS:Windows 10
本文一共测试了Nvidia Flow Sample工程中的10个场景。在测试设备上,测试场景的总体性能良好,CPU耗时很低:

由上图可知主线程耗时相对较低,渲染线程耗时相对较高。而通过渲染线程的耗时堆栈可以发现,其主要耗时是在等待GPU渲染结束:

由此可见该工具在计算模拟时CPU端耗时很少,主要耗时是在GPU端。
总结
本文对NVIDIA GameWorks Flow在Unreal引擎中的使用进行了介绍。并对其性能进行测评和分析。该工具利用了GPU对流体进行模拟,因此其CPU端耗时很低,非常适合PC端使用。由于该流体模拟利用了D3D 11的API,目前该功能也只能在PC上使用,无法支持移动平台。
快用UWA Lab合辑Mark好项目!

今天的推荐就到这儿啦,或者它可直接使用,或者它需要您的润色,或者它启发了您的思路......
请不要吝啬您的点赞和转发,让我们知道我们在做对的事。当然如果您可以留言给出宝贵的意见,我们会越做越好。
【博物纳新】是UWA旨在为开发者推荐新颖、易用、有趣的开源项目,帮助大家在项目研发之余发现世界上的热门项目、前沿技术或者令人惊叹的视觉效果,并探索将其应用到自己项目的可行性。很多时候,我们并不知道自己想要什么,直到某一天我们遇到了它。
更多精彩内容请关注:lab.uwa4d.com