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

更新时间:2023-04-11 00:07:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

HUNAN UNIVERSITY 毕业设计(论文)

设计(论文)题目:基于OpenGL粒子系统的喷泉模拟学生姓名冯亮

学生学号20041610504

专业班级软件测试一班

学院名称软件学院

指导老师申煜湘

系主任(院长)林亚平

2008 年5 月19 日

湖南大学毕业设计(论文) 第 I 页

湖南大学软件学院

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

摘 要

随着计算机仿真技术的不断提高,人们对真实事物的模拟要求越来越高,模拟技术的重要性越来越突出,尤其在3D 游戏、军事演习和仿真实验等方面。而寻求能准确地描述客观世界中各种现象与景观的数学模型,并逼真地再现这些现象与景观,是计算机图形学的一个重要研究课题。

本文从计算机图形学中粒子系统模拟自然景物的方面出发,介绍了采用粒子系统模拟真实事物的方法。实际上,很多自然景物难以用几何模型描述,如烟雾、植物、水波、火焰等,粒子系统的景物模拟则超越了几何模型的限制,能够用简单的模型描述复杂的自然景物。

本课题设计了基于OpenGL 粒子系统的喷泉模型,详细讨论了模型中粒子的属性及其变化,实现了具有较强真实感的动态变化和抛物变化等喷泉特征,采用了纹理映射和视线跟踪技术进行三维喷泉渲染;同时,采用Line 方式取代传统的Point 方式渲染粒子实现喷泉模拟。该方式模拟喷泉比较真实,速度快,在普通的微机上可以得到令人满意的效果。

关键词:粒子系统,喷泉模拟,特效

湖南大学毕业设计(论文) 第 II 页

湖南大学软件学院

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

湖南大学毕业设计(论文) 第 III 页

湖南大学软件学院

目 录

1. 绪论 (1)

1.1 自然景物模拟概述 (1)

1.2 粒子系统的背景及其介绍 (1)

1.3 国内外研究现状 (2)

1.4 喷泉模拟的要求及意义 (3)

2. 相关学术知识 (5)

2.1 物理学知识 (5)

2.2 数学知识 (5)

2.3 O PEN GL (6)

2.4 MFC (7)

3. 粒子系统的设计 (10)

3.1 P ARTICLE S YSTEM 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)

湖南大学毕业设计(论文) 第 IV 页

湖南大学软件学院

4.7 场景实现 (23)

5. 总结 (26)

致谢 (27)

参考文献 (28)

湖南大学毕业设计(论文) 第 1 页

湖南大学软件学院

1. 绪论

1.1 自然景物模拟概述

自然景物模拟一直都是计算机图形血研究者面临的巨大挑战之一。由于自然景物的形状随即变化,表面往往含有丰富的细节,很难用传统的解析曲面来描述。常见的景物模拟方法一般有以下两种:

第一种:根据数学函数构造出景物外型,然后变换时间函数t 。这类方法可以称为过程动画的方法,比较典型的是Fournier 模拟水波的方法。

第二种:从物体运动的物理原理出发,一般是求解一组力学方程,得到质点在各个时刻的状态。这类方法可以称为基于物理的方法,比较典型的是Foster 的方法。

比较而言,过程动画方法比较简单、计算效率较高,但效果比较单调,适用范围比较狭窄。基于物理方法的效果比较真实,适用范围广泛一些,但是计算起来非常复杂,效率比较低。

在模拟诸如云、烟、火等不规则模糊物体时,粒子系统是迄今为止被认为是最成功的一种算法。为了方便用粒子系统模拟各种物体,McAlbster 结合OpenGL ,用C++开发了一套粒子系统API 。利用这套API 可以很方便地对运动的物体进行动态模拟,首先将粒子的活动进行简单的分析和描述,然后对粒子系统进行场景渲染,结合OpenGL 提供的一些功能如纹理映射效果,可以模拟很多种自然景物。本课题就可以利用这种方法来模拟多种喷泉的效果。

1.2 粒子系统的背景及其介绍

粒子系统到底是什么?所谓的粒子系统,就是将人们看到的物体运动和自然现象,用一系列运动的粒子来描述,再将这些粒子运动的轨迹映射到显示屏上,在显示屏上看到的就是物体运动和自然现象的模拟效果了。

利用粒子系统,可以在屏幕中表现诸多的特殊效果,如:焰火、火苗、落叶、雪花飞舞等。不怕做不到,就怕想不到。只要你的想象力足够丰富,你可以创造出意想不到的奇迹来。

粒子系统的基本思想是:采用许多形状简单的微小粒子作为基本元素,用它们来表示不规则模糊物体。这些粒子都有各自的生命周期,在系统中都要经历“产生”、“运动和生长”及“消亡”三个阶段。粒子系统是一个有“生命”的系统,因此不象传统方法

湖南大学毕业设计(论文) 第 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 在其群体行为研究中,又极大

