基于OpenGL与粒子系统的瀑布场景模拟.doc

上传人:laozhun 文档编号:2391578 上传时间:2023-02-17 格式:DOC 页数:34 大小:3.24MB
返回 下载 相关 举报
基于OpenGL与粒子系统的瀑布场景模拟.doc_第1页
第1页 / 共34页
基于OpenGL与粒子系统的瀑布场景模拟.doc_第2页
第2页 / 共34页
基于OpenGL与粒子系统的瀑布场景模拟.doc_第3页
第3页 / 共34页
基于OpenGL与粒子系统的瀑布场景模拟.doc_第4页
第4页 / 共34页
基于OpenGL与粒子系统的瀑布场景模拟.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《基于OpenGL与粒子系统的瀑布场景模拟.doc》由会员分享,可在线阅读,更多相关《基于OpenGL与粒子系统的瀑布场景模拟.doc(34页珍藏版)》请在三一办公上搜索。

1、福州大学至诚学院本科生毕业设计(论文)题 目: 基于OpenGL与粒子系统的瀑布场景模拟 姓 名: 林楠 学 号: 210991469 系 别: 计算机工程系 专 业: 计算机科学与技术 年 级: 2009级 指导教师: 谢伙生 2013 年 3 月 30 日独创性声明本毕业设计(论文)是我个人在导师指导下完成的。文中引用他人研究成果的部分已在标注中说明;其他同志对本设计(论文)的启发和贡献均已在谢辞中体现;其它内容及成果为本人独立完成。特此声明。论文作者签名: 日期: 关于论文使用授权的说明本人完全了解福州大学至诚学院有关保留、使用学位论文的规定,即:学院有权保留送交论文的印刷本、复印件和电

2、子版本,允许论文被查阅和借阅;学院可以公布论文的全部或部分内容,可以采用影印、缩印、数字化或其他复制手段保存论文。保密的论文在解密后应遵守此规定。论文作者签名: 指导教师签名: 日期: 基于OpenGL与粒子系统的瀑布场景模拟摘要随着计算机科学技术的迅猛发展,计算机图形学模拟大自然场景也成为一个新的热点研究课题。也随着关注度日益高涨,计算机图形学渐渐走进了人们的视野。动画,广告,电影、游戏,艺术设计等等都能看到它存在的身影。用粒子系统来进行瀑布场景的模拟是一种非常有效并且逼真的方法。由于粒子系统的特殊、微小特征,可以模拟很多不规则形状物体,不规则运动等等,这正好符合大自然很多事物的随意性,无规

3、律性。本文基于OpenGL与粒子系统进行一个瀑布场景的模拟。为了使模拟视觉效果逼真,本系统采用了OpenGL中的纹理映射、光照、颜色、视图等相关知识。首先,对现实瀑布特征进行分析,设计出一个瀑布模型,根据一定的物理知识及数学知识构造出瀑布模型的轨迹,飞流直下,遇到障碍物时飞溅反弹而起再做一个抛物线运动落下。然后通过粒子系统的实现原理,对粒子定义属性,采用二次曲面构造出一个球体并进行纹理贴图以及色彩融合。接下来,通过OpenGL中的相关函数,为瀑布场景的逼真,增添一些多角度旋转、鼠标移动、雾化、颜色变换、音乐播放、文字显示等功能。最后,VisualC+6.0作为编程工具实现以上代码。根据实验证明

4、,基于OpenGL与粒子系统来进行瀑布场景模拟,是一种在一般电脑上就可以实现且效果令人满意的方法。关键字:OpenGL,粒子系统,瀑布场景模拟,纹理映射Waterfall Scene Simulation Based on OpenGL and Particle SystemAbstractWith the rapid development of computer science and technology, simulation of nature scenes using Computer Graphics become a new hot topic. With such growi

5、ng attention, Computer Graphics gradually is applied to more and more fields, such as animation, advertisements, movies, video games and designs of art.Its a very effective and lifelike to simulate a waterfall scene with particle system. With particles special and tiny features, it can be used to si

