OpenGL粒子系统

2024-05-30

OpenGL粒子系统(精选四篇)

OpenGL粒子系统 篇1

粒子系统从应用的角度可分为三类, 即随机粒子系统、结构化粒子系统、方向粒子系统。随机粒子系统主要通过可控制的随机过程控制粒子属性的变化, 可用来生成火、烟、灰尘、爆炸等场景图像;结构化粒子系统主要用来模拟具有一定结构的物体或现象, 如树、草、云、彩虹等;方向粒子系统因为考虑到粒子间的相互影响, 粒子除了具有速度和位置等动态属性外, 还必须有方向属性, 可用来模拟织物、可变形物体和刚体等。降雪现象没有一定的结构, 模拟时无需考虑雪粒子间的相互作用, 宜采用随机粒子系统进行模拟。随机粒子系统采用大量的、具有一定生命和属性的微小粒子图元作为基本元素, 绘制不规则的模糊物体对象, 其中, 粒子图元的形状可以是小球、立方体、正四面体或其它的形体。粒子系统把物体定义为许多不规则、随机分布的粒子, 且每个粒子均有一定的生命周期。随着时间的住移, 旧的粒子不断死亡, 新的粒子不断加入。粒子的这种出生、成长、衰老和死亡的过程, 能够较好地反映模糊物体的动态特性。

本文依据粒子系统的仿真方法, 对降雪进行了模拟。用大量雪粒子来描述降雪的形状属性及运动属性。降雪粒子系统是不断进化的, 在生命期的每一刻, 都要完成如下四步:第一步, 系统产生新的雪粒子;第二步, 更新雪粒子属性;第三步, 删除“死”雪粒子;第四步, 绘制雪粒子。本文降雪粒子系统中采用四边形来描述雪粒子几何特征, 并给雪粒子加上纹理, 进而逼真描述雪的自然现象。

1 雪粒子系统初始化

雪粒子系统由大量的雪粒子构成, 雪粒子系统初始化需包含雪粒子初始化算法。对于雪粒子系统需要考虑的属性有雪粒子链表、雪粒子总数目、当前渲染的雪粒子数目, 雪粒子系统的中心位置、消逝时间;对雪粒子则要考虑当前位置、上次位置、速度、加速度、生命期、尺寸大小等属性。

雪粒子产生区域是一个覆盖地面场景的长方体, 并与水平面平行。在雪粒子密度相同的情况下, 较大的产生区域需要较多的粒子, 因此产生区域在满足视觉效果的前提下应尽可能小, 这里, 仅用视图体顶部的外接长方体作为产生区域。随着视点位置、视线方向的变化, 视图体在空间移动, 产生区域也作相应移动。本文雪粒子系统中雪粒子的初始化和发射被控制一个长、宽、高分别为mheight、mwidth、mdepth的长方体内。初始化时雪粒子x、y、z坐标分别由如下表达式确定:mheight、morigin.x+FRAND*mwidth、morigin.z+FRAND*mdepth。其中morign表示雪粒子系统场景的中心点。用自然语言描述雪粒子初始化、雪粒子系统初始化算法如下:

算法名称:雪粒子初始化;

算法参数:雪粒子索引号。

算法开始:

①初始化雪粒子的位置;

②设置雪粒子大小;

③设置雪粒子的初始速度为随机值;

算法结束。

算法名称:雪粒子系统初始化;

算法开始:

①判断是否存在雪粒子, 若有, 则雪粒子链表设为空, 并设置头指针为空, 否则转入第②步;

②调用“雪粒子初始化”算法;

③系统雪粒子总数、消逝时间均置为0;

算法结束 。

2 雪粒子系统的更新

