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

下载本文档

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

文档简介

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

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

3、效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 simulation of real things, the importanctof Simulation is prominenting increasingly, especially

4、in 3D games, military drills and simulations, andso on. And seeking an the accurate mathematical model description of a variety of landscape of in the objective world,and II / 32realistic reproduce these phenomena and landscape, is an important research topic of the graphics. The topic from analogin

5、g the nature of the area with the Particles system of the graphic introductionsthe simulation of the real things. Many nature difficult to describe the geometric models, such as smoke, plants, water waves, flame, andso on, the features of particle system simulation model goes beyond the geometric co

6、nstraints, 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 feat

7、ures, 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

8、results.Key Words:Particle systems, fountain simulation, effects目录1. 绪论 11.1 自然景物模拟概述 11.2 粒子系统的背景与其介绍 11.3 国外研究现状 21.4 喷泉模拟的要求与意义 32. 相关学术知识 .52.1 物理学知识 52.2 数学知识 52.3 OPENGL6III / 322.4 MFC73. 粒子系统的设计 .103.1 PARTICLE SYSTEM API103.2 常见的粒子运动模型 113.3 喷泉模拟的算法 123.3.1 喷泉粒子初始化 123.3.2 喷泉粒子的运动轨迹 133.3.3

9、 粒子的消亡 133.3.4 喷泉绘制 143.4 纹理映射技术 144. 系统实现 .164.1 开发环境 164.2 粒子生成 164.3 粒子活动 174.4 水柱生成 194.5 喷泉旋转 204.6 纹理贴图 214.7 场景实现 235.总结 .26致 .27参考文献 .281 / 321.绪论1.1 自然景物模拟概述自然景物模拟一直都是计算机图形血研究者面临的巨大挑战之一。由于自然景物的形状随即变化,表面往往含有丰富的细节,很难用传统的解析曲面来描述。常见的景物模拟方法一般有以下两种:第一种:根据数学函数构造出景物外型,然后变换时间函数 t。这类方法可以称为过程动画的方法,比较典

10、型的是 Fournier 模拟水波的方法。第二种:从物体运动的物理原理出发,一般是求解一组力学方程,得到质点在各个时刻的状态。这类方法可以称为基于物理的方法,比较典型的是 Foster 的方法。比较而言,过程动画方法比较简单、计算效率较高,但效果比较单调,适用围比较狭窄。基于物理方法的效果比较真实,适用围广泛一些,但是计算起来非常复杂,效率比较低。在模拟诸如云、烟、火等不规则模糊物体时,粒子系统是迄今为止被认为是最成功的一种算法。为了方便用粒子系统模拟各种物体,McAlbster 结合 OpenGL,用 C+开发了一套粒子系统 API。利用这套 API 可以很方便地对运动的物体进行动态模拟,首

11、先将粒子的活动进行简单的分析和描述,然后对粒子系统进行场景渲染,结合 OpenGL 提供的一些功能如纹理映射效果,可以模拟很多种自然景物。本课题就可以利用这种方法来模拟多种喷泉的效果。1.2 粒子系统的背景与其介绍粒子系统到底是什么?所谓的粒子系统,就是将人们看到的物体运动和自然现象,用一系列运动的粒子来描述,再将这些粒子运动的轨迹映射到显示屏上,在显示屏上看到的就是物体运动和自然现象的模拟效果了。利用粒子系统,可以在屏幕中表现诸多的特殊效果,如:焰火、火苗、落叶、雪花飞舞等。不怕做不到,就怕想不到。只要你的想象力足够丰富,你可以创造出意想不到的奇迹来。粒子系统的基本思想是:采用许多形状简单的

12、微小粒子作为基本元素,用它们来表示不规则模糊物体。这些粒子都有各自的生命周期,在系统中都要经历“产生” 、“运动和生长”与“消亡”三个阶段。粒子系统是一个有“生命”的系统,因此不象2 / 32传统方法那样只能生成瞬时静态的景物画面,而是可以产生一系列运动进化的画面,这使得模拟动态的自然景物成为可能。利用粒子系统生成画面的基本步骤是:1、产生新的粒子;2、赋予每一新粒子一定的属性;3、删去那些已经超过生存期的粒子;4、根据粒子的动态属性对粒子进行移动和变换;5、显示由有生命的粒子组成的图像。粒子系统采用随机过程来控制粒子的产生数量,确定新产生粒子的一些初始随机属性,如初始运动方向、初始大小、初始

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

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

