基于OpenGL粒子系统的喷泉模拟_第1页
基于OpenGL粒子系统的喷泉模拟_第2页
基于OpenGL粒子系统的喷泉模拟_第3页
基于OpenGL粒子系统的喷泉模拟_第4页
基于OpenGL粒子系统的喷泉模拟_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HUNAN UNIVERSITY 毕业设计(论文)毕业设计(论文) 设计(论文)题目: 基于 OpenGL 粒子系统的喷泉模拟 学生姓名 冯亮 学生学号 20041610504 专业班级 软件测试一班 学院名称 软件学院 指导老师 申煜湘 系主任(院长) 林亚平 2008 年 5 月 19 日 湖南大学毕业设计(论文) 第 I 页 湖南大学软件学院 基于 OpenGL 粒子系统的喷泉模拟 摘 要 随着计算机仿真技术的不断提高,人们对真实事物的模拟要求越来越高,模拟技 术的重要性越来越突出,尤其在 3D游戏、军事演习和仿真实验等方面。而寻求能准确 地描述客观世界中各种现象与景观的数学模型,并逼真

2、地再现这些现象与景观,是计 算机图形学的一个重要研究课题。 本文从计算机图形学中粒子系统模拟自然景物的方面出发,介绍了采用粒子系统 模拟真实事物的方法。实际上,很多自然景物难以用几何模型描述,如烟雾、植物、 水波、火焰等,粒子系统的景物模拟则超越了几何模型的限制,能够用简单的模型描 述复杂的自然景物。 本课题设计了基于 OpenGL 粒子系统的喷泉模型,详细讨论了模型中粒子的属性 及其变化,实现了具有较强真实感的动态变化和抛物变化等喷泉特征,采用了纹理映 射和视线跟踪技术进行三维喷泉渲染;同时,采用 Line 方式取代传统的 Point 方式渲 染粒子实现喷泉模拟。该方式模拟喷泉比较真实,速度

3、快,在普通的微机上可以得到 令人满意的效果。 关键词:粒子系统,喷泉模拟,特效 湖南大学毕业设计(论文) 第 II 页 湖南大学软件学院 The Fountain Simulation Based on OpenGL Particle System Author: Feng Liang Tutor: Sheng Yuxiang Abstract With the computer simulation technology continues to improve, people is demanding increasingly on the simulation of real thing

4、s, the importanctof Simulation is prominenting increasingly, especially in 3D games, military drills and simulations, and so on. And seeking an the accurate mathematical model description of a variety of landscape of in the objective world,and realistic reproduce these phenomena and landscape, is an

5、 important research topic of the graphics. The topic from analoging the nature of the area with the Particles system of the graphic introductions the simulation of the real things. Many nature difficult to describe the geometric models, such as smoke, plants, water waves, flame, and so on, the featu

6、res of particle system simulation model goes beyond the geometric constraints, can describes complex nature by a simple model. This topic designed the fountain model based on the OpenGL particle system, discussed detailly the properties of particles in the model and its changes, achieved a more real

7、istic with the dynamic changes and changes in parabolic fountain features, used texture mapping and tracking technology for 3-D vision Fountain rendering. the same time, Line way used to replace the traditional Point way exaggerated particles to achieve fountain simulation. The simulation way is a r

8、eal fountain comparison, speedly, in general PC can get satisfactory results. Key Words:Particle systems, fountain simulation, effects 湖南大学毕业设计(论文) 第 III 页 湖南大学软件学院 目 录 1. 绪论.1 1.1 自然景物模拟概述 .1 1.2 粒子系统的背景及其介绍 .1 1.3 国内外研究现状 .2 1.4 喷泉模拟的要求及意义 .3 2. 相关学术知识.5 2.1 物理学知识 .5 2.2 数学知识 .5 2.3 OPENGL.6 2.4 M

9、FC.7 3. 粒子系统的设计.10 3.1 PARTICLE SYSTEM API.10 3.2 常见的粒子运动模型 .11 3.3 喷泉模拟的算法 .12 3.3.1 喷泉粒子初始化.12 3.3.2 喷泉粒子的运动轨迹.13 3.3.3 粒子的消亡.13 3.3.4 喷泉绘制.14 3.4 纹理映射技术 .14 4. 系统实现.16 4.1 开发环境 .16 4.2 粒子生成 .16 4.3 粒子活动 .17 4.4 水柱生成 .19 4.5 喷泉旋转 .20 4.6 纹理贴图 .21 湖南大学毕业设计(论文) 第 IV 页 湖南大学软件学院 4.7 场景实现 .23 5. 总结.26