随着视点的不断变化, 及雪粒子的不断运动, 雪粒子的空间坐标也在不断改变。当某一粒子运动到视口长方体分布区外时, 则认为该是雪粒子寿命结束, 系统停止对其计算和绘制。本文具体算法通过当前粒子的y轴坐标与场景的中心位置的y轴来判断雪粒子是否超出视口长方体, 即:若mparticle[i].mpos.y<=morigin.y, 则雪粒子到达场景外。此外, 雪粒子的数量直接影响场景的真实感, 改变每一帧新粒子产生的数量, 新产生的粒子较多时雪下的较大, 反之, 新粒子产生较少时雪下的较小。雪粒子数量选择太多或太少都会使下雪的图像失真。本文具体算法产生宏定义的方式获得, 即:newParticles= SNOWFLAKES_PER_SEC * maccumulatedTime。其中SNOWFLAKES表示每秒新产生的雪粒子数, maccumulatedTime表示雪粒子系统消逝时间。雪粒子系统更新算法描述如下:

算法名称:雪粒子系统更新;

算法参数: (消逝时间) 。

算法开始:

①判断当前雪粒子数目是否小于降雪粒子系统所容纳的雪粒子总数, 若小于, 则进行第②步;

②结合加速度与消逝时间参数计算当前雪粒子的新位置;

③判断当前雪粒子是否超出场景, 若是, 则删除当前粒子, 并将最后一个粒子移到当前位置, 否则, 当前雪粒子索引加1, 并返回第①步继续执行;

④累加并保存消逝时间;

⑤计算雪粒子新产生的数目, 若此时新数目少于雪粒子系统所容纳的粒子总数, 则转到第⑥步, 否退出;

⑥调用“雪粒子初始化”算法;

算法结束。

3 雪粒子系统渲染

OpenGL是美国SGI公司开发的三维图形库, 可以集成到各种操作系统中。利用OpenGL函数库可以创建动画的三维彩色图形交互式程序, 并能控制计算机图形技术来产生真实感图形。本文利用它的基本图形绘制、变换、着色技术得到了粒子系统的基本模型。OpenGL在计算机屏幕上渲染绘三维图形景观的基本骤步如下:第一步, 根据基本图形单元建立景物模型, 并且对所建立的模型进行数学描述, 其中点、线、多边形、图像和位图都可作为基本图形单元;第二步, 把景物模型放在三维空间中的合适位置, 并且设置视点以观察所感兴趣的景观;第三步, 计算模型号中所有物体的色彩, 其中的色彩根据应用要求来确定, 同时确定光照条件、纹理方式等;第四步, 把景物模型的数学描述及其色彩信息转换至计算机屏幕上的像素, 即光栅化。当然在如上四步中也可执行一些其他操作, 如自动消隐等。本文中具体算法首先通过雪粒子大小来反映透视效果, 并为了增强雪粒子系统的实时性, 尽量减少系统所绘制的多边形数量, 将雪粒子简化为二维四边形, 然后采用OpenGL的纹理融合技术将降雪的纹理图片映射到二维四边形上。雪粒子渲染算法描述如下:

算法名称:雪粒子系统渲染;

算法开始:

①设置OpenGL视点位置;

②绘制天空盒;

③构造显示列表, 绘制一个白色地形;

④开启混合模式, 并设置混合因子;

⑤将雪花纹理绑定;

⑥定义变量用于代表雪粒子的位置和大小;

⑦通过绘制四边形方式渲染雪粒子;

⑧关闭混合模式;

算法结束。

4 结语

本文按照粒子系统相关原理与结合OpenGL函数包, 使用Visual C++6.0模拟了自然界中降雪的自然过程。降雪粒子系统将雪粒子初始化区域限制在场景顶部长方体内, 大大减少所需粒子数量, 进而保证了算法的实时性。通过宏定义调整系统每秒产生雪粒子数及雪粒子大小, 可以产生不同程度、不同效果的降雪效果。为了更好地反映自然现象, 系统实时性和真实性需进一步加强。因此, 雪粒子重用技术、视景体优化技术及雪粒子受力情况是今后需努力的研究方向。

参考文献

[1]王宏伟, 刘越, 王涌天.面向对象的通用粒子系统设计[D].系统仿真学报, 2006, (8) .

[2]罗维佳, 都金康, 谢顺平.基于粒子系统的三维场地降雨实时模拟[D].中国图象图形学报, 2004, 9 (4) .

[3]蒋恒恒, 汤宝平, 章国稳.基于OpenGL与粒子系统实现三维喷泉模拟[J].计算机测量与控制, 2009, 17 (9) .

