也玩视觉效果:VC++编程实现仿真火焰
2007-03-25 21:33:05 来源:WEB开发网核心提示: 初始化完成后可以通过在后台页面绘图,并在绘制完毕后将后台页面复制到主页面完成对一帧图像的显示:lpDDSBack->Blt(NULL,NULL,NULL,DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);ddrval = lpDDSBack->Lock
初始化完成后可以通过在后台页面绘图,并在绘制完毕后将后台页面复制到主页面完成对一帧图像的显示:
lpDDSBack->Blt(NULL,NULL,NULL,DDBLT_COLORFILL|DDBLT_WAIT, &ddbltfx);
ddrval = lpDDSBack->Lock(NULL, &ddsd, 0, NULL) //锁定后台页面
while (ddrval== DDERR_WASSTILLDRAWING);
if( ddrval == DD_OK ){
fire.render((WORD*)ddsd.lpSurface); //完成对一帧火焰的渲染
lpDDSBack->Unlock(NULL); //解锁后台页面
}
while( 1 ) {
ddrval = lpDDSPrimary->Flip( NULL, 0 ); //换页
if( ddrval == DD_OK )
break;
if( ddrval == DDERR_SURFACELOST ){
ddrval = lpDDSPrimary->Restore(); //恢复主页面
if( ddrval != DD_OK )
break;
}
if( ddrval != DDERR_WASSTILLDRAWING )
break;
}
根据以上程序算法对火焰进行了仿真实验,在速度和仿真结果在视觉的逼真程度上都获得了非常好的效果。右图是从仿真过程中截取的一帧画面,从图中可以看出,虽然在前面的算法设计过程中多处采用了看似过分的近似处理,但并未因此产生负面效果。实验表明,本文采用的在数据缓冲区中对图象进行处理的方法在程序运算和显示的速度上与仿真对象--火焰的复杂程度是无关的,因此用类似的方法完全可以比较容易地实现对其他复杂物理、自然现象的仿真模拟。
结论
本文通过对火焰的计算机仿真模拟实现过程,对仿真模拟类程序一般的设计实现过程做了简要介绍。通过对本文所述程序设计思路与实现方法的理解,可以用类似的方法结合实际情况灵活选用诸如OpenGL、Direct3D等不同的软件接口对其他一些自然现象进行仿真模拟。本文所述程序在Windows 98下,由Microsoft Visual C++ 6.0调试通过(需要DirectX 5.0支持)。
更多精彩
赞助商链接