6、mulate most of the irregular objects and random movements, which just reflects on the nature of nature. This paper describes a waterfall scene simulation based on OpenGL and particle system. In order to make the visual effect of simulation realistic, relevant knowledge including texture mapping, lig

7、hting, color and visions of OpenGL are utilized in this system. First of all, analysis of the characteristics is needed to build a model of a real waterfall. The trajectory of the waterfall can be reconstructed in the computer with certain knowledge of physics and mathematics. The trajectory of the

8、waterfall model can be described as follows: the water rush down, and then it bounce back on the encounter of an obstacle, following a parabolic motion before it reach the ground at last. Next, define the attributes of particles based on the implementation principles of the particle system. Construc

9、t a sphere with quadratic surface and finish the texture mapping and color fusion. Afterwards, to make the waterfall lifelike, use the correlation functions of OpenGL to realize some features like multi-angle rotation, mouse movement, atomization, color transformation, music playing, text display an

10、d so on. Last but not least, Visual C+ 6.0 is chosen as the experiment platform. According to experiment results, its feasible and satisfying to simulate a waterfall scene with OpenGL and particle system on computers.Key Words: OpenGL, Particle System, Simulation of Waterfall, Texture Mapping目 录第1章

11、绪论11.1 课题背景11.2研究意义11.3研究内容21.4论文结构2第2章 相关技术介绍32.1 OpenGL技术32.1.1 OpenGL基本操作32.1.2 OpenGL开发库32.1.3 OpenGL函数32.1.4 OpenGL应用环境42.2纹理映射42.3色彩融合42.4粒子系统实现步骤技术5第3章 瀑布系统的设计63.1系统大致框架63.2瀑布模型的定义73.3瀑布粒子的生成73.4瀑布粒子的更新与运动73.5瀑布粒子的消亡83.6瀑布粒子的绘制8第4章 瀑布模拟系统的实现94.1瀑布模型实现94.1.1瀑布粒子属性定义及初始化94.1.2瀑布粒子生成实现104.1.3瀑布粒

12、子运动、更新、消亡实现104.1.4瀑布粒子绘制实现114.2鼠标、键盘交互124.2.1 旋转交互124.2.2 雾化控制134.2.3文字显示144.2.4古诗朗诵144.2.5返回背景音乐144.2.6水流大小控制154.2.7鼠标移动154.3音乐添加174.4雾化效果184.5文字显示效果184.6光照变换效果20第5章 系统结果与分析225.1开发环境225.2系统结果与分析225.2.1旋转时不同光照效果分析225.2.2文字显示235.2.3水流控制245.2.4雾化效果25结论26谢辞28第1章 绪论1.1 课题背景1983年,粒子系统首先由Reeves提出1。粒子系统使用十

13、分简单的题材来构造复杂的、不规则的、模糊的、动态的事物。这为模拟花、草、云、雾、雪等自然景观提供了十分有效的技术手段。目前,已经有多例利用粒子系统模拟自然场景的成功案例。例如,万华根等人求解N-S方程时通过得到一个特殊解意外实现了一个十分真实的喷泉场景;管宇等人利用粒子系统实现了瀑布场景的实时模拟。除此之外,还有很多用粒子系统做的成功场景模拟的粒子。粒子的颜色、初始速度、初始位置、生命周期、衰减周期等等这些都是粒子的常用属性。使用大概值而不是绝对值的模糊参数占据全部或者绝大部分是很正常的。一些参数定义了中心值以及允许的范围2。近几年来,粒子系统不断发展、改进。并且这项技术被不断应用于模拟大自然

14、景观。1990年S.Karl提出粒子系统的并行绘制算法3。完成影片ParticleDream。文献提出节日焰火粒子系统的绘制算法4。实现多种焰火特殊效果。1998年M.Unbeschiden 和A.Trembilaki 运用粒子系统,从云的物理原理出发。结合纹理映射技术建立了云的模型5。OpenGL的粒子系统能够逼真的模拟雨雪、爆炸、烟火、喷泉、落叶、海浪、浮云等等自然景象。目前,计算机图形界已经出现了多种方法模拟自然事物,其中,粒子系统是一种公认的较为成功的方法,并受到广泛的研究、推广和应用。自然也具有了比较广阔的研究前景。OpenGL是是一个开放性很强的三维图形包,与窗口系统及操作系统独立