OpenGL粒子系统 篇2

1、粒子流系统的创建。单击GEOMETRY(物体)钮,在其下拉列表中选择PARTICLE SYSTEMS(粒子系统)项,如图1-1所示。

图1-1

2、在命令面板上单击PF SOURCE钮,在TOP视图中拖动鼠标,这样我们就创建了一个粒子流系统。在TOP视图中的图标就是“粒子流”的图标,默认的情况下其名称为“PF SOURCE01”,它可以作为默认的发射器来使用,我们也可以将任一其他的对象用作发射器,如图1-2所示。

图1-2

3、观察粒子发射。拖动屏幕底端的动画时间滑块,观察PERSPECTIVE(透视图),我们会发现,在默认的情况下,从图标向下发射出许多的粒子,粒子是以十字花状态显示的,如图1-3所示。

图1-3

4、进行渲染测试。在屏幕底端拖动时间滑块到第20帧,激活PERSPECTIVE视图,在工具栏上按下QUICK RENDER钮,这时渲染的效果如图1-4所示,观察渲染窗口,在默认的情况下粒子的形状为三棱锥,由于其使用的几何体形状比较简单,因此,便于系统快速有效地处理大量的粒子流,需要说明的是,粒子流系统也可以将场景中的任一一种对象用作粒子发射的几何体。

图1-4

[next]

5、在粒子视图中修改粒子系统。首先打开粒子视图,打开粒子视图的方法有两种,一种是按键盘上的6快捷键,另外一种方法是按下命令面板上的PARTICLE VIEW钮,如图1-5所示。在粒子视图中我们可以管理和编辑粒子系统。在粒子视图的主窗口中包含描述粒子系统的粒子图表。在默认的情况下系统以全局事件开始,它的名称与“粒子流”图标相同,后面接着是出生事件,其中包含有出生操作符和其他的用来定义系统初始属性的操作符,在每一个操作符名称后面为其最重要的一个设置或多个设置,在事件显示上面的是菜单栏,其下是仓库,其中包含粒子系统中可以使用的所有操作符,这些操作符的具体的含义可以参看前面的命令详解。

图1-5

6、参数设置。在全局事件PF SOURCE01中,首先单击RENDER01(GEOMETRY)操作符的名称,选中它以高亮显示,这样在其右侧就可以修改并访问其命令参数,由于这个操作符位于全局事件中,因此它会影响到整个粒子系统,其它的放置在此处的任一一种操作符同样如此。比如说,我们可以这里面定义全局材质,或都局部定义每个事件中的不同材质。渲染操作符的设置位于参数面板上的卷展栏中,在PATRICLE VIEW对话框的右侧,如图1-6所示, 这些设置有用于选择粒子渲染方式的下拉列表以及渲染粒子的百分比,以及将粒子分离到各个网格中的方法等等一系列的参数。

图1-6

7、更改粒子的显示类型。在全局事件PF SOURCE01中,在PARTICLE VIEW窗口的右侧,我们可以设置粒子的显示方式,首先在全局事件窗口中单击选择DISPLAY01,使其高亮显示,这样在右侧我们就可以设置其参数了,如图1-7所示。在默认的情况下,在TYPE项显示的是TICKS(十字叉)操作符。单击此下拉列表共有十种显示方式供选择,我们可以选择几何体、棱形、三角形等方式,这时粒子在视口中将显示为所选择的形状。

图1-7

8、将事件进行关联,

在进行事件关联之前我们首先应该明确,应该先添加测试然后用其将出生事件关联至新事件。首先在PARTICLE VIEW对话框底部的仓库中,找到AGE TEST测试,如图1-8所示。

图1-8

[next]

9、将AGE TEST从仓库中拖至全局事件PF SOURCE01,使其位于列表的最底部,如图1-9所示,然后松开鼠标,需要注意的是,在拖动AGE TEST到事件窗口中时,在DISPLAY01操作符上应该能看到一条实心的红色线条,此红心实线穿过了显示操作符,说明它替换了显示操作符,如图将它拖动到DISPLAY01的下面,将会新建一个事件。

