基于OpenGL粒子系统的喷泉模拟.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 OpenGL 粒子 系统 喷泉 模拟
- 资源描述:
-
湖南大学毕业设计(论文) 第 28 页 HUNAN UNIVERSITY 毕业设计(论文) 设计(论文)题目: 基于OpenGL粒子系统的喷泉模拟 学生姓名 冯亮 学生学号 20041610504 专业班级 软件测试一班 学院名称 软件学院 指导老师 申煜湘 系主任(院长) 林亚平 2008 年 5 月 19 日 湖南大学软件学院 基于OpenGL粒子系统的喷泉模拟 摘 要 随着计算机仿真技术的不断提高,人们对真实事物的模拟要求越来越高,模拟技术的重要性越来越突出,尤其在3D游戏、军事演习和仿真实验等方面。而寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是计算机图形学的一个重要研究课题。 本文从计算机图形学中粒子系统模拟自然景物的方面出发,介绍了采用粒子系统模拟真实事物的方法。实际上,很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等,粒子系统的景物模拟则超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。 本课题设计了基于OpenGL粒子系统的喷泉模型,详细讨论了模型中粒子的属性及其变化,实现了具有较强真实感的动态变化和抛物变化等喷泉特征,采用了纹理映射和视线跟踪技术进行三维喷泉渲染;同时,采用Line方式取代传统的Point方式渲染粒子实现喷泉模拟。该方式模拟喷泉比较真实,速度快,在普通的微机上可以得到令人满意的效果。 关键词:粒子系统,喷泉模拟,特效 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 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 landscape, 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 so 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, achieved 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 simulation way is a real fountain comparison, speedly, in general PC can get satisfactory results. Key Words:Particle systems, fountain simulation, effects 目 录 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 MFC 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 4.7 场景实现 23 5. 总结 26 致谢 27 参考文献 28 1. 绪论 1.1 自然景物模拟概述 自然景物模拟一直都是计算机图形血研究者面临的巨大挑战之一。由于自然景物的形状随即变化,表面往往含有丰富的细节,很难用传统的解析曲面来描述。常见的景物模拟方法一般有以下两种: 第一种:根据数学函数构造出景物外型,然后变换时间函数t。这类方法可以称为过程动画的方法,比较典型的是Fournier模拟水波的方法。 第二种:从物体运动的物理原理出发,一般是求解一组力学方程,得到质点在各个时刻的状态。这类方法可以称为基于物理的方法,比较典型的是Foster的方法。 比较而言,过程动画方法比较简单、计算效率较高,但效果比较单调,适用范围比较狭窄。基于物理方法的效果比较真实,适用范围广泛一些,但是计算起来非常复杂,效率比较低。 在模拟诸如云、烟、火等不规则模糊物体时,粒子系统是迄今为止被认为是最成功的一种算法。为了方便用粒子系统模拟各种物体,McAlbster结合OpenGL,用C++开发了一套粒子系统API。利用这套API可以很方便地对运动的物体进行动态模拟,首先将粒子的活动进行简单的分析和描述,然后对粒子系统进行场景渲染,结合OpenGL提供的一些功能如纹理映射效果,可以模拟很多种自然景物。本课题就可以利用这种方法来模拟多种喷泉的效果。 1.2 粒子系统的背景及其介绍 粒子系统到底是什么?所谓的粒子系统,就是将人们看到的物体运动和自然现象,用一系列运动的粒子来描述,再将这些粒子运动的轨迹映射到显示屏上,在显示屏上看到的就是物体运动和自然现象的模拟效果了。 利用粒子系统,可以在屏幕中表现诸多的特殊效果,如:焰火、火苗、落叶、雪花飞舞等。不怕做不到,就怕想不到。只要你的想象力足够丰富,你可以创造出意想不到的奇迹来。 粒子系统的基本思想是:采用许多形状简单的微小粒子作为基本元素,用它们来表示不规则模糊物体。这些粒子都有各自的生命周期,在系统中都要经历“产生”、“运动和生长”及“消亡”三个阶段。粒子系统是一个有“生命”的系统,因此不象传统方法那样只能生成瞬时静态的景物画面,而是可以产生一系列运动进化的画面,这使得模拟动态的自然景物成为可能。 利用粒子系统生成画面的基本步骤是: 1、产生新的粒子; 2、赋予每一新粒子一定的属性; 3、删去那些已经超过生存期的粒子; 4、根据粒子的动态属性对粒子进行移动和变换; 5、显示由有生命的粒子组成的图像。 粒子系统采用随机过程来控制粒子的产生数量,确定新产生粒子的一些初始随机属性,如初始运动方向、初始大小、初始颜色、初始透明度、初始形状以及生存期等,并在粒子的运动和生长过程中随机地改变这些属性。粒子系统的随机性使模拟不规则模糊物体变得十分简便。 粒子系统应用的关键在于如何描述粒子的运动轨迹,也就是构造粒子的运动函数。函数选择的恰当与否,决定效果的逼真程度。其次,坐标系的选定(即视角)也有一定的关系,视角不同,看到的效果自然不一样了。 1.3 国内外研究现状 国外的研究始于80年代初期,由Reeves W. T.于1983年首次提出粒子系统模型,并用其模拟了焰火、爆炸等效果,他还成功的利用该模型模拟了电影《AR TREK I: The Wrath of Khan》中的一系列特技镜头。1985年Reeves W. T.和Blau发展了粒子系统,他们用“volume filling”基本单元模拟生成那种随时间改变形状,但又基本保持不变的实体,如随风飘动的花草树叶。 此后从理论到技术都得到了进一步发展:Reeves W. T.提出了关于粒子系统消隐绘制的算法,称之为“近似概率算法”,用于解决阴影、可见面问题,且取得了很好的效果。Fournier A.等在研究海浪模型中利用粒子系统模拟了浪花,提出了浪花的产生条件——粒子运动速度和海流曲面传播速度之间的差异要超过一定的条件,即粒子运动速度与海浪曲面传播速度之间的差异要超过一定的阀值,否则产生泡沫。Karl Sims研究了粒子的动画及绘制算法,他利用粒子系统的并行特点,提出了一个并行的粒子绘制系统,该系统能绘制不同形状、大小、透明度的粒子,并能进行反走样、消隐、运动模糊的处理。Reed等人用粒子系统成果的模拟了闪电。Reynolds在其群体行为研究中,又极大的扩展了粒子系统的功能,并将其作为一种建模工具,他提出了粒子间相互结合的思想,从而使粒子与粒子之间进行交互,并阐明利用大量的简单图元间的交互作用可产生复杂的行为。Miller&Pearce、Tonnesen等人开发了双粒子系统来模拟像流体一样的或溶化的物质。David E. Breen利用“交互粒子”模拟了布匹、织物。再如大家非常熟悉的三维动画制作的最新软件3DS MAX就载有“Spray”和“Snow”两个粒子系统来模拟喷射的火花、飘舞的雪花、飞扬的尘埃等特殊效果,3DS MAX还有带有两个外挂模块“Sand Blaster”和“All Purpose Particles”,用来创建气泡、焰火、冲击波等动态图像。总之,粒子系统能够创建各种动画效果。 国内近年来有许多大学对粒子系统模型进行了研究、探索和应用,并取得了一定的成果。例如,徐迎庆等人利用粒子系统模拟了水面溅起的水沫以及流水与石头碰撞后产生的水花等效果;宋万寿等人在IBM PC386机上开发了基于粒子系统方法的焰火及树木模拟实验系统等。国内的研究虽然取得了一定的进展,但采用粒子系统有效地模拟模糊景物的论文并不多,需要进一步开发、研究与实现。 总而言之,粒子系统为如何模拟具有复杂结构及复杂运动的物体提供了一个简洁、抽象的描述。用它所创建的动态模糊效果是其他图像生成技术难以达到的。但迄今为止,所考虑的都是单个粒子的运动,对物体的模型也作了许多假设。至于粒子间的相互作用、碰撞检测等都未深入涉及。另外,利用3DS MAX制作的烟火、浪花,其效果还不太理想,需要将粒子系统与其他方法想结合,开发出更新更好的算发,这些都是今后的研究方向之一。 1.4 喷泉模拟的要求及意义 本课题要求使用OpenGL编写程序实现粒子系统,并模拟一个正在喷水的喷泉,绘制出三维动画。 具体要求如下: 1. 理解图形学中粒子系统的原理和作用; 2. 利用OpenGL实现粒子系统; 3. 模拟一个正在喷水的喷泉,考虑水滴的材质和光照属性,或选择较好的贴图; 4. 喷泉的水流要连贯,水滴成流,符合现实情况,有曲线的喷出下落路线; 5. 设计并绘制一个场景,使得场景比较逼真。 目前,粒子系统还处于萌芽阶段,很多技术不完善,还有很多的发展空间。本课题用粒子系统对喷泉进行模拟,是为了让更多人的了解粒子系统,对粒子系统的重要性有个初步的认识,并为大有致力于粒子系统的同学有机会更深入的了解。 2. 相关学术知识 计算机图形学中经常要用到许多物理、数学学知识。就拿本课题来介绍,喷泉的模拟就是模拟喷泉的样子,喷泉是一个抛物线,怎样去模拟呢?首先必须清楚喷泉中水滴是怎么运动的,这就要用到物理学的知识了——初速度、运动方向和所受到的力决定其运动线路。然后怎么保证水滴在那个空间运动呢?这就需要运用数学知识了。定义水滴的坐标,水滴根据坐标物理学的变化进行抛物变化,然后形成一个喷泉模型。当然喷泉的模拟也离不开计算机图形学本身的知识,这些知识都将会在这部分介绍下。 2.1 物理学知识 本课题运用了物理学中的抛物落体运动的知识。即:物体在只收到重力的作用下以一定的初始速度进行匀加速运动。 (1)抛物运动的加速度是g=9.8m/s*s (2)抛物运动的距离公式是Sx=Vxt+gt*t/2 Sy=Vyt+gt*t/2 Sz=Vzt 2.2 数学知识 本课题运用了数学知识坐标系统——空间坐标系和向量知识。 下面先简单介绍下空间坐标系: 空间坐标系中使用最广泛的是笛卡尔坐标系,它基于空间中三条相互垂直的坐标轴:X轴、Y轴和Z轴。要定义空间中的一个点P,需要三个坐标:X,Y,Z,写成P(X, Y, Z)。三个坐标轴构成三个平面:X-Y平面、X-Z平面和Y-Z平面。这三个平面将整个空间分成8个子空间,在3D笛卡尔坐标系中共有8个卦限。 3D笛卡尔坐标系包括左手坐标系和右手坐标系两种。左手坐标系(LHS)假设X-Y为纸张上或屏幕上的水平轴和垂直轴,正Z轴指向纸内或屏幕内。右手坐标(RHS)假设X-Y为纸张上或屏幕上的水平轴和垂直轴,正Z轴指向纸外或屏幕外。如图1: 图2-1 空间坐标系 其次介绍一下向量: 向量就是既有大小又有方向的量。在本课题中,需要运用的主要是一些向量的坐标运算。在几何学上,有同样方向和长度的两个向量相等;在数学上,有同样维数和分量的向量相等。在几何学上,向量大小是有向线段的长度,知道向量的分量,利用公式(2-1)就能计算出向量的大小: ‖u‖=sqrt(ux*ux+uy*uy+uz*uz) (2-1) 其中,‖u‖表示向量u的长度。 标准化向量是让向量的大小等于1,即被叫作单位向量。可以利用向量大小以及各个分量把一个向量标准化,如公式(2-2)所示: û=u/‖u‖={ux/‖u‖,uy/‖u‖,uz/‖u‖} (2-2) 其中,û表示单位向量。 通过分别把两个向量的各个分量相加,可以得到向量之和,如公式(2-3)所示: u+v=(ux+ux,uy+uy,uz+uz) (2-3) 2.3 OpenGL OpenGL是OpenGraphicsLib的缩写,是一套三维图形处理库,也是该领域的工业标准。计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。OpenGL就是支持这种转换的程序库,它源于SGI公司为其图形工作站开发的IRIS GL,在跨平台移植过程中发展成为OpenGL。 OpenGL是目前用于开发可移植的、可交互的2D和3D图形应用程序的首选环境,也是目前应用最广泛的计算机图形标准。OpenGL是一套的计算机图形处理系统,是图形硬件的软件接口,GL代表图形库(Graphics Library)。OpenGL具有可移植性,任何一个OpenGL应用程序无须考虑其运行环境所在平台与操作系统,在任何一个遵循OpenGL标准的环境下都会产生相同的可视效果。 OpenGL不是一种编程语言,而是一种API(Application Programming Interface,应用程序编程接口)。当我们说某个程序是基于OpenGL的或者说它是个OpenGL程序是,意思是说它是用某种编程语言如C或C++编写的,其中调用了一个或多个OpenGL库函数。作为一种API,OpenGL遵循C语言的调用约定。 OpenGL主要包括三个函数库,它们是核心库、实用函数库和编程辅助库。核心库中包含了OpenGL最基本的命令函数。 核心库提供了一百多个函数,这些函数都以”gl”为前缀,用来建立各种各样的几何模型、进行坐标变换、产生光照效果、进行纹理映射、产生雾化效果等所有的二维和三维图形操作。 实用函数库是比核心库更高一层的函数库,它提供四十多个函数,这些函数都以”glu”为前缀。 由于OpenGL是一个图形标准,是独立于任何窗口系统或操作系统的,在OpenGL中没有提供窗口管理和消息事件响应的函数,也没有鼠标和键盘读取事件的功能,所以在编程辅助库提供了一些基本的窗口管理函数、事件处理函数和简单的事件函数。这类函数以”aux”作为前缀。 值得一提的是,目前AUX编程辅助库已经很大程度上被GLUT库取代了。GLUT代表OpenGL应用工具包(OpenGL Utility Toolkit),是一个与窗口系统无关的工具包。它作为AUX库的功能更强的替代品,用于隐藏不同窗口系统API的复杂性。GLUT的子程序的前缀使用”glut”。 2.4 MFC MFC简单来说就是VC的类库,是一个编程框架。 MFC(Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。 从总体上来看,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后编译,则通过类库实现了应用程序特定的逻辑。 构成MFC框架的是MFC类库。MFC类库是C++类库。这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能等等。 MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObject是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。CObject实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObject派生的类都将具备或者可以具备CObject所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。 针对每种不同的对象,MFC都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是CwinThread;文档对象,基类是Cdocument,等等。 程序员将结合自己的实际,从适当的MFC类中派生出自己的类,实现特定的功能,达到自己的编程目的。 MFC以“C++”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗内存,效率低下。例如,CWnd封装 Windows窗口对象时,每一条Windows消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。 这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。 如前所述,MFC实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式)。针对不同的应用和目的,程序员采用不同的模板。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。 这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。 为了支持对应用程序概念的封装,MFC内部必须作大量的工作。例如,为了实现消息映射机制,MFC编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC内部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些内部处理对程序员来说是透明的,但是,懂得和理解MFC内部机制有助于写出功能灵活而强大的程序。 总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。 MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。 MFC是C++类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C++对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。 3. 粒子系统的设计 3.1 Particle System API 为了方便粒子系统的运用,McAllister以OpenGL为基础,利用C++开发了一套Particle System API。这套API具有以下优点:运行高效、运用灵活、参数独立、升级方便、硬件无关、学习简单等。 该系统共分为五个部分:粒子组、活动、活动列表、属性和域。 所有的粒子都存在粒子组中,粒子组是一组具有相同作用力的粒子集合。用户可以定义多个具有不同行为的粒子组分别进行调用,但在某一时刻,只能有一个粒子组是活动的。 活动是粒子组修改粒子属性的函数。 活动列表类似与OpenGL中的显示列表,可以把一系列操作都封装在一个活动列表中,需要的时候调用相应的活动列表。 属性提供了一些函数,用来修改粒子的颜色、大小和生命周期等属性。 域定义了矩形、球体、园盘、圆柱等一些形状,使行为函数、属性函数能在域范围内做定义。 下面的伪代码描述了粒子系统运行的流程: for each particle group j pCurrentGroup(j)//指定group j为当前粒子组 for each time step per rendered framepSource(…)//产生新的粒子 other actions…//改变粒子组属性 pMove()//更新粒子位置 end for pDrawGroup(…)//绘制粒子 end for other drawing… 每颗粒子的生命周期或工作处理流程如图3-1所示: 图3-1 每颗粒子的生命图 3.2 常见的粒子运动模型 粒子运动中粒子产生的时候都具有一定的初始属性,粒子作为质点,按照动力学的规律进行运动。以下是几种常见的运动形式: (1) 直线运动。粒子的位置和速度变化遵循下面的原则(如公式(3-1)): P=P0+∫Vdt, V=V0+∫adt (3-1) 其中P为粒子位置,P0为粒子初始位置,V为粒子速度,V0为初始速度,a为粒子加速度。 (2) 阻尼运动。在当前运动方向上的粒子根据阻尼的作用,其速度根据某种比例减少,一般取值如公式(3-2)所示: V=V0(1-d×△t) (3-2) 其中d为阻尼运动的阻尼因子,d=[0, 1]。 (3) 螺旋运动。螺旋运动能按照给顶轴进行旋转,以产生粒子的翻滚等效果,使速度方向发生改变。 (4) 反弹运动。反弹运动能改变粒子运动速度的大小与方向。对于无能量损失的反弹运动,类似于光的反射,如公式(3-3)所示: V0=V-2(V0·N)N (3-3) 其中N为反射面的方法向量。 3.3 喷泉模拟的算法 想要有好的模拟效果,首先要构造合适的坐标系。假想观察者的视点位于屏幕正前方,以喷泉出水的管嘴的中心位置为O,设置X轴正向沿从左至右的方向,Y轴正向沿从下至上的方向,Z轴正向为从里至外的方向。 喷泉种类多样,本文挑选出其中一些具有代表性的进行研究和模拟。下面以这样的一个喷泉为例来说明模拟方法:这个喷泉是从以原点O为中心的管嘴中喷出水柱,经过两次面反射之后落在水池之中。 图3-2描述了这个喷泉的大致形状,其中虚线段表示的σ1和σ2平面为喷泉的反射面,他们的形状和位置可以由用户设置。目前反弹面的形状可以设为矩形或者圆;粗实线表示喷泉水流的轮廓;最下方用实线表示的σ0平面为水池表面。在这个例子中,σ1与Y轴交于原点O,σ2与Y轴交于P1点,σ0与Y轴交于P2点。 图3-2 喷泉形状图示 3.3.1 喷泉粒子初始化 首先设定粒子的初始属性,包括粒子的初始速度、初始位置以及颜色。将粒子的初始速度(Vx,Vy,Vz)限制在一个圆柱环的域内,圆柱的轴平行与Y轴并且长度很短,圆柱的外径和内径也都不大,这样可以保证粒子以比较稳定的状态变化。 然后设定粒子的初始颜色,由于是模拟喷泉水流,设定粒子颜色为白色。现在就可以产生新粒了,将粒子产生的位置(x0, y0, z0)范围限制在Z轴上一条很短的直线段上,这样可以使粒子产生的位置看起来就像从一个很细的管嘴喷出来一样。粒子的位置将按照下面公式(3-4)变化: x=x0+∫Vxdt y=y0+∫Vydt (3-4) z=z0+∫Vzdt 其中,(x, y, z)是粒子的位置,(x0, y0, z0)是粒子的初始位置,(Vx, Vy, Vz)是粒子的速度。 3.3.2 喷泉粒子的运动轨迹 为了设定粒子的行为模型,首先要确定粒子受力的物理模型。粒子一直受重力作用,因为设定粒子在生命周期内一直受Y轴负方向的力作用,也就是给粒子一个沿重力作用方向的加速度。为了有合适的下落速度,以取得良好的动画效果,经过多次实验之后针对当前的初始速度把加速度的值设置为0.01,而非重力加速度为9.8。 与无能量损失的反弹运动不同,在该模型中有两个重要参数,摩擦系数μ和反弹系数ε。在系统中,任何粒子的速度矢量V都被分解为两个方向的速度分量Vn和Vt,其中Vn是粒子反弹面σ的法线方向上的分量,另外一个分量Vt与σ相切,图3-3所示为粒子反弹运动的示意: 图3-3 粒子反弹运动示意图 经过反弹之后,Vn被反向,同时大小乘以反弹系数ε,得到Vn’和Vt’合成就得到了粒子在经过反弹面作用后的速度V’,如公式(3-5): Vn=(V·N)N Vt=V-Vn (3-5) V’=(1-μ)Vt-εVn 3.3.3 粒子的消亡 粒子不能无限制的运动下去,那样系统中将不会有新粒子产生。可以强制消除系统中处于错误运动轨迹的粒子,也就是不再有生存需要的粒子。 设置一个与Y轴正交的平面域,使运动到该平面下方的粒子全部消亡。平面由平面上的特征点O和法线方向N确定,在上述例子中,特征点设置为P2点,法线方向设置为Y轴正方向。 3.3.4 喷泉绘制 粒子系统的产生、运动和消亡都确定之后,就可以进行喷泉的绘制工作了。考虑到粒子系统水花四溅的特征,在绘制粒子的时候,本文采用了Line方式,而不是采用传统的Point方式。 Line方式就是将粒子的原始位置和根据粒子速度计算出来的粒子下一个时刻位置用直线连接,这样可以模拟出水粒子模糊的效果。实验证明Line方式模拟的效果更加逼真。以下为其实现方式: 喷泉由多个水柱组成,每个水柱可看成由很多个小水珠组成,每个小水珠可由一个粒子来模拟,本文称之为喷泉粒子。喷泉的模拟按图3-4所示的步骤进行: 产生新的喷泉粒子并初始化属性 绘制喷泉粒子 更新喷泉粒子的速度 绘制喷泉粒子 Texture数据转为顶点数据 更新喷泉粒子的位置和其他属性 图3-4 喷泉粒子处理流程图 3.4 纹理映射技术 在虚拟环境的绘制中,如果能够成功的实时模拟各类自然现象,场景将会变得十分逼真和生动。而一个好的粒子系统必须具有实时的效果,往往粒子数目越多,物体的真实程度就越高,同时带来大量的计算,这样,在相同的硬件条件下,就降低了实时性。而对于要求限时计算的场景,需要改进传统的粒子系统方法,尽可能地降低渲染这些粒子的代价,提高系统的实时性。 由于人们对动态景物的辨认是有限的,且更多关心的是画面的连续性;而纹理映射将丰富的纹理细节跌价在物体表面上,使图形更具有真实感,采用纹理映射技术能产生许多逼真度很高的图象,且实现代价又是相对较小,用纹理图像来表现粒子,这就是所谓的胖粒子(fat particle)。其纹理包含alpha通道(alpha channel),还加入伪粒子的特征。这样就可以同时表现出它的形状、透明度和颜色。对于喷泉动态模拟,就会显的更加真实。 粒子本身越复杂,渲染同样的效果需要的粒子数就越少。如果是二维纹理还需要结合BillBoarding技术(Billboard是让二维或者面元经过旋转后总是朝向观察者的一种技术。它的思想是:首先把一幅静态图象作为纹理映射到简单的集合平面上,然后根据视点始终与该平面正交。其中还要用到Alpha融合技术,使平面本身不可见,仅让有用的部分图象显示出来。)或提绘制(Volume Rendering)技术来实现。在这里本文应用了二维纹理,使用BillBoarding和alpha通道技术,使得喷泉燃放模型在实际应用中能满足实时性要求并且更加逼真。 另外,本文还利用了OpenGL显示列表的设计优化程序运行性能,采用显示列表方式绘制一般要比瞬时方式快,尤其能提高网络性能。 4. 系统实现 在本章内容中,将罗列系统中实现的部分功能,并附上一些核心代码。 4.1 开发环境 首先介绍下系统开发的环境。本系统是在VC2005中实现的,利用OpenGL,运用了MFC框架。 4.2 粒子生成 每个粒子都应该有自己的属性来区分其他的粒子。首先对每个粒子给予一些属性,粒子根据它属性的变化进行活动。粒子的属性包括:粒子当前状态、粒子当前位置、粒子当前生命值、粒子存在的时间、粒子当前速度以及粒子运动方向。 当一个粒子产生时,需要给它的属性定义初始值(此操作定义为AddParticles),其值为: 当前状态:type=0;(0表示粒子状态为运动,1表示粒子处于静止) 当前位置:x=0,y=0,z=0;(粒子存在与三维坐标系) 存在时间:t=-9.9(设粒子运动的最高点为粒子虚拟产生时间) 当前速度:v=(rand()%200000)/100000+1; 运动方向:d=(rand()%400)/100-2 代码如下: void CMyFountainView::AddParticles() { struct particle *tempp; int i, j; for (j=0; j<3; j++) for (i=0; i<2; i++) { tempp = (struct particle *)malloc(sizeof(struct particle)); if (fn[j]) fn[j]->prev = tempp; tempp->next = fn[j]; fn[j] = tempp; 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)/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.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是给定的初始高度。粒子通过坐标的不断变化进行活动,这样就可以形成一个水柱。 代码如下: void CMyFountainView::MoveParticles() { struct particle *tempp; int j; for (j=0; j<3; j++) { tempp = fn[j]; while (tempp)展开阅读全文
咨信网温馨提示:1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。




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



实名认证













自信AI助手
















微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/5702485.html