15、开来,具有较强的可移植性。基于OpenGL的多视口操作与色彩融合技术,利用粒子系统,可以实现在大型场景中的漫游效果。 1.2研究意义本课题对象为瀑布场景,用粒子系统建立模型,并且实现瀑布动态性。通过定义瀑布水流参数,建立一个基于粒子系统与相关物理、数学原理的瀑布水流运动模型 ,并且详细定义了相关参数;利用编程读取模型,在场景中绘制出来;此外还加入了音乐、光照、雾化、文字等效果来增加场景的真实感。瀑布场景的模拟粒子系统中较为少见的。瀑布较喷泉壮观,巨大的水流自上而下,倾盆而至,伴着阳光不同角度的照耀,形成一种美而壮于一体的景致,令人振奋。利用粒子系统模拟瀑布,从观赏角度和实际影视拍摄需要都极具研

16、究价值。1.3研究内容粒子系统,顾名思义,是由无数微小的粒子组成的系统。根据模拟对象的需要,每个粒子都被赋予一定的属性,包括初始位置、速度、颜色、生命期、运动规律等等。粒子的初始值根据公式随机产生。本文根据瀑布模型进行了如下具体设计内容:(1)、粒子属性定义;(2)、粒子绘制;(3)、粒子运动轨迹设计,粒子的初始化、更新、消亡;(4)、针对背景及粒子进行纹理贴图;(5)、通过鼠标、键盘实现人机交互,例如旋转、移动等等;(6)、光照、音乐、雾化设计。本文通过OpenGL原理与粒子系统,实现了一个简单瀑布场景模拟。利用纹理映射、色彩融合使效果更加逼真。采用一定物理知识及数学公式实现粒子轨迹运动。1

17、.4论文结构第1章介绍了粒子系统的发展背景,以及本文的研究意义、研究内容。第2章介绍了OpenGL技术、基本操作、开发库、基本函数及应用环境。纹理映射,色彩融合技术。粒子系统实现的步骤。第3章描述了瀑布场景模拟的设计。第4章描述了瀑布场景模拟实现过程,重要代码解析。第5章展示瀑布场景模拟效果图以及简要分析。第2章 相关技术介绍2.1 OpenGL技术“开放式图形库”是OpenGL的全称,它是一个快捷方便的三维图形库。它的算法是美国SGI公司开发和优化的6。1997年,SGI公司和微软公司OpenGL放入了Windows2000中,VC+集成了OpenGL图形标准,使其在计算机三维图形领域得到了

18、广泛的推广应用。2.1.1 OpenGL基本操作OpenGL主要有三个函数库,分别是核心库、实用函数库和编程辅助库。OpenGL最基本的命令函数在核心库中。核心库中有一百多个函数,前缀是”gl”,用来建立几何模型、进行坐标变换、制造光照效果、进行纹理映射、产生雾化效果等所有的二维和三维图形操作。实用函数库是比核心库更高一层的函数库,它包括四十多个函数,这些函数前缀都为”glu”。2.1.2 OpenGL开发库使用OpenGL进行开发时,首先我们要现在计算机上进行配置,配制步骤如下:(1) 动态链接文件glut32.dull,glut.dull复制至Syswow64目录下;(2) 静态链接文件g

19、lut32.lib,glut.lib复制至VClib目录下;(3) 函数说明文件glut.h复制至VCinlude目录下。2.1.3 OpenGL函数1、窗口操作函数:glutInit()对glut进行初始化,并处理所有命令参数,此函数要在调用其它任何glut函数之前调用、glutInitDisplayMode()用来指定窗口模式、glutInitWindowSize()用来指定窗口大小、glutInitWindowPosition()用来指定窗口位置、glutGreatWindow用来创建一个支持OpenGL渲染环境的窗口;2、回调函数: GlutDisplayFunc()响应刷新消息、gl