10、致谢.27 参考文献.28 湖南大学毕业设计(论文) 第 1 页 湖南大学软件学院 1. 绪论 1.1 自然景物模拟概述 自然景物模拟一直都是计算机图形血研究者面临的巨大挑战之一。由于自然景物 的形状随即变化,表面往往含有丰富的细节,很难用传统的解析曲面来描述。常见的 景物模拟方法一般有以下两种: 第一种:根据数学函数构造出景物外型,然后变换时间函数 t。这类方法可以称为 过程动画的方法,比较典型的是 Fournier 模拟水波的方法。 第二种:从物体运动的物理原理出发,一般是求解一组力学方程,得到质点在各 个时刻的状态。这类方法可以称为基于物理的方法,比较典型的是 Foster 的方法。 比

11、较而言,过程动画方法比较简单、计算效率较高,但效果比较单调,适用范围 比较狭窄。基于物理方法的效果比较真实,适用范围广泛一些,但是计算起来非常复 杂,效率比较低。 在模拟诸如云、烟、火等不规则模糊物体时,粒子系统是迄今为止被认为是最成 功的一种算法。为了方便用粒子系统模拟各种物体,McAlbster 结合 OpenGL,用 C+ 开发了一套粒子系统 API。利用这套 API 可以很方便地对运动的物体进行动态模拟, 首先将粒子的活动进行简单的分析和描述,然后对粒子系统进行场景渲染,结合 OpenGL 提供的一些功能如纹理映射效果,可以模拟很多种自然景物。本课题就可以利 用这种方法来模拟多种喷泉的

12、效果。 1.2 粒子系统的背景及其介绍 粒子系统到底是什么?所谓的粒子系统,就是将人们看到的物体运动和自然现象, 用一系列运动的粒子来描述,再将这些粒子运动的轨迹映射到显示屏上,在显示屏上 看到的就是物体运动和自然现象的模拟效果了。 利用粒子系统,可以在屏幕中表现诸多的特殊效果,如:焰火、火苗、落叶、雪 花飞舞等。不怕做不到,就怕想不到。只要你的想象力足够丰富,你可以创造出意想 不到的奇迹来。 粒子系统的基本思想是:采用许多形状简单的微小粒子作为基本元素,用它们来 表示不规则模糊物体。这些粒子都有各自的生命周期,在系统中都要经历“产生” 、 “运动和生长”及“消亡”三个阶段。粒子系统是一个有“

13、生命”的系统,因此不象 湖南大学毕业设计(论文) 第 2 页 湖南大学软件学院 传统方法那样只能生成瞬时静态的景物画面,而是可以产生一系列运动进化的画面, 这使得模拟动态的自然景物成为可能。 利用粒子系统生成画面的基本步骤是: 1、产生新的粒子; 2、赋予每一新粒子一定的属性; 3、删去那些已经超过生存期的粒子; 4、根据粒子的动态属性对粒子进行移动和变换; 5、显示由有生命的粒子组成的图像。 粒子系统采用随机过程来控制粒子的产生数量,确定新产生粒子的一些初始随机 属性,如初始运动方向、初始大小、初始颜色、初始透明度、初始形状以及生存期等, 并在粒子的运动和生长过程中随机地改变这些属性。粒子系

14、统的随机性使模拟不规则 模糊物体变得十分简便。 粒子系统应用的关键在于如何描述粒子的运动轨迹,也就是构造粒子的运动函数。 函数选择的恰当与否,决定效果的逼真程度。其次,坐标系的选定(即视角)也有一 定的关系,视角不同,看到的效果自然不一样了。 1.3 国内外研究现状 国外的研究始于 80 年代初期,由 Reeves W. T.于 1983年首次提出粒子系统模型, 并用其模拟了焰火、爆炸等效果,他还成功的利用该模型模拟了电影AR TREK I: The Wrath of Khan中的一系列特技镜头。1985 年Reeves W. T.和 Blau发展了粒子系统, 他们用“volume filli

