粒子系统简介
—管窥自然场景的计算机模拟

一、什么是粒子系统?

粒子系统英文叫做Particle System,是Reeves 在1983 年提出的[1],是利用粒子模拟自然场景的一种技术,例如说雨,雪,水流,爆炸,烟雾等场景。由于这些场景都是根据物理模型计算出来的,也可以说,粒子系统是基于物理原理的一种建模方法。

目前自然场景的模拟方法主要可以分为基于粒子系统的模拟,基于物理模拟以及基于纹理合成的模拟3类,粒子系统由于其具有运算简单,真实感好,和环境交互性好等特点,被认为是迄今为止模拟不规则模糊物体最为成功的一种图形生成算法,在现在的自然场景模拟领域中占有主导地位[1]。

粒子系统的组成元素,自然就是粒子了。一个粒子具有的特征主要包括质量,位置,速度,受力(能量),声明周期,以及颜色,空间尺寸,形状等。每个粒子都代表了自然场景中的一个最小单元,通过很多个粒子相互组合,效果叠加,粒子系统才能够显示五彩斑斓的美丽的自然场景。

二、粒子系统是如何模拟自然场景的?

上面提到,粒子系统是用来模拟不规则模糊物体的最成功的算法,那么这些不规则的模糊物体,粒子系统是如何模拟的呢?为了简单起见,这里拿一个具体的例子,来带领大家在粒子模拟世界中观赏一番。

火焰是自然界中最常见的场景。但是由于火焰的形状是不确定的,能够随风摇摆,并且火焰的颜色也是变化的,中间往往是黄色的火焰,而边缘则变成红色或者其他颜色,这些都对火焰的真是模拟造成了很大的困难。

在基本的火焰粒子模拟系统中,每个粒子都是一个矩形面片。通过给这个面片帖上适当的纹理,打上需要的光照(设置颜色),并设置一定的透明度,这个面片就可以表示一片火焰了。下图左边就是一个简单的火焰粒子纹理图片。

                                

有了粒子的定义后,我们在想要出现火焰的地点,设定一个区域,作为我们火焰粒子的生成区域,以后火焰粒子就要在这里不断产生了。然后需要设定场景中粒子的数量,生命期,以及运动速度等参数,以确定火焰的表现方式,就可以进入粒子模拟的核心算法了。

在火焰的生成区域,我们按照一定速率随机地在不同地点产生粒子。生成的粒子按照设置好的运动速度等参数不停的上升,并且在运动的过程中,不断变化其颜色和透明度。在上升一定时间之后,粒子的透明度减小为零,说明粒子的生命期已经结束,那么就将该粒子去除,然后从粒子生成区域生成新的粒子。周而复始这个过程,在很多个火焰粒子的合作下,一个火焰的效果就被模拟出来了(如上图右侧)。

你是不是觉得很神奇?一个单独的粒子看起来,一点也不像火焰,甚至有点丑陋,但是很多个火焰粒子组合在一起,表现出的效果还真的很不错呢。

从上面的粒子我们可以看出,通常用粒子系统绘制画面,主要包括以下几个步骤[3]:

(1)产生新的粒子加入系统中;

(2)赋予每一粒子一定的属性;

(3)根据粒子属性的动态变化对粒子进行移动和变换;

(4)删除那些已经超过生命周期的粒子;

(5)绘制并显示由有生命的粒子组成的图形。

其中步骤(3),(4),(5)不停地循环形成了物体的动态变化过程。

三、粒子系统模型开发

3.1粒子属性组成

根据具体的要求,可以定义每个粒子的属性和粒子系统的属性,比如说风的影响,粒子自身的速度(如飘落的雪花)等等。其结构体伪代码如下:

粒子结构的定义:
typedef struct {
float mass;         /* 质 量 */
float position[3]; /* 位置向量 */
float velocity[3]; /* 速度向量 */
float force[3];    /* 受力向量 */
……               /* 其他信息 */
float alpha;      /* 透 明 度 */
} *Particle;

粒子系统的定义:
typedef struct {
Particle *p; /* 粒子指针数组 */
int number; /* 粒子数量 */
float time; /* 仿真时钟*/
……        /* 其他信息 */
} *ParticleSystem;

3.2粒子系统开发中需要注意的问题:

由于粒子系统可以表示很多的自然场景,运算简单,实时显示,和环境交互性好等特点,逐渐地吸引了越来越多的人开始关注和研究。但是,要很好的模拟真实的自然场景,在开发过程中,有很多问题是需要注意的。最基本的几个问题包括:

(1)粒子的大小和形状

(2)质量的差别

(3)初始状态

(4)生命周期

(5)随机变量的使用

(6)系统中的粒子的数量 vs 效率

粒子的大小,形状,质量都是由实际的物理模型来限制的,雪花有多大,水滴有多重,都是被自然界限制在一定范围内的,只有我们对自然界的物理模型有一个很高的认识,才能模拟出真实的场景。而粒子的初始状态,生命周期和数量则是由要表现的效果来决定的,雨点的速度比较快,数量比较多,那么模拟出的就是大雨,雨点速度比较慢,而且数量少的时候,模拟出的就是小雨。另外要注意的是,粒子越多,计算机的负荷就越大,如果设定的粒子数量过多,计算机的计算速度可能就会跟不上,结果反而影响了显示的效果。

参考文献:
[1]. Reeves W T. Particle Systems-a Technique for Modeling a Class ofFuzzy Objects[J]. Computer Graphics,1983,17(3):359-376.
[2]. 李建微,陈崇成等.基于粒子系统的林火实时绘制研究及实现.中国图像图形学报.Vol.10, No.9, Sep., 2005
[3]. 赵静谧,张 慧,郑国勤.基于粒子系统的喷泉模拟.计算机应用研究.2006年第一期

西北工业大学微软技术俱乐部
刘延通
tech-mstcnpu@163.com
[返回][关闭]