在Ogre程序中,粒子系统可以利用代码实现,但也可以利用脚本语言。不过,一般情况下,都是利用脚本语言。
在Ogre中只要将记事本的后缀名定义为.particle,Ogre会自动识别其为粒子脚本。
现在有人制作了一个ParticleEditor――粒子脚本编辑器,可以在以下地方进行下载
(http://www.game-cat.com/ogre/pe/ParticleEditor_Beta.zip),
可以方便的在其界面中设置我们需要的粒子脚本,同时将其信息存取为记事本的形式。
粒子系统中的发射器有几个参数需要理解:
1. angle
粒子发射器发射出的粒子的最大偏移角
2. colour
设置所有发射出的粒子的固定颜色
3. colour_range_start & colour_range_end
粒子颜色将为这2中颜色值之间随意的产生
4. emission_rate
粒子发射器发射出的粒子数
5. velocity
每次发射粒子的恒定速度
6. time_to_live
每个粒子在销毁之前存活的时间。不过,它可以利用参数repeat_delay复活
7. duration
发射器发射的粒子处于激活状态的数量
8. repeat_delay
粒子销毁到激活需要等待的时间数
在程序中加载一个粒子系统的步骤也很简单,只需:
1. 创建一个粒子系统对象,如:
ParticleSystem*lightParticle= mSceneMgr->createParticleSystem("LightParticle", "myLight");
createParticleSystem函数中第一个变量为粒子系统的名称,有利于根据名称查找到该粒子系统;第二个变量为我们创建的粒子系统的脚本语言的名称。
2. 创建一个节点,用于绑定刚才创建好的粒子系统对象。
该节点可以根据自己的需要创建,也既是灵活的将粒子绑定在各个不同的节点上。如:
mSceneMgr->getRootSceneNode()->createChildSceneNode()->attachObject(lightParticle)
粒子系统的范围:
粒子系统的动态性质意味着它的包围盒需要频繁和规律的重复计算。
在Ogre默认的情况下每一帧都进行这种更新包围盒大小的操作,而且在同样的默认情况下,Ogre会在10秒钟后停止这种更新操作,从而固定包围盒的范围。
你可以通过ParticleSystem::setBoundsAutoUpdated()这个方法来手动控制这个时间。这个方法接受一个叫做stopin的参数,通过这个参数的值Ogre会在相应的秒数后面停止更新的操作。
如果你已经知道这个粒子系统的影响范围,你可以直接通过ParticleSystem::setBounds()方法来设置包围盒。很明显的,这种直接设置包围盒的办法一定比我们之前提到的那种让包围盒“自我生长” 的方法具有更高的效率。
============================================================================
粒子系统更新:
当更新粒子系统的时候,Ogre采用了一种软启发(Mild Heuristics)的方式执行。
在应用中,如果一个粒子退出了视截体的可视范围,却仍然不能停止运行,它将会一直更新直到再次出现在视野中。这样做是必要的,因为如果粒子系统在离开之后就停止了更新,这时候会让再次出现在视野中的粒子系统显得非常不协调。你可以想象一下,离开你视野的火苗,在一段时间之后重新看到却仍然没有任何蔓延开来的感觉。
不过,在3D应用程序中由于效率的原因,一旦一个粒子系统离开视野一段时间之后,就需要停止更新。这样就会产生上面一段所说的问题,即粒子系统被冻结。Ogre为此提供了一种“快进”的机制来允许粒子系统在时间轴上前进一个数量,进而使粒子系统能够正确的表现“当前”的状态。这种特性也可以同来让新建立的粒子系统能够表现一段时间后的样子。具体所调用的方法是ParticleSystem::fastForward()。