15、用粒子系统的并行特点,提出了一个并行的粒子绘制系统,该系统能绘制不同形状、大小、透明度的粒子,并能进行反走样、消隐、运动模糊的处理。Reed 等人用粒子系统成果的模拟了闪电。Reynolds 在其群体行为研3 / 32究中,又极大的扩展了粒子系统的功能,并将其作为一种建模工具,他提出了粒子间相互结合的思想,从而使粒子与粒子之间进行交互,并阐明利用大量的简单图元间的交互作用可产生复杂的行为。Miller&Pearce、Tonnesen 等人开发了双粒子系统来模拟像流体一样的或溶化的物质。David E. Breen 利用“交互粒子”模拟了布匹、织物。再如大家非常熟悉的三维动画制作的最新软

16、件 3DSMAX 就载有“Spray”和“Snow”两个粒子系统来模拟喷射的火花、飘舞的雪花、飞扬的尘埃等特殊效果,3DSMAX 还有带有两个外挂模块“Sand Blaster”和“All Purpose Particles” ,用来创建气泡、焰火、冲击波等动态图像。总之,粒子系统能够创建各种动画效果。国近年来有许多大学对粒子系统模型进行了研究、探索和应用,并取得了一定的成果。例如,徐迎庆等人利用粒子系统模拟了水面溅起的水沫以与流水与石头碰撞后产生的水花等效果;宋万寿等人在 IBM PC386 机上开发了基于粒子系统方法的焰火与树木模拟实验系统等。国的研究虽然取得了一定的进展,但采用粒子系统有

17、效地模拟模糊景物的论文并不多,需要进一步开发、研究与实现。总而言之,粒子系统为如何模拟具有复杂结构与复杂运动的物体提供了一个简洁、抽象的描述。用它所创建的动态模糊效果是其他图像生成技术难以达到的。但迄今为止,所考虑的都是单个粒子的运动,对物体的模型也作了许多假设。至于粒子间的相互作用、碰撞检测等都未深入涉与。另外,利用 3DSMAX 制作的烟火、浪花,其效果还不太理想,需要将粒子系统与其他方法想结合,开发出更新更好的算发,这些都是今后的研究方向之一。1.4 喷泉模拟的要求与意义本课题要求使用 OpenGL 编写程序实现粒子系统,并模拟一个正在喷水的喷泉,绘制出三维动画。具体要求如下:1. 理解

18、图形学中粒子系统的原理和作用;2. 利用 OpenGL 实现粒子系统;3. 模拟一个正在喷水的喷泉,考虑水滴的材质和光照属性,或选择较好的贴图;4. 喷泉的水流要连贯,水滴成流,符合现实情况,有曲线的喷出下落路线;5. 设计并绘制一个场景,使得场景比较逼真。目前,粒子系统还处于萌芽阶段,很多技术不完善,还有很多的发展空间。本课4 / 32题用粒子系统对喷泉进行模拟,是为了让更多人的了解粒子系统,对粒子系统的重要性有个初步的认识,并为大有致力于粒子系统的同学有机会更深入的了解。5 / 322. 相关学术知识计算机图形学中经常要用到许多物理、数学学知识。就拿本课题来介绍,喷泉的模拟就是模拟喷泉的样

19、子,喷泉是一个抛物线,怎样去模拟呢?首先必须清楚喷泉中水滴是怎么运动的,这就要用到物理学的知识了初速度、运动方向和所受到的力决定其运动线路。然后怎么保证水滴在那个空间运动呢?这就需要运用数学知识了。定义水滴的坐标,水滴根据坐标物理学的变化进行抛物变化,然后形成一个喷泉模型。当然喷泉的模拟也离不开计算机图形学本身的知识,这些知识都将会在这部分介绍下。2.1 物理学知识本课题运用了物理学中的抛物落体运动的知识。即:物体在只收到重力的作用下以一定的初始速度进行匀加速运动。(1)抛物运动的加速度是 g=9.8m/s*s(2)抛物运动的距离公式是 Sx=Vxt+gt*t/2 Sy=Vyt+gt*t/2