20、utReshapeFunc()重新塑形、glutTimerFunc()定时器函数、glutKeyboardFunc()和glutMouseFunc()允许键盘的一个键或鼠标上的一个按钮与一个函数相关联、glutIdleFunc()强制刷新;3、程序运行函数:glutMainLoop()、glFlush()。2.1.4 OpenGL应用环境1、 硬件要求:cpu:Intel(R)Core(TM)i5时钟频率:2.4Ghz内存:2G硬盘:450G2、 软件要求:操作系统:64位操作系统OpenGL库:Visual C+6.0,freeglut库。2.2纹理映射OpenGL可以在软件如游戏显示界面里

21、,生成各种物体。可以赋予材质和对物体进行光照8。现实世界每个物体都不可能是百分之百光滑的,都具有自己的纹理。为此产生了纹理贴图技术,也叫纹理映射技术。对纹理映射的算法进行分类9。可以分为二维纹理映射和三维纹理映射两个大类。 图2-2二维纹理映射到三维物体表面图2.3色彩融合在OpenGL中,红、绿、蓝三种颜色混合而成组成不同的颜色,每种颜色成分使用在0.01.0之间的任意有效浮点数来表示颜色值。理论上可以产生无限种颜色,但实际上却是有限的。加入一个参数Alpha,用于指定每种颜色混合之后的特殊效果,如半透明效果等等。当OpenGL混合参数被激活时,Alpha值为0.0表示对象是完全透明的。而A

22、lpha值为1.0则表示对象是完全不透明的10。由于没有使用混合参数,因此这个值不起作用,可以设为1.0。2.4粒子系统实现步骤技术首先,先确定粒子的中心位置及粒子大小。大量的粒子构成一个粒子系统。如位置、速度、颜色、生命期、透明度等等都可以成为粒子的属性。粒子属性通常随机产生。例如由空间上的的某个位置的粒子源产生。粒子系统总是随着时间推移不断变化,任何一个粒子在生命周期中,每一个单位时间都要经历以下4个工作:(1) 粒子源产生粒子:根据初始值产生一定数目的粒子,其初始属性由随机函数产生。(2) 更新粒子的属性:本文随着时间的变化,瀑布例子的位置、运动方向、速度都会发生改变。(3) 删除死亡的

23、粒子:本文中的瀑布粒子根据其是否已经超过瀑布设定范围来判断是否从粒子系统删除。(4) 绘制粒子:粒子系统绘制出粒子,实现需要的视觉效果。第3章 瀑布系统的设计3.1系统大致框架制作一个瀑布模型场景的模拟,首先我们需要运用粒子系统,并且利用纹理映射对其进行贴图,使其效果更逼真。以下是瀑布粒子系统的大致框架:图3-1粒子系统大致框架图3.2瀑布模型的定义本课题,定义的瀑布模型,先进性直线运动,碰到崖壁时反方向弹起,最后做一个抛物线运动。令重力方向为z轴,水平方向y轴,垂直yz平面的为x轴,建立瀑布所在空间坐标系。粒子系统中的每个粒子都具有一组特定的属性,包括速度的大小、方向、初始位置等。3.3瀑布

24、粒子的生成生成粒子系统时,设定每一个粒子的初始位置都一致,引入随机函数,计算出每一个粒子初始速度大小及方向。3.4瀑布粒子的更新与运动粒子运动的过程中,每经过一个单位时间,粒子的速度大小、方向及位置都会发生改变。而速度又分为竖直方向上的速度和水平方向上速度,位置同样也有竖直和水平两个方向。速度竖直方向上的速度根据物理公式: 公式(3-1)做抛物线运动时水平方向上速度根据物理公式: 公式(3-2)水平方向位移公式: 公式(3-3)竖直方向位移公式: 公式(3-4)本文中瀑布的运动轨迹为先进行一段直线运动,碰到崖壁后反向弹起,最后做一个抛物线运动,到达底部时粒子消亡。本文中,粒子的更新通过HOWM

