计算机三维建模

  • 格式:doc
  • 大小:81.50 KB
  • 文档页数:5

浅谈个人对粒子系统的认识
摘要:模拟自然界动态景物一直是计算机图形学领域的研究热点。

由于自然界动态景物拥有大量的细节信息和随机变化的形状,有着与规则几何物体明显的区别,因此使用传统的几何面片来模拟这些细节和随机变化的形状相对困难。

针对这种情况,1983年Reeves首次提出了粒子系统原型。

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

使用粒子系统能够相对充分地体现自然景观中模糊物体的随机性和动态性,从而得到良好的模拟效果。

关键字:粒子粒子系统模拟
一、粒子系统的基本概念
粒子系统表示三维计算机图形学中模拟一些特定的模糊现象的技术,而这些现象用其它传统的渲染技术难以实现真实感。

经常使用粒子系统模拟的现象有火、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者像发光轨迹这样的抽象视觉效果等等。

其基本思想是把不规则形状的物体看作是许多粒子所组成的,各个粒子都有自己的属性,粒子的这些属性随时间的推移而不断地改变,从而模拟出不规则物体及其运动变化的过程。

当然,这些粒子都有其各自的生命周期,它们都要经历“产生”、“运动和生长”及“消亡”这三个阶段。

也正因为粒子系统是一个有“生命”的系统,才能不像传统方法那样只能生成瞬时静态的景物画面,而是可以产生一系列运动进化的画面,这使得模拟动态的自然景物成为可能。

二、粒子系统的基本原理
粒子系统把要模拟的不规则物体定义为大量随机分布的微小粒子图元,在粒子系统中,粒子图元的形状可以是小球、立方体、正四面体或者其它形体。

每个粒子都有一组属性, 如初始运动方向、初始大小、初始颜色、初始透明度、初始形状以及生命期等,并在其运动和生长过程中随机地改变这些属性。

系统中可以不断有新粒子的加入,旧粒子的消亡。

利用粒子系统模拟物体的基本步骤:
1、分析物体的静态特性,定义粒子所具有的属性;
2、建立粒子属性变化规律;
3、将产生的新粒子加入系统中(初始化粒子);
4、赋予每一新粒子一定的属性(更新粒子),并将其生命周期递减一时间步;
5、删去那些已经超过生存期的粒子;
6、根据粒子的动态属性对粒子进行移动和变换;
7、绘制并显示由有生命的粒子组成的图像;
步骤3~7反复循环即形成物体的动态变化过程
三、粒子系统的生命周期
每一粒子的生命周期如图:
四、常见的粒子运动模型
粒子运动中粒子产生的时候都具有一定的初始属性,粒子作为质点,按照动力学的规律进行运动。

以下是几种常见的运动形式[1]:
(1)直线运动,粒子的位置和速度变化遵循下面的原则所示:
P=P0+∫Vdt, V=V0+∫adt
其中 P 为粒子位置,P0 为粒子初始位置,V 为粒子速度,V0 为初始速度,a 为粒子加速度。

(2)阻尼运动,在当前运动方向上的粒子根据阻尼的作用,其速度根据某种比例减少,一般取值如下所示:
V=V0(1-d×△t)
其中 d 为阻尼运动的阻尼因子,d=[0, 1]。

(3)螺旋运动,螺旋运动能按照给顶轴进行旋转,以产生粒子的翻滚等效果,使速度方向发生改变。

(4)反弹运动,反弹运动能改变粒子运动速度的大小与方向。

对于无能量损失的反弹运动,类似于光的反射,如下所示:
V0=V-2(V0·N)*N
其中 N 为反射面的方法向量。

五、粒子系统的构成
(1)发射器(枪)
发射器好比一把的枪,粒子往往是由这把枪产生并发射的,发射器将每个粒子的参数
初始化,并且提供所有粒子共同的属性参数(将粒子的共同属性保存在发射器而不是每个粒子里面会很大的节省内存空间)。

发射器的一个重要参数是每个粒子的初始位置,一般而言,可能用到的发射器有点发射器(每个粒子都是从同一点发射),比如爆炸的火花,喷泉等,如果粒子的产生有一定的范围,那就需要矩形发射器[2],定义一个确定的长宽,粒子在这个矩形范围内随机生成。

比如一片沼泽中的雾气,一片区域中的雨雪。

