基于OpenGL及粒子系统的导弹爆炸仿真算法研究

来源:岁月联盟 作者:马俊枫 沈社会 时间:2010-08-30
 摘 要  导弹爆炸是虚拟战场环境的重要组成部分。本文利用粒子系统的基本原理,结合OpenGL的纹理映射技术,实现了导弹爆炸效果,并给出相应的原理、技术和实现算法。     关键词  粒子系统,导弹爆炸,纹理映射,算法 

1  引言

    导弹爆炸具有不规则的几何外形和内在的不确定性,它不同于静态景物,具有产生、和消灭的历程。对此,机图形学采用粒子系统来描述。粒子系统根据粒子的产生、变化和消灭来描述导弹爆炸碎片的不规则变化,用粒子系统来表现能够达到很好的逼真效果。粒子系统的基本原理是用赋于某种属性的微小粒子的随机过程来描述动态景物的特征。本文利用粒子系统的原理,以OpenGL为开发工具,来绘制导弹爆炸效果,并给出其仿真算法。

2  粒子系统基本原理简介

    粒子系统方法是由Reevs V.T.于1983年首次提出的,现已广泛应用于模糊景物的模拟,如火焰、瀑布、雪花等。粒子系统方法的基本思想是用许多形状简单且赋予生命的微小粒子作为基本元素,把物体定义为许多不规则、随机分布的粒子,而每个粒子均有一定的生命期。随着时间的推移,旧的粒子不断消失,新的粒子不断加入,同时,与粒子有关的每个参数均受到一个随机过程的控制,以规定粒子在系统中的形状、特征和运动。    利用粒子系统方法描述事物,首先对所在描述的对象特性进行分析,包括对象的静态属性和动态属性;其次要对粒子系统进行绘制。具体步骤:    (1)在系统中产生新粒子;    (2)赋予每个粒子一定的静态属性;    (3)删除在系统中已存在但超过其生命期的粒子;    (4)根据剩余粒子的动态属性进行移动和变换;    (5)显示具有生命的粒子所组成的图形 

3  导弹爆炸效果的仿真算法及绘制

    本文以OpenGL为开发工具,对导弹爆炸效果进行模拟,其绘制过程中首先选取合适的纹理映射,然后定义粒子的基本属性,最后对爆炸效果进行绘制。

3.1 指定OpenGL的纹理映射方式

    首先,应选取合适的纹理图象进行纹理映射,包括确定纹理的映射方式、映射坐、映射激活等。OpenGL的纹理映射共有3种:1D纹理、2D纹理和3D纹理。使用纹理映射一般要执行以下几个步骤:    (1)指定纹理。在使用纹理之前,首先应根据模拟对象的特点对纹理进行定义。本文使用2D纹理,调用函数glTexImage2D()。    (2)指定纹理映射方式。本文采用GL_BLEND融合方式,该模式利用纹理将纹理颜色同物体颜色进行融合。OpenGL中使用glTexenv()函数中的变量来设置纹理的映射方式。    (3)激活纹理。在OpenGL中使用glEnable()和glDisable()函数来打开和关闭纹理映射。    (4)指定纹理坐标和几何坐标,绘制场景。纹理坐标是将纹理图像的一个特殊位置与多边形的顶点相关联。在OpenGL中,对2D纹理,glTexCoord2D()函数中指定的坐标将与由glVentex()函数指定的几何坐标相关联。

3.2 定义基本粒子属性

    在粒子系统算法中,新产生的粒子数目由下式确定:        ParaNum=MeanParaNum+Rand()Var(ParaNum)    其中,ParaNum为某一时刻生成粒子的数目;        Rand()为[-1 1]中均匀随机数函数;        MeanParaNum为参数的均值,代表新粒子的平均数;        Var(ParaNum)为参数的方差,代表新粒子的方差。    根据给定粒子的均值和方差,利用上式就可以得到所需的粒子数。然后根据模拟对象的具体特点,使用函数glVertex3d()定义一个三角形。应用粒子系统的基本原理,赋予该三角形位置、颜色、生存期、速度大小、速度方向等属性,来模拟事物的动态效果。然后贴上纹理,即三角形的顶点坐标与纹理图象的坐标相对应。

3.3 导弹爆炸效果的绘制

    粒子系统是一种过程模型,即利用各种计算过程生成模型各个体素的建模技术。在设计爆炸时首先考虑到粒子的生成,然后从粒子源不断地发出粒子,粒子在运动中设置其速度、方向、颜色的淡化,最终形成爆炸效果。    在具体编程实现时,首先对爆炸粒子数据结构进行定义,其数据结构包括粒子的生命期、运动速度、运动方向、位置坐标和类型等参数。定义粒子数据结构如下:typedef struct {    bool active;     float x,y,z; //粒子位置坐标    float dx,dy,dz; //粒子方向增量    float dim; //粒子生命期    float ddim; //粒子生命变化量    float r,g,b; //粒子颜色数值     int nexplosion; //最大粒子数    bool fine;} SMOKE;    定义好粒子数据结构后,即可绘制导弹的爆炸效果。在绘制过程中,可根据各粒子的状态,对粒子进行添加、删除和移动等操作。具体算法如下:void DrawExplosion(void){   int t;   for(t=0;t<var.nexplosion;t++)   {   if(smoke_exp[t].active==true)          {smoke_exp[t].x+=smoke_exp[t].dx;smoke_exp[t].y+=smoke_exp[t].dy;smoke_exp[t].z+=smoke_exp[t].dz;                    smoke_exp[t].dx/=1.001;                    smoke_exp[t].dy+=0.002;                    smoke_exp[t].dz/=1.001;smoke_exp[t].dim+=smoke_exp[t].ddim;                    if(smoke_exp[t].dim>10)                             smoke_exp[t].active=false;                    smoke_exp[t].r-=0.01;                    smoke_exp[t].g-=0.01;                    smoke_exp[t].b-=0.01;                    if(smoke_exp[t].r==0)smoke_exp[t].active=false;Luce(smoke_exp[t].x,smoke_exp[t].y,smoke_exp[t].z,smoke_exp[t].dim,smoke_exp[t].r,smoke_exp[t].g/2,smoke_exp[t].b/3);   }   }}    图1是在Windows环境下利用Visual C + +6.0 平台绘制的导弹爆炸效果图。图1 使用OpenGL粒子系统绘制的导弹爆炸效果

4 结语

    本文算法将粒子系统原理和OpenGL纹理映射技术相结合,可以大大提高粒子的绘制速度,能够满足实时性要求较高的虚拟战场环境模拟。根据本文所提供的原理和技术,使用OpenGL粒子系统可以很逼真地实现很多三维特殊效果,如燃烧、尾焰等。

[1] Richard S.Wright,Jr.MichaelSweet. OpenGl超级宝典[M].人民邮电出版社,2001年.[2] 费广正,乔林.Visual C++高级编程技术—OpenGL篇[M].铁道出版社,2000年. [3] 王润杰,田景全,倪政国.基于粒子系统的实时雨雪模拟[J].系统仿真学报,2003,15(4):495-496.[4] 马登武,叶文,邓建求等.一种简便高效的导弹尾焰的绘制算法[J].系统仿真学报,2006,18(3):663-665.[5] 詹荣开,罗世彬等.基于景物特征的粒子系统建模技术[J].机工程与应用, 2001,(5):91-92

图片内容