【游戏设计图形学】模拟自然界火焰的方法

一场燎原的大火正向你扑面而来!本文将介绍在游戏中模拟火焰在自然界中传播时用到的一些技巧。

《孤岛惊魂》中使用的简单模型
 


Jean-Francois Lévesque 参与了制作《远哭 2》的火焰传播系统,以下是他在他的文章(参考[1])中所说的。

这里使用的火焰传播系统非常简单,为了游戏性必须牺牲一些真实性。作者喜欢将事情简单化,所以不会有复杂的数学公式和流体模拟。

对于 2D 平面来说,比如一块草地,为了模拟火焰传播,可以用一大块网格覆盖住。
 


接下来模拟火焰传播的过程是非常简单的。每个还没着火的网格有一个耐久度,而周围的火焰会让这个耐久度减小。当耐久度等于 0 时,这个网格就算是起火了,这个网格上的火会继续减少其他相邻网格的耐久度。
 


当然,非常容易着火的干草地的耐久度要低一些,而不会着火的石头的耐久度是无穷大。
 


如果是 3D 模型,就添加 AABB 盒,并且会准备几个模型以表现不同的烧毁程度。
 


在《远哭 2》中,火焰传播还会受到风的影响。但也并没有用到复杂的空气动力学,而仅仅是把风的方向向量,与火源到未着火网格的方向向量的点积,作为火焰的“攻击力”。
 


当然也有一些很重要的优化。

细节层次:level of detail,简单来说就是近处的火焰粒子较为精细高清,而远处的较为模糊粗糙。玩家看不清楚远处精细的东西符合我们的认知,这样设计也能节约很多 CPUGPU 计算资源。

事件管线:同样是为了节省 GPU 计算资源,我们会将相同的地块放到一个 AABB 盒中,即已经烧完放到同一个 AABB 盒,正在燃烧的放到另外一个。

约束条件:如果没有一些约束条件,游戏拍卖玩家扔的火很可能烧遍整个地图。因此可以这样设计,玩家扔出的莫洛托夫有 60 点“攻击力”,而一个方格里的草有 8 点“耐久度”,因此一个火瓶可以点燃 7 格的草。而这些在草上燃烧的第一遍火只有 50 点“攻击力”,再传下去的火只有 40 点“攻击力”,如此下去,火就不会永远燃烧下去了。

风对火焰传播的影响
以上是火焰传播的简单模型。但想要模拟真实的火焰传播,仍然有许多值得把玩的地方。

在有风影响时,火焰整体通常会呈现出鸡蛋状。黑色箭头所指即风的方向,受到风的作用,前端火焰,即鸡蛋尖,要比后端火焰,即鸡蛋尾的传播速度快。


例如在 S. Krezel 制作的虚幻 4 插件中,草地上的火焰传播在风的影响下是这样的:四幅一组的图中,左边两幅是风由左向右,右边两幅是风由右向左,上面两幅是弱风,下面两幅是强风。
 


可简单地把风方向向量与火焰向量点积作为火的传播速度,也可以根据在实验室的计算与观察来更真实的火焰传播。
 


斜坡对火焰传播的影响



除去风外,斜坡也是对火焰传播影响很大的因素。在参考[3] 中,作者得到的结论是,当前端火焰顺着风的方向,并且这个方向是上坡时,火焰的传播速度最快。数据如下:
 


左上图的可燃烧物是地中海松的落叶(pine halepensis litter), R0 是火焰在无风无斜坡时传播的速度,R 是火焰受到风与斜坡影响下的速度,SLA 即斜坡角度。

右上图可燃物是地中海松的落叶,fs 是火焰只受到斜坡的影响时的速度,fw 是火焰只受到风的影响的速度。

下面两幅图的可燃物是南欧海松的落叶(pine pinaster litter)。

而在参考[4] 中,作者依据 FIRETEC 火焰传播模型得到了以下结论:
 


其中 ROS 是火焰传播的速度,Slope 是坡度,是风的速度,而 L 是前端火焰的宽度。可以看到,”+“符号代表的强风模型,其火焰传播速度几乎与坡度呈线性,而”⭕“符号代表的弱风模型,其火焰传播速度在由下坡变为上坡后才与坡度近似线性关系。

火焰温度

火焰颜色条及其 RGBA 值。来源:参考[5]。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值