10、松开鼠标后,AGE TEST将会出现在事件窗口的底部,其测试输出向左侧伸出一段,如图1-10所示,这一部分是用于将此测试连接到下一事件。

图1-10

11、在全局事件窗口中单击列表中的AGE TEST项,在粒子视图右侧的卷展栏中,可以对其参数进行调整,这里我们将TEST VALUE(测试值)设置为30,将VARIATION(变化)的值设置为0,将测试类型设置为PARTICLE AGE,这就表示生存了30帧以上的所有粒子的测试结果都为 “真”,即在30帧粒子都会起作用,并传至下一事件。如图1-11所示。

图1-11

12、将新建事件关联至AGE TEST测试。将SHAPE(形状)操作符从仓库中拖至事件显示的空白区域,使其位于EVENT01的下面,此时,SHAPE操作符将显示在名为EVENT02的新事件中,如图1-12所示。如同EVENT01一样,该事件也有一个从顶部伸出的圆形事件输入。此外,粒子流也会自动将DISPLAY显示操作符添加至此事件,因此,其粒子在视口中可见。我们还可以通过在命令菜单中来禁用自动创建局部DISPLAY显示操作符。在实际操作过程中,事件显示中的事件实际位置无关紧要,默认的位置也只是为了关联事件时方便,我们也可以通过拖动事件的标题栏来移动事件的位置。

13、将AGE TEST与新事件EVENT02进行实际关联。首先将鼠标光标放置在AGE TEST的测试输出左端的蓝色圆点上,此时光标的图像将会显示为具有三个朝内指向的圆形连接器的箭头的图标,然后将EVENT01中AGE TEST输出拖动到EVENT02输入,然后释放鼠标按钮。在拖动的过程中,当光标位于事件显示区域的空白空间时,光标图像会自动从三个箭头的图标更改为圆形的连接器,之后位于EVENT02输入时,它会变成四个箭头的图标。释放鼠标按钮后,会显示连接这两个事件的蓝色关联。此关联表示满足AGE TEST条件的粒子将会通过此关联到达受其动作影响的EVENT02,如图1-13所示。既然我们建立了事件的关联,同样我也也可以通过选择关联并按DELETE 键来删除关联以及粒子图表中的任何其他内容。

图1-13

14、查看关联结果。现在我们单击SHAPE操作符,并将SHAPE类型设置为TETRA,同样,单击DISPLAY显示操作符并将其TYPE类型设置为CUBE。将时间滑块拖动到第30帧以后,播放动画,我们会发现,从帧30帧开始,位于此粒子流头部的粒子会更改为立方体,这表明粒子已经进入EVENT02,随着时间的推移,将会有越来越多的粒子通过年龄30,从而就拥有了进入下一事件的资格,渲染结果如图1-14所示。

图1-14

15、在播放动画的同时,我们还可以尝试修改不同的操作符设置以查看结果。比如,我们可以单击SPEED01,然后更改它的参数设置,即使是在播放过程中,更改这些设置后,此更改仍然会实时反映在视口中。我们也可以尝试使用右键单击动作和事件,并使用重命名来为其自定义名称。我们也可能使用右键单击菜单的工具将注释添加至动作和事件中,这样便于以后操作时清楚地知道操作结果,添加注释后,将会出现一个红色小三角,指示我们在此位置曾经作过注释。

OpenGL粒子系统 篇3

一、OpenGL和绘图环境的初始化

初始化部分可分为OpenGL的初始化和绘图环境的初始化两部分,我们通常在FormCreate()函数中完成OpenGL的初始化。

1.创建DC(设备描述表)。hDC=GetDC(Handle);选择最佳像素格式,并保存索引号,如希望在一个Panel中输出图形,那么可以用Panel1-Handle作为此函数的参数。

2.创建RC(图形操作描述表)。定义像素格式:PIXELFORMATDESCRIPTOR pfd={ };选择最佳像素格式,并把保存索引号:PixelFormat=ChoosePixelFormat(hdc, &pfd);用DC创建RC :hrc=wglCreateContext(hdc);

3.制定当前的DC、RC。wglMakeCurrent(hDC,hRC);把产生的图形操作描述表置为当前的程序,此后的所有OpenGL函数都通过此图形操作描述表执行,并将图形绘制在设备描述表引用的设备上。

