基于粒子系统的心形烟花模拟
吴国宝1,2,汪继文1,2**
作者简介:吴国宝,(1983-),男,硕士研究生,科学工程计算与可视化。
通信联系人:汪继文,(1958-),男,教授、博导,计算流体力学. E-mail: wjw@ahu.edu.cn
(1. 安徽大学计算智能与信号处理教育部重点实验室,合肥 230039;
5 2. 安徽大学计算机科学与技术学院,合肥 230039)
摘要:计算机动画模拟是近年来计算机图形领域研究热门方向之一,粒子系统作为模拟不规
则物体运动的有效算法,在自然现象的仿真方面有着突出的贡献。本文通过对传统烟花系统
模型和燃放原理的深入研究,提出了一种基于行为模型的"心"形烟花粒子系统的模拟方法。
基本原理是采用阿基米德螺线函数来控制爆炸瞬间粒子的属性,同时结合纹理映射和色彩融
10 合技术绘制烟花粒子。编程上基于OpenGL,采用Visual C++实现了“心”形烟花的模拟。
实验结果表明提出的绘制方法具有快速、简单的特点,达到了预期的效果。
关键词:粒子系统;"心"形烟花;纹理映射
中图分类号:TP393
0 引言
近年来,随着计算机技术和动画技术的发展,自然景物的模拟越来越受到科研工作者的
关注。实时性和真实性是我们追求的目标,然而自然景物中物体构造复杂,例如火焰、水、
雨、雪、烟花等,在形态上具有不规则性,在运动上具有随机行,很难用传统的几何模型和
35 行为模型建模。
1983 年,W.T.Reeves[1]提出了粒子系统,并成功的模拟了自然景物。它的优点是可以利
用非常简单的体素来构造不规则的物体,而不是用传统线、曲面或者多边形来再现自然景物,
因此粒子系统被公认为是模拟不规则物体最成功的图像生成算法[2]。目前,国内外已经有许
多研究者采用粒子系统对自然景物进行成功的模拟。万华根[3]等人通过对N-S 方程的求解并
40 结合粒子系统来模拟喷泉,同时利用圆球实现水滴,采用光线跟踪算法绘制。T.Loke[4]等人
采用粒子衍生法来绘制烟花粒子的轨迹,实现了烟花的多种效果。本文通过在研究上述方法
的基础上,使用纹理贴图和色彩混合技术实现了烟花粒子系统,同时在极坐标下对“心”形
烟花的实现做出了改进。
1 粒子系统基本原理
45 一个粒子系统由大量称为粒子的简单个体构成。每个粒子都有一组属性,包括位置、速
度、大小、生命值,颜色等,这些属性随着时间的推移在不断的变化。一个粒子究竟有什么
样的属性,主要取决于实现的具体应用。粒子系统将物体的几何行为和动作组合在一个有机
的模型中。系统中的每个粒子在整个应用中都是不断变化的,这个变化的过程,称之为粒子
的生命期。通常在生命期内,每一时刻,粒子系统要完成以下几个步骤[5]:
50 1) 粒子系统初始化。初始化包括粒子数目,粒子大小、颜色、生命期等属性的预处理。
2) 更新现有粒子属性。随着时间的推移,粒子的颜色,速度,位置,透明度已经发生
变化,需要更新粒子的属性。同时判断粒子个数,如果小于展现个数则产生新的粒
子。
3) 移除“消亡”的粒子。粒子本身有自己的生命期,该步骤用于检测每个粒子的生命
55 期,若为0 则需要将粒子从系统中删除,完成整个变化的过程,同时减少对内存的
消耗。
4) 绘制粒子。前面的步骤是粒子的动态处理过程,要展示粒子的运动轨迹,及各属性
的变化,以形成动画的效果,就需要将每一帧的粒子绘制在屏幕上。
5) 重复(2)、(3)、(4)步骤,构成了一个类似图1 的完整粒子系统。
60
图1 粒子系统流程图
Fig. 1 Particle system flow chart
2 烟花粒子系统的建模
65 由于烟花的形状多种多样、千姿百态,因此要实现对烟花的模拟,需要建立起烟花粒子
系统的模型。
2.1 应用场景模型
在使用粒子系统前,需要对模拟的应用做相应的分析。包括该应用中粒子需要具有的属
性,运动过程的分解,粒子的多少,并建立起如图2 的空间坐标系。
70
图2 三维空间坐标系
Fig. 1 Three-dimensional coordinate system
粒子的多少,影响着系统的性能,粒子数太多,需要渲染和更新的次数也就越多,占用
75 系统的资源也就越多。相反粒子的数目较少,占用的系统资源也就越少,速度也就越快,但
是视觉上的效果显得不够理想,因此合理的选择粒子的数量是模拟的一个关键[6]。烟花从上
升到爆炸、产生预定的形状、最后在空中消失,是烟花模拟的整个过程。因此烟花粒子的属
性包括当前位置、颜色、透明度、速度、加速度、大小、生命值等, 可表示为
ParticleAttr={Position、Color、Fade、Speed、Acceleration、Size、Life},其中位置、速度、
80 加速度是在空间坐标系下的三维向量。
2.2 粒子数据结构
由2.1 对粒子的属性描述可知,粒子的数据结构可表示为:
typedef struct Particle{
GLfloat xpos; //(xpos,ypos,zpos)为粒子的位置
85 GLfloat ypos;
GLfloat zpos;
GLfloat xspeed; //x 方向的速度
GLfloat yspeed; //y 方向的速度
GLfloat zspeed; //z 方向的速度
90 GLfloat r; //(r,g,b)为粒子的颜色
GLfloat g;
GLfloat b;
GLfloat life; //粒子的生命值
GLfloat fade; //粒子的衰减速度
95 GLfloat size; //粒子大小
}
2.3 粒子系统的初始化
烟花粒子系统的初始化,是赋予烟花粒子属性初始状态。
2.3.1 场景演示空间初始化
100 场景演示空间初始化,在OpenGL 中使用视景体的来定义空间的可视范围。视景体可以
看作是一个有限空间体,在空间内的物体将会展示在画面上,超出空间范围的物体将被裁减
到屏幕之外。与视景体相对应的是投影变换,包括透视投影和正投影。在正投影下,视景体
被定义一个平行的长方体。使用glOrtho(GLdouble left,GLdouble right,GLdouble bottom,
GLdouble top,GLdouble near,GLdouble far) 创建视景体,A(left,bottom,-near),
105 B(right,top, -far) 分别映射到窗口的做下角和右上角。根据实验演示需求,我们分
别初始化A(-10,0,0),B(10,20,10),即将窗口可视范围定义为水平方向范围x(-10,10),
垂直方向y(0,10),深度z(0,10)。
2.3.2 烟花个数初始化
为展示烟花粒子数量对系统的影响,可将烟花粒子的数量使用宏定义,以方便修改数量。
110 定义方式为 #define MAX_FIRES 3 ,此处定义烟花个数为3;
2.3.3 位置及速度初始化
烟花粒子从窗口低端y=0 处燃放,x、z 方向使用随机函数分别控制位置在(-5,5)、(0,3)
范围。烟花燃放后,为控制烟花向靠近yz 平面,可以通过烟花燃放的位置来控制烟花速度
方向,如果xPose = 0 则初始化xSpeed 为 0,如果xPose>0 则初始化xSpeed 为小于0 的关
115 于xPose 的随机数,相反,如果xPose<0 则初始化xSpeed 为大于0 的关于xPose 的随机数。
加速度初始化,运动的物体不仅受到重力的作用,同时也会受到空气阻力,等外力的作
用,所有外力的和决定了物体受到的加速度大小。在本实验中,只考虑在垂直方向重力产生
的加速度。
2.4 粒子的运动
120 粒子系统中最重要的部分在于确定每一时刻当前粒子的运动规律,包括该时刻的粒子的
位置、速度、生命值等。而这些属性需要通过上一帧属性状态和物理知识来分析。根据牛顿
运动定律可知,粒子下一帧的位置为:
⎪ ⎪⎩
⎪⎪⎨
⎧
+ = +
+ = +
+ = +
∫
∫
∫
s t dt s t v t dt
s t dt s t v t dt
s t dt s t v t dt
z z z
y y y
x x x
( ) ( ) ( )
( ) ( ) ( )
( ) ( ) ( )
(1)
⎪ ⎪⎩
⎪⎪⎨
⎧
+ = +
+ = +
+ = +
∫
∫
∫
v t dt v t a t dt
v t dt v t a t dt
v t dt v t a t dt
z z z
y y y
x x x
( ) ( ) ( )
( ) ( ) ( )
( ) ( ) ( )
(2)
其中( s (t dt) x + ,s (t dt) y + ,s (t dt) z + )下一帧的位置,( v (t dt) x + ,vy (t dt) 125 + ,
v (t dt) z + )下一帧的速度,dt 为连续两帧间的时间间距。
2.5 粒子的消亡与重生
烟花粒子在整个烟花系统中有着自己的生命值,粒子从生成开始到消失所经历的时间为
烟花粒子的生命周期。初始化粒子的生命值为1,为区分不同烟花粒子生命周期,提高真实
130 感的效果,需要为每个烟花粒子定义在一定范围内的随机衰减因子,衰减因子越大,粒子生
命周期越短,相反衰减因子越小,粒子生命周期越长。随着时间的推移,单个烟花粒子的生
命值也在逐渐减少,直到为0。此时,该粒子完成了整个模拟的流程,需要移除粒子系统,
并释放占用的内存空间,同时告诉系统当前的粒子总数,用以判断是否要生成新的烟花粒子。
如果烟花粒子的总数小于预期定义的烟花粒子数目,系统将在燃放点处初始化一颗新的烟花
135 粒子,完成了烟花粒子的“重生”。
3 “心”形烟花模拟的实现
3.1 烟花粒子的渲染
烟花粒子系统模型中,烟花粒子上升到最高点,粒子产生爆炸,将产生大量的粒子。每
个粒子含有位置、速度、加速、颜色等属性,初始化大量的烟花粒子,并跟踪计算,存储每
140 个粒子的属性变化,需要占用大量的内存,如果机器的性能不是很好,难以达到烟花模拟实
时性的效果。减少烟花粒子数目会影响模拟的真实感,因此解决该类问题,也不能单纯从减
少烟花粒子的方面入手。为了降低渲染粒子的代价,还需要在系统中使用纹理贴图、色彩混
合技术。纹理贴图允许把一副烟花粒子图像映射到一个多边形的表面上,贴图能够保证当这
个多边形变换或者渲染时,映射到多边形表面的图像也能够表现出正确的行为。利用纹理贴
145 图是多变形看上去就像是自然世界的物质[7]。这样一颗烟花粒子就可以标识为通过纹理贴图
的四边形,而这个四变形只用4 个点粒子构成,从而降低了需要渲染的烟花粒子总数。然而
实验中经过贴图的烟花粒子不能与背景完全的融合,四边形仍隐约可见,影响了视觉效果。
这就需要用到OpenGL 中的混合技术。混合是把被处理的片段颜色值与已经存储在帧缓存区
中的像素颜色值进行混合。在不使用混合的情况下,每个新片段将会改写帧缓冲区中已经存
学术论文网Tag:计算机论文 代发论文 职称论文发表
|