1、简介
粒子系统被用来作为在3D程序中产生多种视觉特效的基础。粒子系统特效在游戏中运用广泛,比如射击类游戏中的爆炸特效,烟雾特效,开枪时喷出的火焰,撞击时击出的火花等等多半由粒子系统实现。
粒子系统的基本单元是粒子,每个粒子一般具有形状、大小、颜色、透明度、位置、速度、加速度、方向、生命周期等属性。每一帧,粒子系统一般都会执行如下步骤:
(a)产生新的粒子,并赋予相应的属性;
(b)删除超过生命周期的粒子;
(c)更新粒子的动态属性;
(d)渲染所有有效粒子。
2、粒子系统
OGRE粒子系统还是比较清晰易懂的,它由ParticleSystemManage(粒子系统管理器)、ParticleSystem(粒子系统)、ParticleSystemRenderer(粒子渲染器)、ParticleEmitter(粒子发射器)、ParticleAffector(粒子影响器)、Particle(粒子)等组成。
(1) ParticleSystemManager(粒子系统管理器)
此类类似于OGRE中的SceneManager,单件模式,内含粒子系统工厂集合,粒子发射器工厂集合,粒子影响器工厂集合,以及粒子渲染器工厂集合,用于创建和管理粒子系统、粒子发射器、粒子影响器、粒子渲染器。该类还负责加载和分析粒子系统脚本。
(2) ParticleSystem(粒子系统)
具体的粒子系统类,它需要包含具体的ParticleEmitter 集合、ParticleAffector集合、ParticleSystemRenderer,Particle集合,用于粒子的创建、更新、渲染。
(3) ParticleEmitter(粒子发射器)
用于创建粒子,赋予粒子初始属性赋值,最重要的方法是_initParticle(),该类为抽象类,OGRE中提供了如下派生类,自己也可以根据需要编写自己的Emitter:
AreaEmitter
BoxEmitter
CylinderEmitter
EllipsoidEmitter
HollowEllipsoidEmitter
PointEmitter
RingEmitter
(4) ParticleAffector(粒子影响器)
用于在粒子的生命周期内更新粒子的属性,最重要的方法是 _affectParticles(),OGRE中提供了如下派生类,自己也可以根据需要编写自己的Affector:
ColourFaderAffector
ColourImageAffector
ColourInterpolatorAffector
DeflectorPlaneAffector
DirectionRandomiserAffector
LinearForceAffector
RotationAffector
ScaleAffector
(6) ParticleSystemRenderer(粒子渲染器)
该类用于渲染粒子系统,该类为抽象类,ORGE提供了BillboardParticleRenderer具体类,自己也可以根据需要编写自己的粒子渲染类。
(7) Particle(粒子)
粒子系统的基本元素,粒子,存储了粒子的所有属性和状态。
3、OGRE粒子系统渲染流程
(1)初始化
ParticleSystemManager::addEmitterFactory()
ParticleSystemManager::addAffectorFactory()
ParticleSystemManager ::addRendererFactory()
ParticleSystemManager::createTemplate()
ParticleSystem::setRenderer()
ParticleSystemManager::_createRenderer()
ParticleSystem::addEmitter()
ParticleSystemManager::_createEmitter()
ParticleSystem::addAffector()
ParticleSystemManager::_createAffector()
(2) 每一帧,执行如下更新
ParticleSystem::_update()
ParticleSystem::_triggerAffectors()
Affector::_affectParticles()
ParticleSystem ::_triggerEmitters()
Emitter::_initParticle()
ParticleSystem::_updateRenderQueue()
ParticleRenderer::_updateRenderQueue()
4、粒子系统与3D场景
粒子系统被绑定到场景节点上,所以当节点进行移动、旋转以及缩放的空间变换的时候,同时会影响在上面挂接的发射粒子。进一步说,虽然粒子一旦被发射,就会被定位到世界空间中,不会再被节点所影响。但是随着场景节点的变换,粒子发射器却跟随着一同产生相应的变换,发射出来的粒子却被遗留在后面(这就好像,移动的燃烧物遗留下来的烟迹一般)。如果在你的应用中需要粒子发射器发射出来的粒子跟随节点一同变换,这就需要设置粒子使用本地坐标系统,这样就能得到粒子跟随发射源的效果。
5、粒子系统脚本
粒子系统是可以使用相应的脚本来定义的,相对于硬编码方式来实现,脚本可以让使用者更快的产生原型并且容易的更改。如同Ogre系统中任何其他可以通过脚本来定义的系统一样,你也可以完全通过代码来创建和配置粒子系统。在粒子系统中所使用的粒子脚本在实际的使用中其实是一个粒子模板,你可以通过它在程序中产生多个实例。换句话说,你如果想创建多个相同样是的粒子效果(比如多处着火),你不用定义多个粒子脚本,只要从一个脚本创建多个实例就好了。