湖南大学毕业设计(论文) 第 3 页

湖南大学软件学院

的扩展了粒子系统的功能,并将其作为一种建模工具,他提出了粒子间相互结合的思想,从而使粒子与粒子之间进行交互,并阐明利用大量的简单图元间的交互作用可产生复杂的行为。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. 设计并绘制一个场景,使得场景比较逼真。

目前,粒子系统还处于萌芽阶段,很多技术不完善,还有很多的发展空间。本课题

湖南大学毕业设计(论文) 第 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:

湖南大学毕业设计(论文) 第 6 页

湖南大学软件学院

图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 。

湖南大学毕业设计(论文) 第 7 页

湖南大学软件学院

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 来说更为简单的方法。

湖南大学毕业设计(论文) 第 8 页

湖南大学软件学院

从总体上来看,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 编程框架将在适当的时候、适当的地方来调用程序的代码。

湖南大学毕业设计(论文) 第 9 页

湖南大学软件学院

如前所述,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 实现的消息映射机制。

湖南大学毕业设计(论文) 第 10 页

湖南大学软件学院

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所示:

湖南大学毕业设计(论文) 第 11 页

湖南大学软件学院

图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) 反弹运动。反弹运动能改变粒子运动速度的大小与方向。对于无能量损失的

湖南大学毕业设计(论文) 第 12 页

湖南大学软件学院

反弹运动,类似于光的反射,如公式(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)变化:

湖南大学毕业设计(论文) 第 13 页

湖南大学软件学院

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 粒子的消亡

粒子不能无限制的运动下去,那样系统中将不会有新粒子产生。可以强制消除系统中处于错误运动轨迹的粒子,也就是不再有生存需要的粒子。

湖南大学毕业设计(论文) 第 14 页

湖南大学软件学院

设置一个与Y 轴正交的平面域,使运动到该平面下方的粒子全部消亡。平面由平面上的特征点O 和法线方向N 确定,在上述例子中,特征点设置为P2点,法线方向设置为Y 轴正方向。

3.3.4 喷泉绘制

粒子系统的产生、运动和消亡都确定之后,就可以进行喷泉的绘制工作了。考虑到粒子系统水花四溅的特征,在绘制粒子的时候,本文采用了Line 方式,而不是采用传统的Point 方式。

Line 方式就是将粒子的原始位置和根据粒子速度计算出来的粒子下一个时刻位置用直线连接,这样可以模拟出水粒子模糊的效果。实验证明Line 方式模拟的效果更加逼真。以下为其实现方式:

喷泉由多个水柱组成,每个水柱可看成由很多个小水珠组成,每个小水珠可由一个粒子来模拟,本文称之为喷泉粒子。喷泉的模拟按图3-4所示的步骤进行:

图3-4 喷泉粒子处理流程图

3.4 纹理映射技术

在虚拟环境的绘制中,如果能够成功的实时模拟各类自然现象,场景将会变得十分逼真和生动。而一个好的粒子系统必须具有实时的效果,往往粒子数目越多,物体的真实程度就越高,同时带来大量的计算,这样,在相同的硬件条件下,就降低了实时性。而对于要求限时计算的场景,需要改进传统的粒子系统方法,尽可能地降低渲染这些粒子的代价,提高系统的实时性。

湖南大学毕业设计(论文) 第 15 页

湖南大学软件学院

由于人们对动态景物的辨认是有限的,且更多关心的是画面的连续性;而纹理映射将丰富的纹理细节跌价在物体表面上,使图形更具有真实感,采用纹理映射技术能产生许多逼真度很高的图象,且实现代价又是相对较小,用纹理图像来表现粒子,这就是所谓的胖粒子(fat particle )。其纹理包含alpha 通道(alpha channel ),还加入伪粒子的特征。这样就可以同时表现出它的形状、透明度和颜色。对于喷泉动态模拟,就会显的更加真实。

粒子本身越复杂,渲染同样的效果需要的粒子数就越少。如果是二维纹理还需要结合BillBoarding 技术(Billboard 是让二维或者面元经过旋转后总是朝向观察者的一种技术。它的思想是:首先把一幅静态图象作为纹理映射到简单的集合平面上,然后根据视点始终与该平面正交。其中还要用到Alpha 融合技术,使平面本身不可见,仅让有用的部分图象显示出来。)或提绘制(V olume Rendering )技术来实现。在这里本文应用了二维纹理,使用BillBoarding 和alpha 通道技术,使得喷泉燃放模型在实际应用中能满足实时性要求并且更加逼真。

另外,本文还利用了OpenGL 显示列表的设计优化程序运行性能,采用显示列表方式绘制一般要比瞬时方式快,尤其能提高网络性能。

湖南大学毕业设计(论文) 第 16 页

湖南大学软件学院

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;

本文来源:https://www.bwwdw.com/article/wjrl.html

Top