20、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-

21、Y为纸上或屏幕上的水平轴和垂直轴,正 Z 轴指向纸外或屏幕外。如图 1:6 / 32图图 2-12-1 空间坐标系空间坐标系其次介绍一下向量:向量就是既有大小又有方向的量。在本课题中,需要运用的主要是一些向量的坐标运算。在几何学上,有同样方向和长度的两个向量相等;在数学上,有同样维数和分量的向量相等。在几何学上,向量大小是有向线段的长度,知道向量的分量,利用公式(2-1)就能计算出向量的大小:u=sqrt(ux*ux+uy*uy+uz*uz)(2-1)其中,u表示向量 u 的长度。标准化向量是让向量的大小等于 1,即被叫作单位向量。可以利用向量大小以与各个分量把一个向量标准化,如公式(2-2)

22、所示:=u/u=ux/u,uy/u,uz/u(2-2)其中, 表示单位向量。通过分别把两个向量的各个分量相加,可以得到向量之和,如公式(2-3)所示:u+v=(ux+ux,uy+uy,uz+uz)(2-3)2.3 OpenGLOpenGL 是 OpenGraphicsLib 的缩写,是一套三维图形处理库,也是该领域的工业标准。计算机三维图形是指将用数据描述的三维空间通过计算转换成二维图像并显示或打印出来的技术。OpenGL 就是支持这种转换的程序库,它源于 SGI 公司为其图形工作站开发的 IRIS GL,在跨平台移植过程中发展成为 OpenGL。7 / 32OpenGL 是目前用于开发可移植

23、的、可交互的 2D 和 3D 图形应用程序的首选环境,也是目前应用最广泛的计算机图形标准。OpenGL 是一套的计算机图形处理系统,是图形硬件的软件接口,GL 代表图形库(Graphics Library) 。OpenGL 具有可移植性,任何一个 OpenGL 应用程序无须考虑其运行环境所在平台与操作系统,在任何一个遵循OpenGL 标准的环境下都会产生一样的可视效果。OpenGL 不是一种编程语言,而是一种 API(Application Programming Interface,应用程序编程接口) 。当我们说某个程序是基于 OpenGL 的或者说它是个OpenGL 程序是,意思是说它是用

24、某种编程语言如 C 或 C编写的,其中调用了一个或多个 OpenGL 库函数。作为一种 API,OpenGL 遵循 C 语言的调用约定。OpenGL 主要包括三个函数库,它们是核心库、实用函数库和编程辅助库。核心库中包含了 OpenGL 最基本的命令函数。核心库提供了一百多个函数,这些函数都以”gl”为前缀,用来建立各种各样的几何模型、进行坐标变换、产生光照效果、进行纹理映射、产生雾化效果等所有的二维和三维图形操作。实用函数库是比核心库更高一层的函数库,它提供四十多个函数,这些函数都以”glu”为前缀。由于 OpenGL 是一个图形标准,是独立于任何窗口系统或操作系统的,在 OpenGL中没有