15、ng”基本单元模拟生成那种随时间改变形状,但又基本保持不变的 实体,如随风飘动的花草树叶。 此后从理论到技术都得到了进一步发展:Reeves W. T.提出了关于粒子系统消隐绘 制的算法,称之为“近似概率算法” ,用于解决阴影、可见面问题,且取得了很好的效 果。Fournier A.等在研究海浪模型中利用粒子系统模拟了浪花,提出了浪花的产生条件 粒子运动速度和海流曲面传播速度之间的差异要超过一定的条件,即粒子运动速 度与海浪曲面传播速度之间的差异要超过一定的阀值,否则产生泡沫。Karl Sims 研究 了粒子的动画及绘制算法,他利用粒子系统的并行特点,提出了一个并行的粒子绘制 系统,该系统能绘

16、制不同形状、大小、透明度的粒子,并能进行反走样、消隐、运动 湖南大学毕业设计(论文) 第 3 页 湖南大学软件学院 模糊的处理。Reed 等人用粒子系统成果的模拟了闪电。Reynolds 在其群体行为研究中, 又极大的扩展了粒子系统的功能,并将其作为一种建模工具,他提出了粒子间相互结 合的思想,从而使粒子与粒子之间进行交互,并阐明利用大量的简单图元间的交互作 用可产生复杂的行为。Miller(粒子存在与三维坐标系) 存在时间:t=-9.9(设粒子运动的最高点为粒子虚拟产生时间) 当前速度:v=(rand()%200000)/100000+1; 运动方向:d=(rand()%400)/100-2

17、 代码如下: void CMyFountainView:AddParticles() struct particle *tempp; int i, j; for (j=0; j3; j+) for (i=0; iprev = tempp; tempp-next = fnj; fnj = tempp; 湖南大学毕业设计(论文) 第 17 页 湖南大学软件学院 tempp-t = -9.9; tempp-v = (float)(rand() % 200000)/100000+1; / 粒子速度 tempp-d = (float)(rand() % 400)/100-2; / 粒子方向 / 开始位置

18、的坐标 tempp-x = 0; tempp-y = 0; tempp-z = 0; tempp-xd = cos(tempp-d*3.14159)/180)*tempp-v/4; tempp-zd = sin(tempp-d*3.14159)/180)*tempp-v; tempp-type = 0; / 粒子状态为运动 tempp-a = 1; / 粒子淡化 其中最后一步的“a=1” ,其含义将会在粒子活动中介绍。 4.3 粒子活动 粒子的活动主要有 2 个粒子的移动(MoveParticles)和粒子的删除 (DeleteParticles) 1、粒子移动的实现: 首先需要定义了一个指针