总体来说,发射器都具有一定的范围参数,他给粒子的初始位置提供了最初的参数,发射器还保存了其他很多类似的参数,比如粒子的速度范围,透明度范围,渲染方式,以及粒子类型。

(2)粒子类型(子弹)
每一个粒子都是枪里的子弹,用何种子弹,将影响你的杀伤力,有些子弹细小,发射缓慢,有些子弹能够迅速发射,而且威力巨大。

要制造一个基本粒子,你可以采用任何你想得到的可见元素,从一个点到一条线、一个面,甚至一个模型,都有可能成为一个基本粒子,但由于粒子系统的群体性特征,你必须选择最简练,占用系统资源最少的类型。

(3)粒子池(弹匣)
粒子池中存储了粒子系统可能用到的所有粒子,并且用栈、链表等数据结构快速产生、删除粒子,它好比一个弹匣,里面放了所有备用的子弹,他比弹匣更强的是,发射完的子弹他还能找回来,下次继续发射。

我们知道在粒子系统中会有很多粒子不断产生,消亡。

如果每次产生一个粒子,我们都要创建一块内存来存储这个粒子,每次粒子消亡我们都要删掉它,这种操作将产生大量的开销,影响粒子系统的整体运行速度。

利用一个静态的粒子数组可以很好的解决这个问题,在粒子系统刚开始产生时,我们就申请一大块内存区域,填充最大数量的粒子,我们称这个存储区域为粒子池。

池中的每个粒子都有自己的编号,并且一开始我们把这些粒子的编号压到一个空闲栈中。

在我们发射粒子时,我们从空闲栈中取出所需数量的粒子的编号,然后从静态数组中取得这个粒子。

粒子发射器赋予这些粒子新的参数,并且把他加入渲染链表中。

在粒子消亡以后,我们把死亡粒子的编号压回空闲栈,并且从渲染链表中删除他。

利用粒子池,我们无须频繁申请和释放内存,可以有效的模拟粒子的产生和消亡过程。

六、粒子系统的基本实现
/** 粒子结构**/
struct Particle
{
Vector3 position; /**粒子的位置**/
Vector3 velocity; /**粒子的速度**/
Vector3 acceleration; /**粒子的加速度**/
float lifetime; /**粒子生命值**/
float dec; /**粒子消失的速度**/
float size; /**粒子尺寸**/
float color[3]; /**粒子的颜色**/
};
/** 粒子类**/
class CParticle
{
public:
CParticle(); /**构造函数**/
virtual ~CParticle(); /**析构函数**/
/** 粒子的初始化**/
virtual bool Init(int _num);
/** 粒子的渲染**/
virtual void Render() = 0;
/** 粒子的更新**/
virtual void Update() = 0;
protected:
int m_iNum; /**粒子总数目**/ Particle* m_pList; /**粒子指针**/ };
#include"Particle.h"
/** 构造函数**/
CParticle::CParticle():m_iNum(0),m_pList(NULL)
{ }
/** 析构函数**/
CParticle::~CParticle()
{
if(m_pList != NULL)
{
delete []m_pList;
m_pList = NULL;
}
}
/** 粒子的初始化**/
bool CParticle::Init(int _num)
{
m_iNum = _num;
m_pList = new Particle[m_iNum];
if(m_pList == NULL)
return false;
return true;
}
/** 粒子的渲染**/
void CParticle::Render()
{ }
/** 粒子的更新**/
void CParticle::Update()
{ }
七、全文小结
全文介绍了粒子系统的基本概念、基本原理及生命周期,还有常见的粒子运动模型——直线运动、阻尼运动、螺旋运动及反弹运动几种形式。

以及对粒子系统构成的简单介绍和粒子系统在编程上的的基本实现。

【参考文献】
[1]方建文,于金辉,马文龙.基于硬件加速和粒子系统的实时喷泉模拟[J].计算机工程与应
用, 2006,4(14):117-120.
[2]李于剑.Visual C++实践与提高图形图像编程篇[M],西安:机械工业出版社,2006:2-30.
[3]Samuel R.Buss.3D计算机图形学(OpenGl版)[M],北京:清华大学出版社,2006.
[4]Dave Shreiner. OpenGl编程指南[M],西安:机械工业出版社,2008.
[5]Donald Hearn.计算机图形学(第三版)[M],北京:电子工业出版社,2005.。