也玩视觉效果:VC++编程实现仿真火焰
2007-03-25 21:33:05 来源:WEB开发网核心提示: 对于火源的温度高低可用其所在点的亮度来描述;对于火焰扩散的模拟,为尽量减少运算量,也玩视觉效果:VC++编程实现仿真火焰(2),在此简单地用某火源点(x,y)及其前后左右邻近四点的均值来近似,即Pixel(x,y)=(Pixel(x,y)+Pixel(x,y-1)+Pixel(x,y+1)
对于火源的温度高低可用其所在点的亮度来描述;对于火焰扩散的模拟,为尽量减少运算量,在此简单地用某火源点(x,y)及其前后左右邻近四点的均值来近似,即Pixel(x,y)=(Pixel(x,y)+Pixel(x,y-1)+Pixel(x,y+1)+Pixel(x-1,y)+Pixel(x+1,y))/5,虽然该近似算法没有采取正余弦的方法精确,但运算速度极快,而且在后续的实验效果上同采用正余弦的方法几乎没有任何差别;由于在仿真过程中对火焰的温度是通过改变其亮度值来实现的,因此对于扩散过程的冷却可对像素点降低一个固定的亮度值来实现。衰减值的大小需要视所希望火焰冷却速度的快慢而定;对流对火焰产生的直接影响就是使火焰始终保持向上燃烧,因此可通过将当前火焰上滚一至两个像素来加以实现。根据前面描述的仿真运算法则,可将火焰的扩散和对流融合在一起实现,这将在一定程度上减少运算量,使产生的火焰在视觉上更加真实。实现上述近似模型的伪代码可大致设计如下:
ARRAY_OF_BYTES: buffer1(xsize*ysize),buffer2(xsize*ysize)
While(TRUE){
for(y=1;y for(x=1;x n1 = buffer1(x+1, y) //读取4相临像素值
n2 = buffer1(x-1, y)
n3 = buffer1(x, y+1)
n4 = buffer1(x, y-1)
p = ((n1+n2+n3+n4+p) /5); //四临像素均值
p = p-c; //同一固定冷却衰减值相减
if(p<0)
p=0
buffer2(x,y-1)=p
}
}
copy buffer2 to the screen ; //显示下一帧
copy buffer2 to buffer1; //更新Buffer1
}
火焰非均匀冷却的改进模型
更多精彩
赞助商链接