25、ANY所设定的数量来控制,如果活跃粒子数量不足,粒子源即发出新的粒子,并且每次更新数目由Toupdate来控制。3.5瀑布粒子的消亡每个粒子都有其出生,发展,死亡的生命历程,整个粒子系统不断更新,时刻保持着一种动态平衡,用来保证粒子总数不变。当粒子一旦生成就具了生存期,生命期随着粒子的运动缩短,当递减到一定的程度粒子就消亡,消亡的粒子从系统中删除,随之补充新进的粒子。实际应用中,也有其他方法来判断粒子的消亡。例如当粒子的颜色和透明度小于系统初始设定值,或者粒子的运动超出了规定的区域范围,这些均可以认为粒子已经死亡并将其从系统中删除。本文采用的方法是,当粒子超出了规定的区域的时候后,认为终结其生

26、命周期,此时粒子将从整个系统中删除,此时,如若粒子数目小于初始设置的粒子总数,那么系统马上增加新的粒子,从而达到整个系统的稳定。3.6瀑布粒子的绘制线段、多边形、球形都是绘制粒子的常用方法。至于用哪种方法,主要在于模型的不同而不同。本文用的是球形来绘制水粒子。并且利用纹理映射使水珠效果更加逼真。绘制水粒子时,根据水粒子初始位置坐标,及给定的水粒子半径d来构造粒子,再通过二次曲面纹理贴图来为粒子贴图,由于使用的是球形方法绘制,所以要将粒子坐标先平移至球心,贴图结束后再平移回当前坐标。第4章 瀑布模拟系统的实现4.1瀑布模型实现4.1.1瀑布粒子属性定义及初始化首先,给定一个总的粒子数量,每次更新

27、粒子数量。本文采用数组来定义粒子属性。从x、y、z三个方向位置坐标及速度给定粒子属性。接下来,再给定所需瀑布大小给定瀑布起始、终止、崖壁位置,为了模拟更加逼真,本文设立一个衰减时间及重力加速度,由于9.8数字太小,效果不明显,本人设定加速度为-30。如下为瀑布粒子系统属性定义及初始化:#define HOWMANY 1000000 /总的例子数int ToUpdate= 600 ; /每次更新数目float particlesHOWMANY7;#define TOP 2. /顶部位置#define BOTTOM -6. /底部位置#define LEDGE -3. /崖壁位置#define D

28、ELTA_T 0.02 /衰减单位时间#define GRAV -30. /重力加速度float tweak(float scale) /衰减计算方法return(scale*(2.*(float)rand()/RAND_MAX)-1.);void particlesInit(int i) / 粒子初始化particlesi0 = 0.; / x方向位置初始化particlesi1 = tweak(1.); / y方向位置初始化particlesi2 = TOP+tweak(.1); / z方向位置初始化particlesi3 = 0.; / x方向速度初始化particlesi4 = 3.+

29、tweak(.3); / y方向速度更新particlesi5 = 0.; / z方向速度更新 particlesi6 = -1.; / 做标记,活跃的粒子并且碰到壁架4.1.2瀑布粒子生成实现本文中,粒子的更新是根据屏幕上现显示的粒子是否小于HOWMANY来判断,如果没有足够的粒子,粒子源即根据ToUpdate数值进行生成。前提是,更新的数值不能大于ToUpdate,总的粒子数不能超过HOWMANY。其中,particlesi6 ,是一个标记,专门为粒子是否触碰到崖壁做记号,起初设置为-1,表示没有,如果碰到就记为1。以下为瀑布粒子生成代码实现:void waterfall(void)int

30、 j, k;for ( j=k=0; (j ToUpdate) & (k HOWMANY); k+ )/有没有足够的粒子就记下这里潜在的粒子if (particlesk6 0.)particlesk6 = 1.;j+; for (j=0; j 0.)drawParticle(j);update(j);4.1.3瀑布粒子运动、更新、消亡实现粒子在时间和位置上进行更新,只有有效的、活跃的粒子才进行判断,粒子是否落下超过视野范围,是的就消失。本文中,粒子没有生命期,生命的消亡完全根据其是否已经超出底部位置决定。起初,粒子都在瀑布顶部位置,更新时首先判断粒子是否已经超出底部位置,如若超出即从粒子系统删

