1 / 6
文档名称:

火焰算法.doc

格式:doc   页数:6页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

火焰算法.doc

上传人:endfrs 2016/4/5 文件大小:0 KB

下载得到文件列表

火焰算法.doc

相关文档

文档介绍

文档介绍:. 如何真实地模拟火焰效果作者:周军游戏制作离不开各种各样的特效,火焰效果更是这些特效当中最常用的一种。在网上有很多的这方面的例子,但似乎都不太理想。下面我主要介绍几种有效的火焰模拟算法。在讲述火焰算法之前,我想先介绍一个经典的 Blur 算法,这将为我们后面的文章提供很好的技术基础,因为这是模拟火焰的关键所在。^_^ 对于不同的效果我们要采取不同的模糊(Blur) 算法,在这里我只介绍最简单的一种。其实 Blur 算法相当简单, 并不像很多人想象的那么神秘,只要一句话就可以解释清楚。我们所要做的不过是把屏幕上的每一个点用它周围的四个点的平均值代替即可。即: 好了,下面我们进入主题, Let ’s get in …… FIRE !!! 总的来说,模拟一个火焰效果需要以下这三个步骤: 放置热源、火焰上升、减掉衰减因子。 : 放置热源很好理解,也很好实现,我们只需要在屏幕的适当位置(想升起火焰的地方)放上一些亮点就可以了,比如: for (int i=0; i<320; i++) putpixel (i, 199, rand()%256); . : 我们已经有了热源,那么如何使火焰升起来呢?这就要用到我们刚才讲到的 Blur 了。由于火焰是要向上升的, 所以我们不能简单的选择待处理 pixel 的上、下、左、右四个相临 pixel , 而是要选择它本身和它下面的三个 pixel 。具体实现的 pseudo-code 如下: for (int y=0; y<200; y++) { for (int x=0; x<320; x++) { pixel(x,y)=(pixel(x,y)+ pixel(x-1,y+1)+ pixel(x,y+1)+ pixel(x+1,y+1))/4; // …… putpixel (x,y,bright); }} : 看到上面的”// ……”了么?对了, 那儿就是我们要添加如下这段代码的地方。为什么要减掉一个衰减因子呢?让我们通过两副图的对比来说明. 它的重要性吧: () 图 ( 不可取!) 具体实现的 pseudo-code 如下: if (--bright < 0) bright = 0; //衰减且保证 bright>=0 记住: 千万不要忘了检验不要让 bright 小于 0,否则……自己试试就知道了,嘿嘿~~~~~~ 也许读者会发现我们现在的火焰有些死板,所以我们不妨试着在火焰上加入一些 spark (火星) ,这可以使我们的火焰更加有戏剧性虽然它在一定程度上削弱了火焰的真实性。其效果图如下: 图 () . 看过 Seumas McNally ( 我很崇拜的大师,呵呵)的 ParticleFire ( 粒子火焰,见 ) 的朋友可能会知道, 他在他的火焰处理上就用这个算法以使他的火焰更富戏剧性。到此为止,我已经完整地介绍了模拟一个火焰效果地全部算法。但是这样模拟出来的火焰始终过于死板、不够逼真(当然,最为逼真的效果莫过于通过基于 Alpha 通道的伪粒子系统的实现,在这里我们不作讨论) 。如何才能解决这个问题呢?一个很好的办法是把我们的热源放置在一个