25、提供窗口管理和消息事件响应的函数,也没有鼠标和键盘读取事件的功能,所以在编程辅助库提供了一些基本的窗口管理函数、事件处理函数和简单的事件函数。这类函数以”aux”作为前缀。值得一提的是,目前 AUX 编程辅助库已经很大程度上被 GLUT 库取代了。GLUT 代表OpenGL 应用工具包(OpenGL Utility Toolkit) ,是一个与窗口系统无关的工具包。它作为 AUX 库的功能更强的替代品,用于隐藏不同窗口系统 API 的复杂性。GLUT 的子程序的前缀使用”glut” 。2.4 MFCMFC 简单来说就是 VC 的类库,是一个编程框架。MFC(Microsoft Foundati

26、on Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立 Windows 下的应用程序,这是一种相对 SDK 来说更为简单的方法。8 / 32从总体上来看,MFC 框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard 可以用来生成初步的框架文件(代码和资源等) ;资源编辑器用于帮助直观地设计用户接口;ClassWizard 用来协助添加代码到框架文件;最后编译,则通过类库实现

27、了应用程序特定的逻辑。构成 MFC 框架的是 MFC 类库。MFC 类库是 C+类库。这些类或者封装了 Win32 应用程序编程接口,或者封装了应用程序的概念,或者封装了 OLE 特性,或者封装了 ODBC和 DAO 数据访问的功能等等。MFC 抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是 CObject 和 CCmdTarget。CObject 是 MFC 的根类,绝大多数 MFC 类是其派生的,包括 CCmdTarget。CObject 实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从 CObject 派生的类

28、都将具备或者可以具备 CObject 所拥有的特性。CCmdTarget 通过封装一些属性和方法,提供了消息处理的架构。MFC 中,任何可以处理消息的类都从 CCmdTarget 派生。针对每种不同的对象,MFC 都设计了一组类对这些对象进行封装,每一组类都有一个基类,从基类派生出众多更具体的类。这些对象包括以下种类:窗口对象,基类是CWnd;应用程序对象,基类是 CwinThread;文档对象,基类是 Cdocument,等等。程序员将结合自己的实际,从适当的 MFC 类中派生出自己的类,实现特定的功能,达到自己的编程目的。MFC 以“C+”为基础,自然支持虚拟函数和动态约束。但是作为一个编

29、程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数表过于臃肿,消耗存,效率低下。例如,CWnd 封装 Windows 窗口对象时,每一条Windows 消息对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC 建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。这样,通过虚拟函数和消息映射,MFC 类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入 MFC 的编程框架。MFC 编程框架将在适当的时候、适当的地方来调用程序的代码。9 /

30、32如前所述,MFC 实现了对应用程序概念的封装,把类、类的继承、动态约束、类的关系和相互作用等封装起来。这样封装的结果对程序员来说,是一套开发模板(或者说模式) 。针对不同的应用和目的,程序员采用不同的模板。例如,SDI 应用程序的模板,MDI 应用程序的模板,规则 DLL 应用程序的模板,扩展 DLL 应用程序的模板,OLE/ACTIVEX 应用程序的模板,等等。这些模板都采用了以文档-视为中心的思想,每一个模板都包含一组特定的类。为了支持对应用程序概念的封装,MFC 部必须作大量的工作。例如,为了实现消息映射机制,MFC 编程框架必须要保证首先得到消息,然后按既定的方法进行处理。又如,为

31、了实现对 DLL 编程的支持和多线程编程的支持,MFC 部使用了特别的处理方法,使用模块状态、线程状态等来管理一些重要信息。虽然,这些部处理对程序员来说是透明的,但是,懂得和理解 MFC 部机制有助于写出功能灵活而强大的程序。总之,MFC 封装了 Win32 API,OLE API,ODBC API 等底层函数的功能,并提供更高一层的接口,简化了 Windows 编程。同时,MFC 支持对底层 API 的直接调用。MFC 提供了一个 Windows 应用程序开发模式,对程序的控制主要是由 MFC 框架完成的,而且 MFC 也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由

32、其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。MFC 是 C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是 C+对继承的支持,对虚拟函数的支持,以与 MFC 实现的消息映射机制。3. 粒子系统的设计3.1 Particle System API为了方便粒子系统的运用,McAllister 以 OpenGL 为基础,利用 C+开发了一套Particle System API。这套 API 具有以下优点:运行高效、运用灵活、参数独立、升级方便、硬件

33、无关、学习简单等。该系统共分为五个部分:粒子组、活动、活动列表、属性和域。所有的粒子都存在粒子组中,粒子组是一组具有一样作用力的粒子集合。用户可10 / 32以定义多个具有不同行为的粒子组分别进行调用,但在某一时刻,只能有一个粒子组是活动的。活动是粒子组修改粒子属性的函数。活动列表类似与 OpenGL 中的显示列表,可以把一系列操作都封装在一个活动列表中,需要的时候调用相应的活动列表。属性提供了一些函数,用来修改粒子的颜色、大小和生命周期等属性。域定义了矩形、球体、园盘、圆柱等一些形状,使行为函数、属性函数能在域围做定义。下面的伪代码描述了粒子系统运行的流程:for each particle

34、 group jpCurrentGroup(j)/指定 group j 为当前粒子组for each time step per rendered framepSource()/产生新的粒子other actions/改变粒子组属性 pMove()/更新粒子位置 end for pDrawGroup()/绘制粒子end forother drawing每颗粒子的生命周期或工作处理流程如图 3-1 所示:11 / 32图 3-1 每颗粒子的生命图3.2 常见的粒子运动模型粒子运动中粒子产生的时候都具有一定的初始属性,粒子作为质点,按照动力学的规律进行运动。以下是几种常见的运动形式:(1) 直线运

35、动。粒子的位置和速度变化遵循下面的原则(如公式(3-1) ):P=P0+Vdt, V=V0+adt(3-1)其中 P 为粒子位置,P0 为粒子初始位置,V 为粒子速度,V0 为初始速度,a为粒子加速度。(2) 阻尼运动。在当前运动方向上的粒子根据阻尼的作用,其速度根据某种比例减少,一般取值如公式(3-2)所示:V=V0(1-dt)(3-2)其中 d 为阻尼运动的阻尼因子,d=0, 1。(3) 螺旋运动。螺旋运动能按照给顶轴进行旋转,以产生粒子的翻滚等效果,使速度方向发生改变。(4) 反弹运动。反弹运动能改变粒子运动速度的大小与方向。对于无能量损失12 / 32的反弹运动,类似于光的反射,如公式

36、(3-3)所示:V0=V-2(V0N)N(3-3)其中 N 为反射面的方法向量。3.3 喷泉模拟的算法想要有好的模拟效果,首先要构造合适的坐标系。假想观察者的视点位于屏幕正前方,以喷泉出水的管嘴的中心位置为 O,设置 X 轴正向沿从左至右的方向,Y 轴正向沿从下至上的方向,Z 轴正向为从里至外的方向。喷泉种类多样,本文挑选出其中一些具有代表性的进行研究和模拟。下面以这样的一个喷泉为例来说明模拟方法:这个喷泉是从以原点 O 为中心的管嘴中喷出水柱,经过两次面反射之后落在水池之中。图 3-2 描述了这个喷泉的大致形状,其中虚线段表示的 1 和 2 平面为喷泉的反射面,他们的形状和位置可以由用户设置

37、。目前反弹面的形状可以设为矩形或者圆;粗实线表示喷泉水流的轮廓;最下方用实线表示的 0 平面为水池表面。在这个例子中,1 与 Y 轴交于原点 O,2 与 Y 轴交于 P1 点,0 与 Y 轴交于 P2 点。图 3-2 喷泉形状图示3.3.1 喷泉粒子初始化首先设定粒子的初始属性,包括粒子的初始速度、初始位置以与颜色。将粒子的初始速度(Vx,Vy,Vz)限制在一个圆柱环的域,圆柱的轴平行与 Y 轴并且长度很短,圆柱的外径和径也都不大,这样可以保证粒子以比较稳定的状态变化。然后设定粒子的初始颜色,由于是模拟喷泉水流,设定粒子颜色为白色。现在就可以产生新粒了,将粒子产生的位置(x0,y0,z0)围限

38、制在 Z 轴上一条很短的直线段上,这样可以使粒子产生的位置看起来就像从一个很细的管嘴喷出来一样。粒子的位置将按照下面公式(3-4)变化:x=x0+Vxdty=y0+Vydt(3-4)z=z0+Vzdt其中, (x,y,z)是粒子的位置, (x0,y0,z0)是粒子的初始位置, (Vx,Vy,Vz)是粒子的速度。13 / 323.3.2 喷泉粒子的运动轨迹为了设定粒子的行为模型,首先要确定粒子受力的物理模型。粒子一直受重力作用,因为设定粒子在生命周期一直受 Y 轴负方向的力作用,也就是给粒子一个沿重力作用方向的加速度。为了有合适的下落速度,以取得良好的动画效果,经过多次实验之后针对当前的初始速度

39、把加速度的值设置为 0.01,而非重力加速度为 9.8。与无能量损失的反弹运动不同,在该模型中有两个重要参数,摩擦系数 和反弹系数 。在系统中,任何粒子的速度矢量 V 都被分解为两个方向的速度分量 Vn 和Vt,其中 Vn 是粒子反弹面 的法线方向上的分量,另外一个分量 Vt 与 相切,图3-3 所示为粒子反弹运动的示意:图 3-3 粒子反弹运动示意图经过反弹之后,Vn 被反向,同时大小乘以反弹系数 ,得到 Vn和 Vt合成就得到了粒子在经过反弹面作用后的速度 V ,如公式(3-5):Vn=(VN)NVt=V-Vn(3-5)V=(1-)Vt-Vn3.3.3 粒子的消亡粒子不能无限制的运动下去,

40、那样系统中将不会有新粒子产生。可以强制消除系统中处于错误运动轨迹的粒子,也就是不再有生存需要的粒子。设置一个与 Y 轴正交的平面域,使运动到该平面下方的粒子全部消亡。平面由平面上的特征点 O 和法线方向 N 确定,在上述例子中,特征点设置为 P2 点,法线方向设置为 Y 轴正方向。3.3.4 喷泉绘制粒子系统的产生、运动和消亡都确定之后,就可以进行喷泉的绘制工作了。考虑到粒子系统水花四溅的特征,在绘制粒子的时候,本文采用了 Line 方式,而不是采用传统的 Point 方式。Line 方式就是将粒子的原始位置和根据粒子速度计算出来的粒子下一个时刻位置用直线连接,这样可以模拟出水粒子模糊的效果。

41、实验证明 Line 方式模拟的效果更加逼真。以下为其实现方式:14 / 32喷泉由多个水柱组成,每个水柱可看成由很多个小水珠组成,每个小水珠可由一个粒子来模拟,本文称之为喷泉粒子。喷泉的模拟按图 3-4 所示的步骤进行:产生新的喷泉粒子并初始化属性绘制喷泉粒子更新喷泉粒子的速度绘制喷泉粒子Texture 数据转为顶点数据更新喷泉粒子的位置和其他属性图 3-4 喷泉粒子处理流程图3.4 纹理映射技术在虚拟环境的绘制中,如果能够成功的实时模拟各类自然现象,场景将会变得十分逼真和生动。而一个好的粒子系统必须具有实时的效果,往往粒子数目越多,物体的真实程度就越高,同时带来大量的计算,这样,在一样的硬件

42、条件下,就降低了实时性。而对于要求限时计算的场景,需要改进传统的粒子系统方法,尽可能地降低渲染这些粒子的代价,提高系统的实时性。由于人们对动态景物的辨认是有限的,且更多关心的是画面的连续性;而纹理映射将丰富的纹理细节跌价在物体表面上,使图形更具有真实感,采用纹理映射技术能产生许多逼真度很高的图象,且实现代价又是相对较小,用纹理图像来表现粒子,这就是所谓的胖粒子(fat particle) 。其纹理包含 alpha 通道(alpha channel) ,还加入伪粒子的特征。这样就可以同时表现出它的形状、透明度和颜色。对于喷泉动态模拟,就会显的更加真实。粒子本身越复杂,渲染同样的效果需要的粒子数就

43、越少。如果是二维纹理还需要结合 BillBoarding 技术(Billboard 是让二维或者面元经过旋转后总是朝向观察者的一种技术。它的思想是:首先把一幅静态图象作为纹理映射到简单的集合平面上,然后根据视点始终与该平面正交。其中还要用到 Alpha 融合技术,使平面本身不可见,15 / 32仅让有用的部分图象显示出来。 )或提绘制(Volume Rendering)技术来实现。在这里本文应用了二维纹理,使用 BillBoarding 和 alpha 通道技术,使得喷泉燃放模型在实际应用中能满足实时性要求并且更加逼真。另外,本文还利用了 OpenGL 显示列表的设计优化程序运行性能,采用显示

44、列表方式绘制一般要比瞬时方式快,尤其能提高网络性能。4. 系统实现在本章容中,将罗列系统中实现的部分功能,并附上一些核心代码。4.1 开发环境首先介绍下系统开发的环境。本系统是在 VC2005 中实现的,利用 OpenGL,运用了 MFC 框架。4.2 粒子生成每个粒子都应该有自己的属性来区分其他的粒子。首先对每个粒子给予一些属性,粒子根据它属性的变化进行活动。粒子的属性包括:粒子当前状态、粒子当前位置、粒子当前生命值、粒子存在的时间、粒子当前速度以与粒子运动方向。当一个粒子产生时,需要给它的属性定义初始值(此操作定义为 AddParticles) ,其值为:当前状态:type=0;(0 表示

45、粒子状态为运动,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; j3; j+)for (i=0; iprev = tempp;tempp-next = fnj;fnj = tempp;tempp-t = -9.9;tempp-v

46、 = (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.

47、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;17 / 32由于粒子只受到重力作用,x、z 方向上并不受力,所以粒子 x、z 方向通过自己方向上速度的不断自加来计算其在 x、z 轴上的坐标。而在 y 方向上,粒子受到重力的作用,通过物理学公式 s=g*

48、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; jtype = 0) / 如果粒子处于运动状态tempp-x += tempp-xd;tempp-z += tempp-zd;/ 计算粒子的高度 H = gt2/2tempp-y = -(9.8*(tempp-t*tempp-t/4)/2+122.5

49、;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; / 粒子淡化tempp = tempp-next; / 下一个粒子18 / 322、粒子删除的实现:粒子的属性中有个 type,表示粒子所处的状态。当 type=0 时表示粒子在地面上空即粒子处于运动状态,当 type=1 是表示粒子位于地面即粒子处于静止。在粒子的活动中,设定当 y(即粒子的高度)0 时 type=0,粒子在地面上空,

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

51、;tempp = temp1;19 / 32tempp = tempp-next;4.4 水柱生成水柱的生成实际上就是许多粒子不断活动的结果。具体的实现就是对粒子进行增加、移动、删除的操作,不断的循环这样的操作就可以实现水柱的生成了。即AddParticles()-MoveParticles()-DeleteParticles()的循环。生成结果如图 4-1 所示:图 4-1 水柱的模拟效果图4.5 喷泉旋转正如大家平时所看到一样,喷泉是由一个个水柱组成的。水柱的变化形成各种各样的喷泉。本文在实现时,定义了一个数组 fnj,其中 j 表示第 j 个的水柱。喷泉可以看做是以喷射点为圆心向周围 3

52、60 度方向上喷射的无数个水柱组成。按照这个思想,只要将水柱进行 360 度的旋转,喷泉就可以模拟出来了。具体实现代码如下:alpha = (j*20+a)*PI)/180;20 / 32ttx = 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;vect_mult(&vectd, &upv, &vectl);norm

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

54、波,说明纹理的映射方式,启用纹理。(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);21 / 32glTexCoord2f(0, 0); glVerte

55、x3f(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) 说明纹理映射方式glTexEnvf(G

56、L_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);(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);glTexCoord2f(1, 1); glVertex3f(ttx+vectl.x), (tempp-y+u

57、pv.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;22 / 32glBindTexture(GL_TEXTURE_2D, texture0);AddParticles();MoveParticl

58、es();DeleteParticles();glPushMatrix();for (j=0; jx*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;vect_mult(&vectd, &upv, &vectl);normalize(&vectl);vectl.x *= 5;vectl.y *= 5;vectl

59、.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-23 / 32upv.y), (ttz+vectl.z);glTexCoord2f(1, 1); glVertex3f(ttx+vectl.x), (tempp-y+upv.y), (ttz+vectl.z);glTexCoord2

60、f(0, 1); glVertex3f(ttx-vectl.x), (tempp-y+upv.y), (ttz-vectl.z);tempp = tempp-next; / 绘制下一个粒子列表glEnd();glPopMatrix();4.7 场景实现喷泉当然是从地下喷射出来,需要一个地面来衬托喷泉的喷射。因此,本文绘制了一个简单的地面进行场景的实现。这个地面只是一个简单的有纹理贴图的立方体,其定义如下(4 个顶点):glTexCoord2f(0, 0); glVertex3f(-100, 0, -100);glTexCoord2f(2, 0); glVertex3f(-100, 0, 100);glTexCoord2f(2, 2); glVertex3f(100

温馨提示

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

评论

0/150

提交评论