31、除。没有的话继续判断,坐标z方向值大于崖壁坐标z值表示粒子还在崖壁上方,此刻只要改变竖直方向速度及位置。相反,如果粒子已经运动到崖壁,那么根据函数更新水平方向速度,位置,颠倒竖直方向速度,更新竖直方向速度及位置。实现代码如下所示:void update(int i)if (particlesi2 LEDGE) /粒子是否还在崖壁上方运动 particlesi5 += GRAV*DELTA_T*(1.-tweak(.1);/ 改变竖直方向速度particlesi2 += particlesi5*DELTA_T; /改变竖直位置 Else /粒子是否撞击到壁上,做标记 if (particlesi

32、6 5)camYaw = camYaw-5;if(key=q) /向y轴负方向旋转 camYaw -= .1; if(camYaw 2)camPitch = 2;if(key=a) /向x轴负方向旋转 camPitch -= .1; if(camPitch -2) camPitch = -2;if(key=x) /向z轴正方向旋转camRadius += .3;if(key=z) /向z轴负方向旋转 camRadius -= .3; if(camRadius 1.0)camRadius = 1.0;display();4.2.2 雾化控制起初,int show_FOG=0;表示没有。当按下键盘

33、c键时,调用函数,实现雾化效果。再次按下时,雾化效果消失。以下为代码实现:int show_FOG=0;void keyboard(unsigned char key, int x, int y)if (key = c) /是否显示雾化show_FOG = !show_FOG;display();4.2.3文字显示起初,int first_line=0,second_line=0;表示没有。当按下键盘r、t键时,调用函数,分别显示古诗第一句、第二句。再次按下时,文字消失。以下为代码实现:void keyboard(unsigned char key, int x, int y)if(key=r

34、) /第一句介绍 first_line = !first_line; if(key=t) /第二句介绍second_line = !second_line ;display();4.2.4古诗朗诵当按下键盘l键,对音乐进行初始化,再播放古诗朗诵音乐。实现代码如下:void keyboard(unsigned char key, int x, int y)if(key=l)InitFMOD(); / 初始化音频文件 FSOUND_Stream_Play(FSOUND_FREE,mp3back); / 播放古诗音乐 mp3display();4.2.5返回背景音乐由于背景音乐是打开时自动播放的,但

35、如果播放完古诗朗诵没有进行任何操作,不会自动跳回背景音乐,而是不断循环古诗音乐,所以,本文特意加入此操作。当按下键盘m键,对音乐进行初始化,再播放背景音乐。实现代码如下:void keyboard(unsigned char key, int x, int y)if(key=m) InitFMOD1(); / 初始化音频文件 FSOUND_Stream_Play(FSOUND_FREE,mp3back);/ 播放背景音乐 mp3display();4.2.6水流大小控制起初,本文对ToUpdate设定值为600,此操作是对这个值进行更改,实现瀑布水流大小,显示出干涸和湍急两种视觉效果。u为增加

36、水流量,d为减少水流量。增加的值没有上限,对减少到0时,本文设定最小为50。以下是代码实现部分:void keyboard(unsigned char key, int x, int y)if(key=u) /增加瀑布单位时间更新粒子数 ToUpdate= ToUpdate+50 ; if(key=d) /减少瀑布单位时间更新粒子数 ToUpdate= ToUpdate-50 ;if(ToUpdate0) ToUpdate=50; display();4.2.7鼠标移动鼠标操作类似于键盘操作。不同的是,鼠标移动要先记下当前摄像机位置,此刻鼠标位置就相当于摄像机,在设定范围之内,随着移动呈现出不

37、同瀑布角度。涉及到鼠标有两种状态,一种是按下,一种是未按下两下状态,所以,本文对是否按下鼠标并按下左还是右键给予判断。并且每次移动后,将新的坐标传回摄像机。void mouse(int button, int state, int x, int y) / 将现在摄像机位置保存到当前鼠标mx = x;my = y;if(state = GLUT_DOWN)mdown = 1;elsemdown = 0;buttonDown = button; / 记下按下哪个键void motion(int x, int y) if(buttonDown = GLUT_LEFT_BUTTON) / 对准当前摄像机y轴位置camYaw += 0.02*(GLfloat)(mx-x); / y坐标移动的范围在06.28之间if(camYaw 6.28)camYaw = c

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

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号