基于OpenGL的烟花仿真【毕业论文】

基于OpenGL的烟花仿真【毕业论文】

ID:430555

大小:774.50 KB

页数:28页

时间:2017-08-01

上传者:U-944
基于OpenGL的烟花仿真【毕业论文】_第1页
基于OpenGL的烟花仿真【毕业论文】_第2页
基于OpenGL的烟花仿真【毕业论文】_第3页
基于OpenGL的烟花仿真【毕业论文】_第4页
基于OpenGL的烟花仿真【毕业论文】_第5页
资源描述:

《基于OpenGL的烟花仿真【毕业论文】》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

毕业论文本科毕业论文(20届)基于OpenGL的烟花仿真专业:计算机科学与技术28 毕业论文摘要随着计算机图形技术的飞速发展,计算机图形学已经成为了快速、经济地生成图形,处理图形的有力工具。用计算机生成真实感图形一直是计算机图形学中最具有挑战性的研究方向之一,其中,不规则物体的建模是该领域的研究重点和难点。在不规则物体建模方法中,粒子系统方法被公认为是最成功一种图形生成算法之一,并得到了深入的研究和广泛的应用。生成客观世界真实感图形的关键是建立恰当的模型。在虚拟环境中,有一类不规则物体,即特殊效果(如烟雾、碎片、烟花等),它们具有不光滑、不确定性、不规则性及运动变化性,而且这种变化时极其复杂、混乱的,并受到周围环境的影响,不可能精确地描述它们,对它们的研究十分困难。然而这些效果却是某些虚拟场景(如虚拟战场)中必不可少的组成部分,因此对不规则运动物体的建模理论极其真实感图形生成算法的研究成为计算机图形学中的难点之一。尽管如此,在对不规则物体的研究上,国内外研究学者一直在努力探索中,并取得了一些成果。本课题设计了基于OpenGL粒子系统的烟花模型,详细讨论了模型中粒子的属性及其变化,实现了具有较强真实感的动态变化和抛物变化等烟花特征,采用了纹理映射和视线跟踪技术进行三维烟花渲染。该方式模拟烟花比较真实,速度快,在普通的微机上可以得到令人满意的效果。【关键词】:OpenGL,烟花,粒子系统,纹理映射28 毕业论文FireworkssimulationbasedonOpenGLAbstractWiththedevelopmentofComputergraphicstechnology,ComputerGraphicshasbecameapoewefultoolforgeneratinganddealingwithgraphicsfastandeconmically.Usingcomputergeneratetherealisticgraphicshasbeenoneofthechallengingresearchdirection,thereinto,theirregularobjectmodeling;researchinthefieldisimportantanddifficult.Inthemethodsofirregularobjectmodeling,theParticleSystemisrecognizedasthemostsuccessfulinthegraphicsgenerationalgorithms,andgainedanin-depthstudyandextensiveapplication.Thekeyofgenratingtherealisticgraphicsintheworldisestablishinganappropriatemodel.Inrhevirtualworld,thereisakindofirregularobjects,thatisthespecialeffects(suchantherisingsmoke,chipetc,thefireworks),theyarenotsmooth,uncertainly,irregularly,moveablyandvariationally,andthisvarietyisextremelycomplex,confusing,andaffectedbythesurroundingenvironment.Itisimpossibletodescribethemaccurately,theirresearchisverydifficult.Buttheseeffectsareindispensableforsomevirtualscenes(suchasvirtualbattlefield).Therefore,theresearchofmodelingtheoryandrealisticimagegeneratingalgorithmabouttheirregularathleticobjectshasbeenoneofthedifficultiesinthecomputergraphics.Nevertheless,domesticandforeignscholarshavebeenworkinghardtoexplore,andhaveachievedsomeresultsintheresearchofirregularobjects.ThistopicdesignedthefireworksmodelbasedontheOpenGLparticlesystem,discusseddetaillythepropertiesofparticlesinthemodelanditschanges,achievedamorerealisticwiththedynamicchangesandchangesinparabolicfireworksfeatures,usedtexturemappingandtrackingtechnologyfor3-DvisionFireworksrendering.Thesimulationwayisarealfireworkscomparison,speedly,ingeneralPCcangetsatisfactoryresults.【Keywords】Opengl,Fireworks,Particlesysetm,Texturemapping28 毕业论文目录摘要IABSTRACTII1.绪论11.1课题研究的背景与目标11.2论文的结构与本文的主要工作22.理论基础与发展现状42.1理论基础42.2OpenGL52.3VisualC++6.062.4粒子系统发展的现状72.5现有的烟花粒子系统分析83.烟花粒子系统模型的建立93.1烟花粒子模型93.1.1烟花粒子103.1.2烟花粒子数量定义113.1.3烟花粒子的初始化123.2烟花粒子运动模型133.3烟花粒子的消亡144.实验设计与编码实现154.1发开语言与开发环境154.2关键技术与设计思路154.3OpenGL相关技术154.4编码实现164.4.1烟花基本模型的编码实现164.4.2烟花轨迹的编码实现185.实验仿真1928 毕业论文6.总结21参考文献2228 毕业论文1.绪论1.1课题研究的背景与目标烟花是我们生活中最常见的一种东西,很早以前,我们国家就有节日期间燃放烟花的风俗。节日期间燃放烟花的确会给我们的节日增添喜庆的气氛,但是同时会给我们的人身安全带来很大的威胁,也会给我们带来很多的环境污染问题。烟花的破坏能力很强,如果在燃放的时候人们不注意躲闪,将会给人们的人身和财产带来很大的损失。而且烟花的原料中包含很多的化学元素,这些化学元素中有很多都是有毒元素,比如像硫、硝之类的元素,燃放后会释放出许多有害气体,对环境会造成很大的污染。为了解决这个问题,国家颁布了有关的政策,禁止或者限制条件人们燃放烟花。节日里少了烟花的陪伴,人们心里就会感觉节日不够热闹,心里不可避免会有些失落。近几年来,烟花等不规则物体模拟的研究一直是图形学研究者研究的热点。研究希望在计算机上来实现并转换到物理硬件上来实现烟花的燃放效果,从而弥补人们节日期间缺少烟花陪伴的遗憾,这种烟花我们把它称作“电子烟花”。这种“电子烟花”不仅形状、颜色都丰富多彩,而且烟花燃放的形状、时间、爆炸声音等都可以自己控制,最重要的一点是它是通过计算机来控制的,因此它非常安全,并且完全不会污染环境。通过计算机图形学研究者的努力,“电子烟花”己经发展的很快,一方面电子烟花模型有很好的可移植性,被广泛用于大型3D游戏的制作,增强游戏的逼真效果。另外一个方面“电子烟花”具有很高的艺术性和观赏性,在国家大型节日、城市某些庆祝活动中都大放异彩,往往会成为整场活动的亮点,也给人们的生活添加了别样的风彩[1]。本篇论文重点研究了粒子系统的基本原理,分析了现有的基于粒子系统的烟花模型,对比了这些模型的优点和缺点。接着建立了烟花的基本模型,然后对基于粒子系统的烟花基本模型进行了改进。改进的烟花模型中,基于粒子系统的基本原理,结合相应的动力学方程、VisualC++6.0、OpenGL纹理填充技术等方法,实现了沿轨迹运动的烟花在计算机上的可视化。此外,论文讨论了如何在VisualC++6.0提供的可视化集成平台下构建烟花动态模型的过程。论文中所包括的具体内容如下:1.分析烟花运动的特性,并用粒子系统的基本原理建立烟花运动的基本模型,同时利用OpenGL中的纹理映射技术在计算机上实现对其的模拟。2.研究对对基本的烟花模型进行改进,采用在烟花粒子的运动阶段设定相应的运动曲线方程的方法,使烟花粒子沿着相应的轨迹运动,实现了沿轨迹运动烟花的模拟。3.研究对基本的烟花模型进行了改进,采用粒子系统的基本原理和OpenGL纹理填充技术相结合的方式,实现了图案烟花的模拟,并且在计算机上实现相应模型的模拟。28 毕业论文1.2论文的结构与本文的主要工作本篇论文所包括的主要内容是粒子系统的基本原理及发展现状介绍、烟花粒子系统模型的建立与烟花粒子模型的改进、实验设计与编码实现以及对实验结果的评价等内容。论文的具体内容如下:1.粒子系统的基本原理与研究现状。在这一部分中介绍粒子系统基本原理的主要内容,分析了现有的利用粒子系统实现的自然现象的仿真,特别是利用粒子系统基本原理建立的烟花模型,并且分析比较了各种模型的优缺点。2.烟花粒子系统的建模。在这一部分中利用前面阐述的粒子系统基础理论,结合烟花燃放的具体特点,建立了基于粒子系统与纹理映射的烟花动态模型,模拟了烟花从上升到爆炸,再到消失的过程。3.烟花粒子系统的改进。这一部分是本论文的重点部分,在这一部分中对第二部分建立的基于粒子系统的烟花基本模型进行了改进。改进的内容主要包括三个部分,主要内容如下:(1)在己经建好的烟花模型中,改变烟花粒子上升阶段的运动轨迹,在烟花粒子的运动阶段设定相应的运动曲线方程,使烟花粒子沿着相应的轨迹运动,实现了沿轨迹运动烟花的模型。(2)在已建好的烟花粒子基本模型中结合VisualC++6.0提供的鼠标消息函数,通过鼠标来控制烟花燃放的位置,从而使得烟花模型可控性、灵活性加强。(3)在已建好的烟花粒子基本模型中结合纹理映射的相关知识,实现图案烟花的模拟,使得烟花的形状更加千姿百态。4.实验设计与编码实现。在这一部分中,我们在VisualC++6.0提供的可视化的集成开发环境下,利用C++语言同时结合OpenGL图形库,实现第三部分所要求的烟花模拟效果。5.效果评价与应用。在这一部分中,主要是对改进的烟花粒子系统的实现效果进行评价,阐述了修改之后的粒子系统所具有的优势,并且对改进后的烟花模型的不足之处提出期望。本文的主要工作有以下两个方面:1.烟花的建模:烟花的姿态虽然多种多样,但是基本模型是统一的。所以我们可以建立一个通用的烟花模型。烟花可以看做众多烟花粒子组成的,系统在初始一帧首先产生一定数量的烟花粒子,并对烟花粒子的各种属性,比如初始位置、初始速度和加速度、初始颜色等进行初始化。忽略空气阻力和其他作用力而只考虑重力作用,这些烟花粒子的运动可以简化成:一、烟花粒子上升阶段,烟花粒子Y轴正向以重力加速度G减速上升运动,如果烟花粒子是竖直上升,则X,Z轴方向上的速度一直都是0,其他的情况则赋予烟花粒子x,z轴相应的速度和加速度;二、烟花粒子爆炸阶段,当烟花粒子z轴正向速度减为零时,烟花粒子即爆炸。爆炸时烟花粒子X,Y,28 毕业论文Z轴方向均有速度。速度设定的不同,烟花粒子运动的轨迹则不同;三、烟花粒子的消失阶段,当烟花粒子的生命周期随着时间的更新减为0时,或者烟花粒子的运动位置超过了系统所设定的可视化的区域,则从系统中把这些烟花粒子删除[2]。2.烟花的绘制:利用建立好的烟花模型,利用VisualC++6.0提供的可视化的集成开发环境下,利用C++语言同时结合OpenGL中纹理映射技术,实现烟花的动态仿真绘制。通过对烟花模型的各项参数进行调试,得到不同的烟花仿真效果,并且对烟花基本模型进行改进,实现沿着轨迹运动的烟花、用鼠标控制烟花的绽放效果和用OpenGL纹理填充实现图案烟花。28 毕业论文2.理论基础与发展现状2.1理论基础用计算机模拟各种运动现象如云层,海浪,烟花爆竹,烟火等等自然风光。这些一直是计算机图形学的研究人员研究的重点。Reeves在1983年首次推出粒子系统(Particlesystem)模型,该模型可以用来模拟不规则(FuzzyObject)模糊的物体。粒子系统来模拟不规则物体的基本原理是将不规则形状的物体看作许多粒子组成,这些粒子被赋予相应的属性,比如颜色、速度、生命周期等等,粒子的这些属性随时间的更新而不断地改变,从而模拟出不规则物体及其运动变化的过程[3]。用粒子系统来模拟不规则物体的运动方法很简单,利用粒子系统的基本原理,结合其他的方法,可以实现很多自然现象的模拟。图形学研究者正在努力的改进这种方法,从而使它在图形学的研究中扮演更重要的角色[4]。粒子系统把要模拟的不规则物体定义为大量随机分布的微小粒子图元组成,在粒子系统中,粒子图元的形状可以是小球、立方体、正四面体或者其它形体。每个粒子都有一组属性,如初始位置、速度、运动方向、颜色和生命期等。一个粒子究竟有些什么样的属性,主要取决于具体应用。比如说用来模拟烟花的粒子的颜色一般不是单一的颜色,而都是五颜六色的。运动方向一般都是竖直向上或者以一定的角度偏转向上运动,这样就能得到比较好的仿真效果。粒子系统是一个动态的模型,粒子在系统中要经过“产生”、“运动更新”和“消亡”三个阶段。系统初始一帧的阶段要产生相应数目的初始粒子,并且在初始一帧赋予其初始属性。随着时间的推移,粒子的各个属性都随着待模拟物体的运动特性而不断发生更新,同时系统检测出超过生命周期或者超过设定区域的粒子并把它们从系统中删除,并且产生出新的粒子。众多这样的粒子在系统中不断的运动,就能很好的模拟出不规则物体的运动过程[5]。粒子系统的实现可以划分为两个不同的阶段:参数更新(模拟阶段)和粒子渲染阶段。每个循环执行一帧动画。在模拟阶段,根据所要模拟的物体的物理模型,初始化每个粒子的速度、颜色、生命周期等等参数,然后检查每个粒子是否己经超出了生命周期或者超出系统设定的显示区域,一旦超出就将这些粒子从模拟过程中删除,否则就根据已‘经建立的物理模型更新粒子的各个属性[6]。一般的模拟过程基于所要模拟物体的运动特性,同时会考虑温度、风力等外力因素,至于粒子之间的碰撞检测因为其计算量很大,为了简化模拟过程,对于大多数模拟来说可以省去不做。在更新完成之后,就进入粒子渲染阶段,为了使模拟效果更加真实,每个粒子通过用OpenGL的纹理映射进行渲染,把纹理图片映射到相应的粒子图元上,从而得到所要模拟的效果[7]。通常用粒子描述一个对象的过程如图2.1所示。28 毕业论文根据物体的运动特性对粒子进行移动和变换分析要模拟物体的特性,定义粒子的初始属性分析要模拟物体的运动特性zxingzhi性系统中加入新的粒子,并且赋予新粒子一定的属性删除已经超过生命周期的粒子绘制所有有生命的粒子图2.1用粒子描述一个对象的过程2.2OpenGL0penGL的英文全称是“OpenGraphicsLibrary”,即“开放图形库”。OpenGL是由独立的机构ARB(OpenGLArchitectureReviewBoard,OpenGL体系结构审查委员会)管理的。其中IBM、SGI、Intel、Microsoft、Compaq等著名厂商都是这个委员会的成员。独立组织OPC(OpenGLPerformanceCharacterizationCommittee)负责管理和发布OpenGL的性能测试基准。OpenGL是一个三维的计算机图形和模型库,它是由SGI公司为其图形工作站开发的IRISGL演变而来的。IRISGL是一个工业标准的3D图形软件接口,功能虽然强大但是移植性不好,于是SGI公司便在IRISGL的基础上开发了OpenGL。自1992年首次发布以来,OpenGL迅速成为应用最为广泛的二维和三维图形编程接口。从应用开发的角度看,OpenGL是一些绘图命令,利用这些命令能够方便地模拟或者生成二维和三维的几何物体,并可以将这些几何物体按某种方式存储到帧缓冲区(FrameBuffer)——记录生成图案的缓存区。在Visualc++上进行OpenGL编程时,OpenGL的绘图过程可以看作是先用OpenGL语句在openGL的绘图环境RenderContext(RC)中画好图,然后再通过一个交换缓冲(Swapbuffer)的过程把图传给操作系统的绘图环境Devicecontext(DC)中,进而在屏幕上显示。OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植;OpenGL可以与VisualC++紧密接口,便于实现机械手的有关计算和图形算法,可保证算法的正确性和可靠性;OpenGL使用简便,效率高。它具有七大功能:1:28 毕业论文建模:OpenGL图形库除了提供基本的点、线、多边形的绘制函数外,还提供了复杂的三维物体(球、锥、多面体、茶壶等)以及复杂曲线和曲面绘制函数。2:变换:OpenGL图形库的变换包括基本变换和投影变换。基本变换有平移、旋转、变比镜像四种变换,投影变换有平行投影(又称正射投影)和透视投影两种变换。其变换方法有利于减少算法的运行时间,提高三维图形的显示速度。3:颜色模式设置:OpenGL颜色模式有两种,即RGBA模式和颜色索引。4:光照和材质设置:OpenGL光有辐射光、环境光、漫反射光和镜面光。材质是用光反射率来表示。场景中物体最终反映到人眼的颜色是光的红绿蓝分量与材质红绿蓝分量的反射率相乘后形成的颜色。5:纹理映射。利用OpenGL纹理映射功能可以十分逼真地表达物体表面细节。6:位图显示和图象增强图象功能除了基本的拷贝和像素读写外,还提供融合、反走样和雾的特殊图象效果处理。以上三条可使被仿真物更具真实感,增强图形显示的效果。7:双缓存动画双缓存即前台缓存和后台缓存,简言之,后台缓存计算场景、生成画面,前台缓存显示后台缓存已画好的画面。此外,利用OpenGL还能实现深度暗示、运动模糊等特殊效果。从而实现了消隐算法。2.3VisualC++6.0C++是以C语言为基础发展起来的一种新的程序设计语言。它保持了对C语言的兼容性,允许指针的存在,允许程序员动态高效的管理和使用内存。它是一种基于静态数据类型检查的面向对象的程序设计语言。它支持过程化程序设计、多重编程范式、数据抽象、图标制作等等泛型程序设计等多种编程设计风格。一种语言只有在一种界面下的开发环境下,才很容易得到广泛的使用。VisualC++6.0作为C++的开发工具,已成为专业程序员进行软件开发的首选工具,是使用最广泛的开发工具。它是微软公司VisualStudio6.0开发工具套件中的重要组成部分。VisualC++6.0不仅仅是一个C一编译器,而且还是一个基于Window操作系统的可视化集成开发环境(integrateddevelopmentenvironment}IDE)。它以面向对象的C++编程语言为基础,辅以在代码层次上对WindowsAPI进行封装的MFC类库、COM,ATL等技术,成为众多企业开发Windows平台应用程序的首选。VisualC++6.0它大概可以分成三个主要的部分:1.DeveloperStudio:这是一个集成开发环境,它提供了一个很好的编辑器和很多的Wizard,但它仅仅是一个开发环境,实际上它没有任何编译和链接程序的功能。2.MFC:MFC(MicrosoftFoundationClasses)是微软提供的一个框架和引擎,利用它可以很方便的在C++环境下编写应用程序。MFC是WinAPI与C++的结合,MFC应用程序的总体结构通常由开发人员从MFC类派生的几个类和一个CWinApp类对象(应用程序对象)组成。MFC提供了MFCAppWizard自动生成框架。3.28 毕业论文PlatformSDK。它是VisualC++和整个VisualStudio的核心部分,简单的来说,PlatformSDK是以MicrosoftC/C++编译器为核心,配合MASM,辅以其他一些工具和文档资料。VisualC++6.0的开发过程中,编译器首先负责将C++源代码编译成汇编文件,转换为中间文件(obj文件),然后用连接器将相关的中间文件连接在一起,生成可执行的二进制文件。其具体的过程如下:(1)源程序经过预处理后交给编译器。(2)如果代码无误,编译器首先将源程序代码生成汇编程序,再生成若干个目标程序(obj)文件。(3)链接器负责将目标程序进行连接,生成可执行程序。2.4粒子系统发展的现状自从1983年Reeves首次提出粒子系统的模型以后,在图形学建模技术的研究中,图形学研究者利用粒子系统的基本原理己成功地模拟了许多自然景观,比如火焰、瀑布、飘雪、焰火、烟雾等等,并且得到了很好的应用和发展[8]。在国内,万华根、金小刚等人在研究了粒子系统的基本原理之后,通过求解Navier-Stokes方程的一个特例,将元球作为基本的粒子图元,并且采用基于BezierClipping的光线跟踪方法实现了实时喷泉水流运动的模拟。李清畅、杨高波等人深入研究了焰火燃放的特点,建立了基于粒子系统的焰火模拟模型。并且通过对焰火模拟基本算法的改进,实现了适合于大规模焰火模拟燃放的数据结构,同时结合Billboard技术,使得焰火模拟燃放的效果更加逼真[9]。伍艳莲、赵青松等建立了基于粒子系统的降雪模型,结合OpenGL纹理映射技术,模拟出比较真实的实时雪景[10]。在国外,o’Brien和Hodgin等人利用粒子系统的基本原理,结合体模型、表面模型等模型,模拟了水流下落后水花溅起的情景。Peacheyg和Fournier等人利用粒子系统的基本原理,实现了海浪被风吹过之后形成的浪花的模拟。Goss等人利用粒子系统的基本原理,实现了船舶行驶轨迹的模拟。Yngve利用粒子系统模拟了爆炸的过程。Fost利用粒子系统实现了在三维环境中的粘稠液体运动情景的模拟[11]。经过几十年的发展,粒子系统及其应用在不断的完善和成熟。现有的粒子系统可以大致分为两类:非独立的粒子系统和独立的粒子系统。非独立的粒子系统是指粒子和它相邻的粒子之间有相互的作用力。这种作用力可以初始设定之后就不再改变或者随着系统每一帧的更新而不断变化。非独立的粒子系统可以很好的应用于基于物理模型的建模中,使模型具有很好的可塑性。根据模型的需要,非独立的粒子系统有时候还需要碰撞检测[12]28 毕业论文。独立的粒子系统是指粒子和它相邻的粒子之间没有任何的相互作用力,每个粒子都是一个独立的个体。粒子在运动过程中,根据具体的模型,会受到许多外力的影响,如重力、温度、风力,磁场力等。独立的粒子系统己经被广泛的应用于雪景、火焰、瀑布、爆炸等自然现象的模拟。本文所述的烟花粒子系统即属于独立的粒子系统,烟花各个粒子之间是相互独立的,没有相互作用力。单个的烟花粒子根据模型,受到重力、风力等外力的作用,而且不需要做粒子之间的碰撞检测[13]。2.5现有的烟花粒子系统分析自从粒子系统基本原理被提出以后,国内外的研究学者利用粒子系统的基本原理,结合3DMax,OGRE,OpenGL纹理映射等相关技术,从不同的方向实现了对烟花场景的动态仿真。3DStudioMax,常简称为adsMax或MAX,是Autodesk公司开发的基于PC系统的三维动画渲染和制作软件[14]。它在广告、影视、游戏、多媒体制作、辅助教学以及工程可视化等领域应用比较广泛。基于粒子系统的基本原理,利用3DStudioMax建模软件建立烟花基本模型之后,在VC++开发环境中结合OpenGL图形库可以很容易的实现烟花效果的动态仿真。OGRE(Object-OrientedGraphicsRenderingEngine)是指面向对象图形渲染引擎。OGRE是一个用C++开发的面向对象的3D引擎,其使用方法非常灵活。周海波、陈福民等人研究了C>GRE粒子系统的核心原理,使用它所提供的粒子系统脚本语言,结合OpenGL纹理映射的方法,建立了基于OGRE粒子系统的烟花模拟模型。这种模型由于采用脚本语言,程序代码不需要修改,使开发者省去了重新编译程序的时间,提高了模拟的效率。同时设置了不同的参数,实现了多种烟花效果的模拟[15]。在现有烟花模型中,基本上都是基本粒子系统的原理来实现的。实现的烟花效果主要有天女散花形状、束.状、流星等形状。此外,基于粒子系统的烟花仿真算法,虽然能够很好的模拟烟花运动变化过程,但是所模拟的烟花形状仅仅局限于现实中比较规则形状烟花的模拟,我们可以给烟花粒子的运动设定相应的轨迹,使烟花粒子按照所设定的轨迹运动,实现按一定轨迹运动的烟花的模拟。同时,在己经建立的烟花基本模型中,结合OpenGL纹理填充技术,我们还可以实现图案烟花的模拟[16]。28 毕业论文3.烟花粒子系统模型的建立3.1烟花粒子模型烟花在空中上升之后爆炸形成不同的形状,形状非常丰富多彩。常见的烟花形状有“天女散花”状烟花、束状烟花、流星状烟花等等。烟花的形状不同,那么当模拟的时候所建立的相应烟花模型也是不同的。但是我们可以从不同形状的烟花的运动特性中提取出烟花粒子的基本模型,每种不同的烟花所对应的模型可以在基本的模型上进行相应的修改即可以得到。烟花的运动模型一般分为三个阶段:上升阶段、爆炸阶段、消亡阶段。首先系统初始一帧产生相应数量的烟花粒子之后,烟花粒子随后上升到空中某一个位置,然后烟花粒子发生爆炸(爆炸的形状可以通过各种参数来控制,从而形成不同的形状),最后系统检测出超过生命周期或者超过设定的显示区域的烟花粒子并把它从系统中删除。整个烟花模拟过程就是许多这样的烟花粒子不断的上升、爆炸、消失运动更新形成的。下面的图3.1描述了单个的烟花粒子在系统中运动更新的过程[17]。在本篇论文的研究中我们选择其中具有代表性的“束状”烟花进行研究和模拟。其他形状的烟花可以在此基本模型上作相应的修改得到。“束状”烟花是由许多烟花粒子团组成的,其中每个烟花粒子团又包含有许多烟花粒子,这些烟花粒子具有一些相似的性质,比如初始速度及加速度、颜色、形状等等。每个烟花都有一个头粒子,组成头粒子的烟花粒子具有相同的属性。当头粒子上升到空中某点时开始爆炸。这时组成头;粒子的烟花粒子按照一定的轨迹爆炸成球状,爆炸后的粒子由于能量不断减小,最后慢慢的消亡。许多这样的烟花头粒子在系统中不断的运动更新,就组成了动态的烟花模型。28 毕业论文系统生成烟花粒子上升阶段,向上做减速运动粒子生命周期是否结束到达爆炸点,按照烟花的不同形状赋予其X轴、Z轴的运动方向和速度,Y轴速度为0粒子死亡,从系统中删除爆炸阶段粒子生命周期是否结束图3.1粒子生命周期图3.1.1烟花粒子“束状”烟花包含有许多的头粒子,每个头粒子又包含有许多烟花粒子。这里为了便于理解,我们把这两种粒子分别称呼为“烟花”和“烟花粒子”。我们定义实数域上的一个n维向量,表示为:Rn={Position,Speed,Color,Accelerate-speed,Direction,Bright,Life_time,Type,28 毕业论文Flow}。Rn表示某一烟花粒子的属性,即烟花粒子的性质和状态,主要包括:粒子的空间位置、粒子的运动速度及加速度、粒子的运动方向、颜色、亮度、生命周期、运动状态等属性[18]。烟花粒子的数据结构如下:structfireworks_point{floatx,y,z;//烟花粒子的位置floatxSpeed,,ySpeed,zSpeed;//烟花粒子的速度floatxg,yg,zg;//烟花粒子x,y,z方向的加速度floatr,g,b;//烟花粒子的颜色intstyle;//烟花粒子的颜色};firework-point烟花(烟花头粒子)的数据结构如下:structfirework{inttype;//烟花的类型floatx,y,z;//烟花的位置floattime;//烟花的生命时间floatdir;//烟花的方向intflg;//标志structfirework-pointp[MAX_POINTS];//爆炸后的烟花粒子structfirework*next;//下一个烟花};3.1.2烟花粒子数量定义在“束状”烟花模型中,烟花头粒子升到空中某个位置,然后头粒子所包含的烟花粒子爆炸产生所要模拟的效果。从模型中我们可以看出,系统仅在初始一帧产生相应的烟花粒子,而在后面的运动过程仅仅是这些初始粒子运动状态的更新,系统并不再产生新的烟花粒子。在系统定义初始粒子数量的时候,粒子数量由下列式子3-1决定:(3-1)28 毕业论文式中Meannumber是一个预先设定的数值,代表每单位区域产生的烟花粒子数目的平均值。Varnumber为其方差,代表预先设定的随机数分布范围。常数Meannumber的选择很重要,一如果数目过多,则每一帧绘制烟花会占用很多的时间,这样就会影响系统的实时性。如果数目过少,组成烟花的烟花粒子过少,会影响烟花模拟的真实性。Meannumber的选择需要在多次实验中经过具体的调试,才能找到比较适合的数值。rand()是一个随机函数,其数值在在-1.0到+1.0之间变动[19]。3.1.3烟花粒子的初始化系统在初始一帧会产生一定数量的烟花粒子,粒子产生之后,首先要赋予其一定的初始属性。这些属性包括烟花粒子的初始位置、初始颜色、初始速度及初始加速度、初始亮度、初始生命周期等等。1.烟花粒子的初始位置烟花粒子的初始位置position(x,y,z)是由系统在一定的范围内随机设定的。在一般烟花粒子模型中,我们可以假设所有烟花粒子的初始位置都在一个半径很小的球体表面的范围内。即初始粒子的位置是在一个给定的位置position(x0,y0,z0)为球心,半径为R的球体表面范围上[20]。则粒子的初始位置为下列式子所示:Position(x,y,z)=position(Xi,Yi,Zi)(3-2)2.烟花粒子的初始颜色我们最直观看到的就是烟花的颜色,所以颜色在烟花模拟中是一个比较重要的参数,它直接决定烟花的仿真效果的逼真程度。在烟花模型中,每个烟花粒子团都需要用大量的烟花粒子来描述。这些烟花粒子的颜色通常用三原色RGB来表示。对于单个烟花粒子,初始化其颜色时一般有两种情况,第一种情况是初始一帧赋予其一定的颜色,在以.后每一帧更新时其颜色不变。另外一种情况是把各种烟花粒子颜色放在一个数组中,然后每一帧更新时由系统随机调用。一般的烟花模型多选用第二种情况,这样模拟出来的烟花颜色变换比较随机,烟花的色彩也比较丰富,模拟效果比较逼真[21]。在系统初始一帧烟花粒子的颜色设定由下列式子所示:fP[i].r=(float)(rand()%256)/255;fP[i].g=(float)(rand()%256)/255;(3-4)fP[i].b=(float)(rand()%256)/255;3.烟花粒子的初始亮度28 毕业论文烟花粒子的亮度是随着系统每一帧的更新而逐渐变化的,我们定义一个变量brightness来表示粒子的亮度,brightness的取值范围介于0.0和1.0之间。当brightness=1.0时,表示烟花粒子颜色最亮。当brightness=0.0时,表示烟花粒子最暗。一般初始化烟花粒子亮度时定义brightness=1.0,即烟花粒子颜色最亮,随着系统的运行,粒子慢慢变暗,最后亮度减为0.0[22]。4.烟花粒子的速度和加速度如果烟花粒子是竖直的上升到空中某一点然后发生爆炸,则系统的初始一帧时烟花粒子在X轴,Z轴方向上的初始速度都为0。只有Y轴方向上有初始速度和加速度。其中初始速度可以自己设定或者由系统随机生成的。这里我们忽略了温度、阻力能外界力的因素,只考虑最简单的重力学因素。所以加速度由动力学原理可知为重力加速度g=9.8m/s2。如果烟花上升过程中发生偏转,Y轴方向上的情况和竖直上升的烟花粒子是相同的。不同的是X,Y轴方向初始速度及加速度均不为0[23]。X,Y轴方向的初始速度和加速度根据相应的烟花模型可以自己设定也可以由系统随机生成。5.烟花粒子的初始生命周期每个烟花粒子都有一定的生命周期,我们定义一个变量lifetime来表示粒子的生命期,用△t表示时间变量,当粒子初始产生时我们用rand()随机函数赋予life_time一个0~1之间初值,随着烟花模型每一帧的更新,life_time的值每一帧都减少△t,慢慢减小,最后减少为0。当烟花粒子的生命周期减为0时,就把它从系统中删除[35]。在本篇论文所建立的烟花模型中,系统的初始一帧,我们设烟花粒子的生命期为最大值,即life_time=1.O。3.2烟花粒子运动模型在计算机图形学研究中,要得到一个很好的模拟效果,首先要建立一个比较合适的空间坐标系。在这里,我们建立如图3.2所示的三维空间直角坐标系。在图中所示的坐标系中,X轴水平向右,Y轴竖直向上,Z轴则垂直于X轴和Y轴所形成的平面YOZ从里指向外面。在烟花粒子模型中,单个粒子每一帧都是动态变化的,而且其变化都遵循一定的动力学规律。众多的粒子随着时间的更新而不断的运动,最终形成了一幅烟花绽放的画面。28 毕业论文通过分析束状烟花的运动过程,我们可以看出烟花粒子的运动包括三个主要阶段:烟花粒子上升到一定高度,然后粒子爆炸后形成所要模型的形状,最后消失。其中前两个阶段涉及烟花粒子的运动更新,最后一个阶段则是从系统中删除烟花粒子。下面我们分别对前两个阶段烟花粒子的运动情况进行分析。1.烟花粒子上升阶段:烟花粒子的初始位置确定之后便开始上升,在这里我们忽略温度、风力等外力作用,则烟花粒子在上升阶段仅仅受到重力加速度的作用。本篇论文所研究的束状烟花是竖直上升的,在上升过程中,烟花粒子的位移s=gt^2/2其中t为粒子的运动时间,s为粒子Y轴方向上的位移[24]。2.烟花粒子爆炸阶段:当烟花粒子Y轴方向的速度在重力加速度的作用下变为0时,烟花粒子上升到最高点,则要发生爆炸。这时系统会赋予烟花粒子在X轴、Z轴方向的运动速度。在本篇论文所研究的束状烟花模型中,在爆炸阶段,烟花粒子在爆炸点以爆炸点为中心绕着Y轴向四周发生偏转,形成抛物线形状,从而形成我们所见到的烟花形状。3.3烟花粒子的消亡从上面对烟花模型的分析,我们可以看出模型主要分为三个阶段,最后一个阶段是烟花粒子的消亡。烟花粒子产生后,在系统中经过一定时间的运动和属性的更新,最后粒子被从系统中删除称为粒子消亡。烟花粒子上升到空中,然后发生爆炸,爆炸后能量慢慢的减‘少,直到最后慢慢消失。随着烟花模型每一帧的更新,烟花粒子的生命周期life_time的值每一帧都减少△t,慢慢减小,最后减少为0。当life_time=0时说明粒子的生命期己经结束,则从系统中删除此粒子。烟花粒子模型中还有一种是废弃粒子,这种粒子的生命期life_time并不等于0,但是它根据运动模型所到达的空间位置超出了预定设定显示的位置,我们就把它从系统中删除。烟花粒子的透明度也是随着模型每一帧的更新而在变化着,如果粒子的透明度减为0,即使它继续在系统中运动着,我们也看不到,所以这样的粒子当透明度为0时,我们也把它从系统中删除出去。28 毕业论文4.实验设计与编码实现4.1发开语言与开发环境本篇论文的研究选择了VisualC++6.0提供的可视化开发环境,与Windows开发平台相结合,使用C++和OpenGL纹理映射和纹理填充技术来进行开发。4.2关键技术与设计思路烟花的形状姿态各异,基于粒子系统的基本原理建立烟花模型,其关键的技术在于从各式各样的烟花燃放过程中,抽象出烟花运动的一般规律,从而建立通用的烟花模型,并且在模型中合理的对烟花粒子的各种属性进行初始化化、合理的控制烟花粒子的生命周期,同时在绘制烟花粒子时进行很好的渲染。这样才能得到很逼真的烟花仿真效果。在参考现有的烟花模型的基础下,我们可以很容易的得到基于粒子系统的烟花模型。在利用粒子系统的基本原理建立了烟花模型以后,结合OpenGL映射技术使烟花的仿真模拟效果更好。在已经实现的烟花基本模型的基础上,结合结合VisualC++6.0中的鼠标消息函数,OpenGL的纹理填充技术对烟花基本模型进行了改进,下面就介绍本篇论文研究中所用到的相关技术。4.3OpenGL相关技术在建立的烟花基本模型中,为了使烟花的形态更加逼真,我们使用了OpenGL的纹理映射技术。在OpenGL中纹理贴图技术是个相当大的主题,并且具有相当程度的复杂性。纹理并不只是二维的,也可以是一维的、三维的。我们可以把纹理映射到一组多边形的表面上,也可以把它贴到曲面上。使用纹理贴图夹绘制所需要的图形,需要执行以下步骤:1.创建纹理对象,并为它指定一个纹理。在每个纹理单元中,描述纹理的数据可以由1个、2个、3个或4个组成,这些数据的作用是用来表示RGBA四元组、调整常量或深度成分。2.确定纹理如何应用到每个像素上。3.启用纹理贴图功能。我们可以使用glEnable()和glDisable()函数来启用和禁用纹理贴图功能,使用GLTEXTURE1D,GLTEXTURE2DGLTEXTURE3D或GLTEXTURECUBEMAP常量作为参数,分别表示一维、二维、三维或立方图纹理。4.绘制场景,提供纹理坐标和几何图形坐标。28 毕业论文本文中在绘制天空,草地,烟花等时使用到了OpenGL的纹理映射技术,如下图4.1为草地,烟花的纹理样式。a.草地纹理b.烟花纹理图4.1纹理样式4.4编码实现4.4.1烟花基本模型的编码实现在VisualC+十6.0软件中,利用粒子系统的基本原理,根据烟花绘制的流程图图2,我们很容易实现烟花基本模型在计算机上的可视化。下面是烟花基本模型的部分关键代码。首先是在初始一帧系统产生一定数量的烟花粒子,代码如下:fw=(structfirework*)mallloc(sizeof(structfirework));然后对烟花粒子的各种属性初始化,主要是初始化烟花粒子的初始位置、速度及加速度、颜色和生命周期等等。在烟花建模的过程中,烟花粒子初始属性的设定己经做了详细的分析,我们把烟花初始化这个功能封装在一个函数中,方便系统调用。voidInitParticle(Particle&ep){ep.b=float(rand()0I0100)/60.Of;//初始颜色随机ep.bfloat(rand()%100)/60.Of;ep.z=float(rand()%100)/60.Of;ep.life=1.Of;//初始生命值满ep.fade=O.OOSf+float(rand()%21)/10000.Of;//衰减速度随机ep.size=1://大小28 毕业论文ep.xpos=30.Of-float(rand()%601)/lO.Of;//x,z的位置在屏幕范围内,Y值固定在屏幕底部ep.ypos=-24.Of;ep.zpos=20.Of-float(rand()%401)110.Of;}当烟花粒子被赋予了初始属性之后,烟花粒子就开始上升到空中,当Y轴方向上的速度由于重力加速度的作用降为0的时候,烟花便进入了爆炸阶段。在本篇论文所研究的束状烟花中,烟花爆炸的时候是以Y轴为基准,所有的烟花粒子绕着Y轴发生一定角度的偏转而实现的。for(loop=0;loop

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