收藏 分享(赏)

基于OpenGL粒子系统的喷泉模拟.doc

上传人:gnk289057 文档编号:4408681 上传时间:2018-12-27 格式:DOC 页数:33 大小:775KB
下载 相关 举报
基于OpenGL粒子系统的喷泉模拟.doc_第1页
第1页 / 共33页
基于OpenGL粒子系统的喷泉模拟.doc_第2页
第2页 / 共33页
基于OpenGL粒子系统的喷泉模拟.doc_第3页
第3页 / 共33页
基于OpenGL粒子系统的喷泉模拟.doc_第4页
第4页 / 共33页
基于OpenGL粒子系统的喷泉模拟.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

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

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

3、该方式模拟喷泉比较真实,速度快,在普通的微机上可以得到令人满意的效果。关键词:粒子系统,喷泉模拟,特效湖 南 大 学 毕 业 设 计 (论 文 ) 第 II 页湖南大学软件学院The Fountain Simulation Based on OpenGL Particle SystemAuthor: Feng LiangTutor: Sheng YuxiangAbstractWith the computer simulation technology continues to improve, people is demanding increasingly on the simulatio

4、n of real things, 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 l

5、andscape, is an 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 s

6、o on, the features 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, achiev

7、ed a more realistic 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 simulat

8、ion way is a real fountain comparison, speedly, in general PC can get satisfactory results.Key Words:Particle systems, fountain simulation, effects湖 南 大 学 毕 业 设 计 (论 文 ) 第 III 页湖南大学软件学院目 录1. 绪论 11.1 自然景物模拟概述 11.2 粒子系统的背景及其介绍 11.3 国内外研究现状 21.4 喷泉模拟的要求及意义 32. 相关学术知识 52.1 物理学知识 52.2 数学知识 52.3 OPENGL .6

9、2.4 MFC.73. 粒子系统的设计 103.1 PARTICLE SYSTEM API.103.2 常见的粒子运动模型 113.3 喷泉模拟的算法 123.3.1 喷泉粒子初始化 123.3.2 喷泉粒子的运动轨迹 133.3.3 粒子的消亡 133.3.4 喷泉绘制 143.4 纹理映射技术 144. 系统实现 164.1 开发环境 164.2 粒子生成 164.3 粒子活动 174.4 水柱生成 194.5 喷泉旋转 204.6 纹理贴图 21湖 南 大 学 毕 业 设 计 (论 文 ) 第 IV 页湖南大学软件学院4.7 场景实现 235. 总结 .26致谢 .27参考文献 .28湖

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

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

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

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 filling”基本单元模拟生成那种随时间改变形状,但又基本保持不变的实体,如随风飘动的花草树

15、叶。此后从理论到技术都得到了进一步发展: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代码如下:void CMyFountainView:AddParticles()struct pa

17、rticle *tempp;int i, j;for (j=0; jprev = 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; / 粒子方向/ 开始位置的坐标tempp-x = 0;tempp-y = 0;tempp-z = 0;tempp-xd = cos(tempp-d*3.14159)

18、/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、粒子移动的实现:首先需要定义了一个指针*tempp,通过下面的方式来计算粒子下个位置的坐标,以此来实现粒子的移动:Temp-x+=tempp-xd;Temp-z+=tempp-zd;Temp-y+=-(9

19、.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 是给定的初始高度。粒子通过坐标的不断变化进行活动,这样就可以形成一个水柱。湖 南 大 学 毕 业 设 计 (论 文 ) 第 18 页湖南大学软件学院代码如下:void CMyFountainView:MoveParticles(

20、)struct particle *tempp;int j;for (j=0; jtype = 0) / 如果粒子处于运动状态tempp-x += tempp-xd;tempp-z += tempp-zd;/ 计算粒子的高度 H = gt2/2tempp-y = -(9.8*(tempp-t*tempp-t/4)/2+122.5;tempp-t += 0.1; / 增加粒子寿命if (tempp-y type = 1; / 如果粒子位于地面else / 粒子位于地面tempp-y = -(9.8*(tempp-t*tempp-t/4)/2+122.5; tempp-a -= 0.1; / 粒子

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

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

23、其中 j 表示第 j 个的水柱。喷泉可以看做是以喷射点为圆心向周围 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;湖 南 大 学 毕 业 设 计 (论 文

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

25、具体实现时,采用如下方式定义纹理控制滤波,说明纹理的映射方式,启用纹理。(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,

26、 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), (tempp-y+upv.y), (ttz+vectl.z);glTexCoord2f(0, 1); glVertex3f(ttx-vectl.x), (tempp-y+upv.y), (ttz-vectl.z);(3) 说明纹理映射方

27、式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);glTexC

28、oord2f(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_TEXTUR

29、E_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(normaliz

30、e(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), (tempp-y+upv.y),

31、 (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 个顶点):glTexCoord2f(0, 0); glVert

32、ex3f(-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()glClear(GL_COLOR_BUFFER_BIT);gl

33、LoadIdentity();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);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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 大学论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报