4.设置光源。Void glLightfv(Glenum light, Glenum pname,GL_DIFFUSE,GL_AMBIENT,GL_SPECULAR,const Glfloat* params);//指向颜色向量的指针,设置全局环境光函数:void glLightModelfv(GL_LIGHT_MODEL_AMBIENT,const Glfloat* param);//param 指向颜色向量的指针,起用光源函数:void glEnable(GL_LIGHTING); void glEnable(GL_enum cap);//cap:指明光源号。

5.设置材质。void glMaterialfv( GLenum face,GL_FRONT, GL_BACK,GL_FRONT_AND_BACK,GLenum pname,const float* params);//指向材质的颜色向量。

6.定义投影方式。void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near,GLdouble far);(left,bottom,near)和(right,top,far)分别给出正射投影投影范围的左下角和右上角的坐标。到此就完成了初始化工作,这些步骤基本上是固定的(像素格式的参数设置也是如此),对于一般的应用可以直接使用上述语句。

二、STL文件的读入及图形的显示和渲染

STL文件一般有二进制格式和ASCII码格式两种存贮方式,因此,要求预处理软件对这两种格式均可读入。为了正确显示模型,我们将读入的数据存入一组数组当中,在需要显示模型的时候,将数组中的数据再读出即可。数据的读入可以直接利用C语言实现。由于STL文件是对原始CAD模型进行表面三角化所得的,要实现STL文件的显示,只需将每个三角形面片显示出来即可;而要显示三角形面片,只要将三角形的每个顶点的坐标求出,然后调用OpenGL中的绘制三角形的库函数来实现显示功能。

glBegin(GL_TRIANGLES);glNormal3f(N1,N2,N3); // N1,N2,N3表示法向量的三维坐标, glVertex3f(X1,Y1,Z1);//X1,Y1,Z1表示其中一个顶点的三维坐标, glVertex3f(X2,Y2,Z2);glVertex3f(X3,Y3,Z3);glEnd();

在激光快速成型系统中,利用OpenGL来实现图形的显示和渲染必须进行以下几个步骤:

1.在FormDestroy()中作清理工作以释放资源。如果在同一个程序里对多个窗体用绘图必须严格进行清理,否则输出会出现混乱。

(1)清屏glClearColor(0.0,0.0,0.0,1.0);设置背景色为黑色。glClear(GL_COLOR_BUFFER_BIT);清屏以防止对以后窗口操作的影响。

(2)当前DC、RC设置为空。wglMakeCurrent(NULL,NULL);使不再有当前的图形操作描述表。

(3)删除DC、RC 。wglDeleteContext(hRC);删除该图形操作描述表。DeleteObject(hDC);删除该设备描述表。

2.在FormPaint()中实施绘图的相关操作。每当窗体重画时进行绘图的动作。OnPaint事件可能由系统触发例如置为当前窗口;也可以由程序触发即在需要改变绘图时调用TForm-FormPaint(Sender)。把所有绘图操作统一归入FormPaint()事件的响应函数中使我们很容易控制绘图的时机,程序变得很有条理。

(1)绘图准备。指定DC和设置背景颜色。

(2)绘图。调用自定义的绘图函数mydraw();

(3)缓冲操作。glFlush();强制完成绘图工作。SwapBuffers(hDC);完成两个图形缓冲区的交换,把画完的非显示缓冲图形显示出来。

(4)编写绘图函数。根据数据读入的原理,利用OpenGL显示三角形的功能,编写出绘图函数。

(5)视口变换。OpenGL中有多种图形变换,其中视口变换是比较简单而且常用的变换方式,事实上只需要使用一个函数glViewport(0,0, ClientWidth, ClientHeight);

此函数可以指定全部图形最后投影的一个矩形区域,上句以整个窗体的客户区为例。在FormResize()事件响应函数中调用这个函数可以使图形在窗体大小形状变化时保持相同比例的缩放。

三、STL文件的处理

在快速成型系统中,对STL文件的处理工作实际上就是对操作模型的处理工作,从处理的过程来看主要包括:

OpenGL粒子系统 篇4

在我军的砂尘环境风洞试验设备中, 为了提高DCS (Distributed Control System) 测控系统[2]的现代化水平, 使砂尘试验监控软件的可视化程度大大提高, 方便试验人员及时的监控试验状态, 直观的模拟国军标[3]中规定的浓度不同的低砂、中砂和高砂试验。采用现代发展的计算机图形技术进行喷砂效果模拟是一个值得探讨的问题。

在砂尘粒子系统的建模过程中, 采用经典粒子系统模型的建立原理为依据。在利用粒子系统模拟砂粒性状的同时, 结合砂尘环境风洞试验中砂尘粒子的运动特性, 对传统的粒子系统方法进行了一定的改进, 对控制参数进行适当的增补, 降低了随机性, 便于进行合理的控制, 使其应用更加灵活、方便。

本文采用开放图形库OpenGL绘制喷砂动画效果, 它是一个三维的计算机图形和模型库, 现在已成为3D图形软件接口的工业标准。并且OpenGL作为一个性能优越的图形应用程序设计界面 (API) , 具有广泛的可移植性, 它独立于硬件系统、操作系统和窗口系统。此外微软基本类库MFC (Microsoft Foundation Class) 是PC机上Windows操作系统中广泛使用的应用程序框架, 它提供可视窗口程序的界面和基本输入输出功能。在MFC下采用windows GDI与OpenGL 相结合的办法, 可以充分利用MFC提供的Windows程序框架和OpenGL强大便捷的绘画功能, 很方便地开发出功能丰富、性能优秀的动画应用程序, 补充了GDI的不足。

1测控系统组成原理

DCS系统是以工业级计算机为核心, 集成单元组合仪器及微处理器的优点, 可充分利用计算机技术、控制技术、通信技术及图像处理技术的应用成果来完成所要求的控制系统设计, 其特点是:集中管理、分散控制。图1为砂尘粒子浓度测控系统原理图。

风洞中砂尘浓度[4]的控制主要是完成对旋转送料器转速的控制, 通过调节转速来控制砂尘的输入量。砂尘浓度计变送砂尘浓度信号通过数据采集装置进计算机, 进行砂尘流程的OpenGL动画显示, 并由过程控制单元的调节控制器直接控制变频调速器, 改变旋转供料器不同转速实现调节供砂尘量来达到控制砂尘浓度的目的。

2粒子系统基本原理

1.1粒子系统的基本思想

通常粒子系统的绘制画面包括几个步骤:① 产生新的粒子加入系统中;② 赋予每一粒子一定的属性;③ 删除那些已经超过生命周期的粒子;④ 根据粒子属性的动态变化对粒子进行移动和变换;⑤ 绘制并显示由有生命的粒子组成的图形。

将上述步骤不停的循环形成了物体的动态变化过程。

1.2改进粒子系统的参数

运用传统的粒子系统方法模拟砂粒的效果过于随机, 不便对其进行精确的控制。需要针对砂尘粒子的特性, 及其在风道中的运动特性

进行控制参数的改进, 以达到更好的模拟效果。

(1) 粒子的数量和位置要在给定的屏幕位置, 即显示的流程图中的风道喷头处喷出砂粒, 粒子的初始位置需要确定。此外为了区分不同砂尘浓度的实验效果, 粒子的初始数量也很重要。粒子数量过小不能够直观的表现风道中的喷砂情况。数目过大, 计算和控制的时间就长, 增加了CPU占用率, 影响实时性效果, 降低了监控程序的执行效率。在实际的喷砂效果的绘制中, 粒子的初始位置x0、y0、z0由喷头在屏幕上的位置xp、yp、zp决定, 可由下式得到。

undefined

其中rand () 函数为随机调用的函数。

粒子的最大数目Nmax, 采用不影响计算机显示的模拟效果的最大粒子数, 该参数可根据计算机的性能及砂粒在屏幕上的绘制范围试凑获得出。考虑到系统没有砂粒喷出的情况, 粒子的最小数目Nmin可为0。在试验过程中的粒子数目N可参考试验测得的沙尘浓度C, 按照百分比关系由下式计算得出:

undefined

式 (2) 中Cmin、Cax分别为试验中砂尘浓度的最小和最大量程。

(2) 粒子的生命期。在实际的喷砂过程中, 由于砂粒所处的风道位置不同, 砂粒的运动状态也不同, 距离喷口处越近, 粒子的生命期越长, 距离回收处越近, 粒子的生命期越短, 所以可以看出砂粒的生命期与初始位置的距离成反比关系, 其计算公式如 (3) 式所示, 其中K为比例系数。由于砂粒不同于火焰、云雾、烟等粒子具有明显的“湮灭”效果, 所以只需在回收处附近控制粒子的生命期即可。

undefined

(3) 粒子的速度和方向。为了绘制出砂粒随风运动的效果, 使运动轨迹符合风道结构, 并且便于计算机语言编程, 可将速度矢量V , 分解为两个描述参数一个为表示速度大小的v , 一个为表示方向的 d , 每一帧的计算公式如 (4) 、 (5) 两式所示。

undefined

(4) 粒子的运动类型。考虑到风道形状不同, 砂粒在不同风道段内的运行轨迹不同, 砂粒呈现的属性也会不同, 为了方便计算机描述, 增加粒子运动类型S参数, 用于区别不同风道内的砂粒, 实际上这个参数用于区分喷砂段, 试验段, 回收段这三种不同砂粒运动状态。考虑到试验过程中这砂粒流经这三个试验段的过程是不可逆的, 可以将S设为整数, 用1、2、3分别表示这三个过程。

3砂尘粒子模型及轨迹方程

根据上述设计思想, 可以将砂尘粒子模型转化为C++语言的结构体描述形式如下所示:

在该结构体中除了粒子类型为整型数据外其他类型根据计算需要都设为浮点型。并且设计使用了双向链表, 将当前帧的粒子, 同上一帧和下一帧的粒子关联起来, 增强了砂尘粒子的可控性。当删除粒子时首先需要断开链表连接。

砂粒在喷口出的运动轨迹可由抛物线方程表示可如 (6) 式所示:

undefined

砂粒在试验段的运动方程可以看作加速运动可由式 (7) 表示:

undefined

砂粒在回收段的运动方程可以看作抛物运动也就是y轴方向上的自由落体和x轴方向上的减速运动由式 (8) 表示:

undefined

4砂尘粒子的渲染

采用纹理贴图 (Texture Mapping) ) 技术也叫纹理映射技术, 为每个粒子贴上纹理图可以在满足实时性的同时增加砂尘粒子的真实感。砂粒的纹理可由用户根据要绘制的砂粒特性, 包括大小、形状等来选择使用。可以通过创建一个纹理数组来定义不同类型的纹理, 在本系统中所使用的砂粒纹理可用不同的几张纹理图片作为纹理样本来进行映射, 不同大小形状的砂尘粒子纹理图如图2所示。

纹理贴图的数学过程比较复杂, 但OpenGL已对其进行了处理, 调用几个库函数就可以完成纹理贴图, 主要步骤可以概括为:定义纹理贴图, 控制纹理, 说明纹理贴图方式, 定义纹理坐标等。

本系统中采用了纹理贴图的一种新技术, 即多重贴图 (Mip Mapping) 技术[5], 这种贴图方式在动画显示时具有较好的视觉效果, 它通过减少对GL_LINEAR图像滤镜的需要, 提高了显示效果, 小的多贴图纹理可以用来代替纹理图像的缩放。并且多贴图纹理的特点是可以减少纹理漂浮 (Swim) 。多重纹理贴图可以通过调用OpenGL的gluBuild2DMipmaps () 实现, 该函数可以根据输入的图像并自动调整其大小进行多重纹理贴图。

5OpenGL的喷砂绘制

本系统中采用MFC微软基础类库与OpenGL相结合的方法, 可充分利用MFC提供的程序框架和OpenGL的三位绘图功能实现功能丰富, 效果直观的测控系统监控程序。

(1) OpenGL的初始化。

在MFC的应用程序中调用OpenGL, 需要将相应的OpenGL头文件包含进该项目的stdafx.h文件中, 并在vc6.0开发环境中增加opengl32.lib, glu32.lib, glaux.lib三个库文件。

