1,粒子系统介绍                          

    每个引擎都会有自己的粒子系统,粒子系统特效在游戏中运用广泛,比如射击类游戏中的爆炸特效,烟雾特效,开枪时喷出的火焰,撞击时击出的火花等等多半由粒子系统实现。粒子系统的基本单元是粒子,每个粒子一般具有形状、大小、颜色、透明度、位置、速度、加速度、方向、生命周期等属性。每一帧,粒子系统一般都会执行如下步骤:
    1) 产生新的粒子,并赋予相应的属性;
    2) 删除超过生命周期的粒子;
    3) 更新粒子的动态属性;
    4) 渲染所有有效粒子。

 

2, OGRE 粒子系统。   

     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()

 

 

 

 

 

   

 

 

 

 

 

 

 

posted on 2012-06-07 18:04  Just a Programer  阅读(3352)  评论(0编辑  收藏  举报