1 / 6
文档名称:

火焰算法.doc

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

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

分享

预览

火焰算法.doc

上传人:在水一方 2019/1/13 文件大小:124 KB

下载得到文件列表

火焰算法.doc

相关文档

文档介绍

文档介绍:如何真实地模拟火焰效果作者:周军游戏制作离不开各种各样的特效,火焰效果更是这些特效当中最常用的一种。在网上有很多的这方面的例子,但似乎都不太理想。下面我主要介绍几种有效的火焰模拟算法。在讲述火焰算法之前,我想先介绍一个经典的Blur算法,这将为我们后面的文章提供很好的技术基础,因为这是模拟火焰的关键所在。^_^对于不同的效果我们要采取不同的模糊(Blur)算法,在这里我只介绍最简单的一种。其实Blur算法相当简单,并不像很多人想象的那么神秘,只要一句话就可以解释清楚。我们所要做的不过是把屏幕上的每一个点用它周围的四个点的平均值代替即可。即:好了,下面我们进入主题,Let’sgetin……FIRE!!!总的来说,模拟一个火焰效果需要以下这三个步骤:放置热源、火焰上升、减掉衰减因子。放置热源:放置热源很好理解,也很好实现,我们只需要在屏幕的适当位置(想升起火焰的地方)放上一些亮点就可以了,比如:for(inti=0;i<320;i++)putpixel(i,199,rand()%256);火焰上升:我们已经有了热源,那么如何使火焰升起来呢?这就要用到我们刚才讲到的Blur了。由于火焰是要向上升的,所以我们不能简单的选择待处理pixel的上、下、左、右四个相临pixel,而是要选择它本身和它下面的三个pixel。具体实现的pseudo-code如下:for(inty=0;y<200;y++){ for(intx=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(火星),这可以使我们的火焰更加有戏剧性虽然它在一定程度上削弱了火焰的真实性。其效果图如下:()ally(我很崇拜的大师,呵呵)的ParticleFire(粒子火焰,)的朋友可能会知道,他在他的火焰处理上就用这个算法以使他的火焰更富戏剧性。到此为止,我已经完整地介绍了模拟一个火焰效果地全部算法。但是这样模拟出来的火焰始终过于死板、不够逼真(当然,最为逼真的效果莫过于通过基于Alpha通道的伪粒子系统的实现,在这里我们不作讨论)。如何才能解决这个问题呢?一个很好的办法是把我们的热源放置在一个运动的物体上(Hugo就曾使用feedback和warp的技术逼真地模拟了火焰的效果,中国的程序员也有用与Hugo完全相同的算法真实模拟了这个效果),而不是放在屏幕底部,这样通过物体的运动再加上一些放缩、模糊技巧就可以使我们的火焰产生出意想不到