为了方便代码调用, 并增强可维护性, 采用MFC的类库对监控程序需要的调用OpenGL的代码进行了封装, 将OpenGL函数实现在名为CGLView的类中。CGLView类可以继承自窗口类CWnd或其子类CView。需要重载的主要有5个消息影射函数, 如图3所示。

其中消息响应函数OnCreate () 调用成员函数SetupPixelFormat () , 重新设置像素格式, 创建着色上下文并使它成为当前着色上下文。在On InitialUpdat () 函数中编制函数InitGL () , 用来完成对绘图的初始化, 包括:设备清除背景色、光源属性、材料属性、纹理装载、显示列表和最初的场影变换等。还需在OnSize () 函数中添加代码, 建立视点、启动透视变换及建立透视体以设置投影格式。OnDraw () 函数中实现具体动画效果的计算和绘制并且调用SwapBuffers () 函数交互缓冲区, 实现动画效果的绘制。OnDestory () 函数主要在销毁窗口时释放资源并清除OpenGL任务。

(2) 双缓存动画。

在OpenGL 中采用双缓存技术实现多媒体动画。实现原理就是在屏幕上实现绘制图形以前, OpenGL 先分配2 个颜色缓存区, 可称为前台缓存和后台存, 在显示连续的动画时, 在一个缓存区中执行绘制命令的同时, 在另一个缓存区中进行图形显示。由于计算机速度比较快, 这样就可以使所显示的图形连续变化, 达到动画的效果。使用双缓存实现动画的流程步骤为:①设置OpenGL 窗口显示属性为双缓存机制;②利用OpenGL 绘图命令绘图;③绘图结束后切换缓存。

(3) 屏幕闪烁的消除。

在OpenGL的绘制过程中可以通过重载OnEraseBKgnd () 并且令其返回TRUE的方式, 阻止OpenGL描绘窗口屏幕之前程序自动填充屏幕。这种方式可以减少额外的屏幕闪烁。

此外如果一个窗口中包括多个 OpenGL 子窗口, 在动画执行过程中出现了某一个窗口不停的闪烁。原因是仅仅对一个窗口使用了 wglMakeCurrent 函数。因此为了防止闪烁, 在其中一个子窗口进行绘图之前, 也就是在 OpenGL 调用之前, 执行 wglMakeCurrent 选中其窗口的设备上下文和场景上下文。在OpenGL 调用执行结束之后再调用 wglMakeCurrent (NULL, NULL) 释放选中的设备上下文。这样两个子窗口在绘图的时候就不会互相影响。

6实现效果

根据上述方法在普通PC机, windows XP 操作系统平台上开发实现, 实现效果如图4所示。在监控程序中采用了GDI绘图与OpenGL绘图结合使用的方法, 调试取得了成功。GDI方法用于绘制数据窗口和信息文字及流向线, OpenGL主要用于绘制喷砂动画, 并且采用纹理贴图的方法将流程图贴入OpenGL的绘制区域, 可实现如图4所示的喷砂动画效果。

参考文献

[1]王浚.环境模拟技术.北京:国防工业出版社, 1996.225~227

[2]向运飞, 刘旺开, 沈为群.双路热动力试验台集散控制系统设计与实现.计算机测量与控制, 2002, 10 (10) :653~655

[3]GJB150.3A-200x.军用设备环境试验方法.国防科学技术工业委员会, 1986.

[4]马志宏, 李运泽, 张华, 王浚.砂尘环境试验设备中颗粒浓度场的实验研究.北京航空航天大学学报, 2005, 31 (8) :884-887

本文来自 360文秘网(www.360wenmi.com),转载请保留网址和出处

【OpenGL粒子系统】相关文章:

2opengl简介05-10

物理粒子06-30

金属纳米粒子06-03

二阶粒子群06-05

降雨粒子模型06-11

磁性纳米粒子06-18

生物危险粒子06-30

混沌粒子群优化05-11

Ag纳米粒子05-18

全局粒子群算法05-30

上一篇:dog下一篇:项目保护措施