19、*tempp,通过下面的方式来计算粒子下个位置的坐标, 以此来实现粒子的移动: Temp-x+=tempp-xd; Temp-z+=tempp-zd; Temp-y+=-(9.8*(tempp-t* tempp-t/4)/2+122.5; 由于粒子只受到重力作用,x、z 方向上并不受力,所以粒子 x、z 方向通过自己方 向上速度的不断自加来计算其在 x、z 轴上的坐标。而在 y 方向上,粒子受到重力的作 用,通过物理学公式 s=g*t*t/2,可以定义 y+=-(9.8*(tempp-t* tempp-t/4)/2+122.5, 其中 122.5 是给定的初始高度。粒子通过坐标的不断变化进行活

20、动,这样就可以形成一 个水柱。 湖南大学毕业设计(论文) 第 18 页 湖南大学软件学院 代码如下: void CMyFountainView:MoveParticles() struct particle *tempp; int j; for (j=0; jtype = 0) / 如果粒子处于运动状态 tempp-x += tempp-xd; tempp-z += tempp-zd; / 计算粒子的高度 H = gt2/2 tempp-y = -(9.8*(tempp-t*tempp-t/4)/2+122.5; tempp-t += 0.1; / 增加粒子寿命 if (tempp-y typ

21、e = 1; / 如果粒子位于地面 else / 粒子位于地面 tempp-y = -(9.8*(tempp-t*tempp-t/4)/2+122.5; tempp-a -= 0.1; / 粒子淡化 tempp = tempp-next; / 下一个粒子 2、粒子删除的实现: 粒子的属性中有个 type,表示粒子所处的状态。当 type=0 时表示粒子在地面上空 湖南大学毕业设计(论文) 第 19 页 湖南大学软件学院 即粒子处于运动状态,当 type=1 是表示粒子位于地面即粒子处于静止。 在粒子的活动中,设定当 y(即粒子的高度)0 时 type=0,粒子在地面上空,同 时设定 a=1。当

22、粒子位于地面下时,y0,设置 type=1,同时对 a 进行自减操作a- =0.1,当 a=0 是粒子消失。 这便是本文所采用的利用粒子的淡化处理方式进行粒子的删除操作。 代码如下: /删除粒子 void CMyFountainView:DeleteParticles() struct particle *tempp, *temp1; int j; for (j=0; jtype = 1) tempp-prev-next = tempp-next; if (tempp-next) tempp-next-prev = temp1; free(tempp); tempp = temp1; temp

23、p = tempp-next; 4.4 水柱生成 湖南大学毕业设计(论文) 第 20 页 湖南大学软件学院 水柱的生成实际上就是许多粒子不断活动的结果。具体的实现就是对粒子进行增 加、移动、删除的操作,不断的循环这样的操作就可以实现水柱的生成了。即 AddParticles()-MoveParticles()-DeleteParticles()的循环。 生成结果如图 4-1 所示: 图 4-1 水柱的模拟效果图 4.5 喷泉旋转 正如大家平时所看到一样,喷泉是由一个个水柱组成的。水柱的变化形成各种各 样的喷泉。本文在实现时,定义了一个数组 fnj,其中 j 表示第 j 个的水柱。喷泉可以 看做

24、是以喷射点为圆心向周围 360度方向上喷射的无数个水柱组成。按照这个思想,只 要将水柱进行 360度的旋转,喷泉就可以模拟出来了。 具体实现代码如下: alpha = (j*20+a)*PI)/180; ttx = tempp-x*cos(alpha)-tempp-z*sin(alpha); ttz = tempp-x*sin(alpha)+tempp-z*cos(alpha); vectd.x = ttx - cam.x; vectd.y = tempp-y - cam.y; vectd.z = ttz - cam.z; 湖南大学毕业设计(论文) 第 21 页 湖南大学软件学院 vect_m

25、ult( normalize( vectl.x *= 5; vectl.y *= 5; vectl.z *= 5 其中, “alpha = (j*20+a)*PI)/180”中的 20 表示 18 个水柱以间隔 20 度分布在一个 圆面。 4.6 纹理贴图 纹理贴图是一个比较烦琐的过程,它首先需要添加相应的映射函数、设置像素格 式和管理着色描述表。由于本文采用的粒子是一个个很小的正方体,所以可以不用设 置三维结构图,这样就减轻了工作量。 当以上步骤都完成后,就可以进行纹理贴图的主要环节了纹理映射。纹理映 射的关键是定义纹理、指定纹理在像素上的应用方式及启用纹理。 在本文的具体实现时,采用如下方

26、式定义纹理控制滤波,说明纹理的映射方式,启 用纹理。 (1) 定义纹理 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, texwid, texht, 0, GL_RGBA, GL_UNSIGNED_BYTE, teximage); (2) 控制纹理 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexCoord2f(0, 0);

27、glVertex3f(ttx-vectl.x), (tempp-y-upv.y), (ttz-vectl.z); glTexCoord2f(1, 0); glVertex3f(ttx+vectl.x), (tempp-y-upv.y), (ttz+vectl.z); glTexCoord2f(1, 1); glVertex3f(ttx+vectl.x), (tempp-y+upv.y), (ttz+vectl.z); glTexCoord2f(0, 1); glVertex3f(ttx-vectl.x), (tempp-y+upv.y), (ttz-vectl.z); (3) 说明纹理映射方式

28、 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 湖南大学毕业设计(论文) 第 22 页 湖南大学软件学院 (4) 启动纹理映射 glEnable(GL_TEXTURE_2D); (5) 完成纹理贴图 glTexCoord2f(0, 0); glVertex3f(ttx-vectl.x), (tempp-y-upv.y), (ttz-vectl.z); glTexCoord2f(1, 0); glVertex3f(ttx+vectl.x), (tempp-y-upv.y), (ttz+vectl.z); glTexCoo

29、rd2f(1, 1); glVertex3f(ttx+vectl.x), (tempp-y+upv.y), (ttz+vectl.z); glTexCoord2f(0, 1); glVertex3f(ttx-vectl.x), (tempp-y+upv.y), (ttz-vectl.z); 最终实现具有纹理贴图的喷泉代码如下: void CMyFountainView:DrawFountain() int j; struct particle *tempp; struct point vectd, vectl; float alpha, ttx, ttz; glBindTexture(GL_T

30、EXTURE_2D, texture0); AddParticles(); MoveParticles(); DeleteParticles(); glPushMatrix(); for (j=0; jx*cos(alpha)-tempp-z*sin(alpha); ttz = tempp-x*sin(alpha)+tempp-z*cos(alpha); 湖南大学毕业设计(论文) 第 23 页 湖南大学软件学院 / 计算方向矢量 vectd.x = ttx - cam.x; vectd.y = tempp-y - cam.y; vectd.z = ttz - cam.z; vect_mult(

31、 normalize( vectl.x *= 5; vectl.y *= 5; vectl.z *= 5; glColor4f(0.5, 0.5, 1, tempp-a); / 绘制多边形和粒子纹理映射 glTexCoord2f(0, 0); glVertex3f(ttx-vectl.x), (tempp-y-upv.y), (ttz- vectl.z); glTexCoord2f(1, 0); glVertex3f(ttx+vectl.x), (tempp-y-upv.y), (ttz+vectl.z); glTexCoord2f(1, 1); glVertex3f(ttx+vectl.x)

32、, (tempp-y+upv.y), (ttz+vectl.z); glTexCoord2f(0, 1); glVertex3f(ttx-vectl.x), (tempp-y+upv.y), (ttz- vectl.z); tempp = tempp-next; / 绘制下一个粒子列表 glEnd(); glPopMatrix(); 4.7 场景实现 喷泉当然是从地下喷射出来,需要一个地面来衬托喷泉的喷射。因此,本文绘制 了一个简单的地面进行场景的实现。 湖南大学毕业设计(论文) 第 24 页 湖南大学软件学院 这个地面只是一个简单的有纹理贴图的立方体,其定义如下(4 个顶点): glTexC

33、oord2f(0, 0); glVertex3f(-100, 0, -100); glTexCoord2f(2, 0); glVertex3f(-100, 0, 100); glTexCoord2f(2, 2); glVertex3f(100, 0, 100); glTexCoord2f(0, 2); glVertex3f(100, 0, -100) glBindTexture(GL_TEXTURE_2D, texture); 这样地面、喷泉就实现了简单场景。如图 7: 图 4-2 喷泉的模拟效果图 具体实现代码如下: BOOL CMyFountainView:RenderScene() gl

34、Clear(GL_COLOR_BUFFER_BIT); glLoadIdentity(); glBindTexture(GL_TEXTURE_2D, texture1); 湖南大学毕业设计(论文) 第 25 页 湖南大学软件学院 a += 0.2; gluLookAt(cam.x, cam.y, cam.z, 0, 0, 0, upv.x, upv.y, upv.z); / 绘制地面 glPushMatrix(); glRotatef(a, 0, -1, 0); glBegin(GL_QUADS); glTexCoord2f(0, 0); glVertex3f(-100, 0, -100);

35、glTexCoord2f(2, 0); glVertex3f(-100, 0, 100); glTexCoord2f(2, 2); glVertex3f(100, 0, 100); glTexCoord2f(0, 2); glVertex3f(100, 0, -100); glEnd(); glPopMatrix(); / 绘制喷泉 DrawFountain(); glFlush(); :SwapBuffers(m_pDC-GetSafeHdc();/交互缓冲区 return TRUE; 湖南大学毕业设计(论文) 第 26 页 湖南大学软件学院 5. 总结 本系统采粒子系统来模拟喷泉,利用 MFC框架实现场景模拟。突破了几何 模拟自然景物的限制,更加逼真、真实。系统在提高粒子处理规模的同时,提 高了绘制的效率,从而保证了绘制的实时。在具体的实现中,对速度,位置, 生存时间等让其在某个小范围内随机波动,增加了喷泉的动感。 不过,系统对水滴的模拟并没有做到位,只是简单地对正方体粒子使用纹 理贴图的方式进行模拟。粒子形状变化、大小变化以及水滴间的区别都没有实 现。水滴的材质和光照属性都只是依靠纹理贴图略微的体现,视觉效果稍差。 希望以后有机会深入研究图形学,改进此系统对水滴模拟的缺陷。 湖南大学毕业设计(论文) 第 27 页 湖南大学软件学院 致谢 在对本系统的整个开发过程中,得到了

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论