粒子系统在三维显示中占有很重要的位置,如3D中的雨,雪,喷泉,爆炸等效果都是粒子完成的。
基本概念:
粒子是用四边形来表示的,它有长宽,和其方向,有数量和材质,还有重量。这些属性封在粒子属性变换器(Affector)中,Affector中包含颜色衰退变换器(colourFadeAffector)和线形影响变换器(LinearForceAffector)和点状粒子发生器(PointEmmiter),由这些组成粒子脚本文件,以.Particle为其扩展名。点状粒子发生器随机地从单一的点发射粒子;盒状粒子发生器随机的从一个区域发射粒子。通过创建Plugins你可以向ogre里增加一个新的发谁。当前ogre只支持点状粒子发生器和盒状粒子发射器。当粒子发生器不停的喷发大量粒子时,就可以形成烟、火和爆炸等效果,结构图如下:
粒子系统脚本:
OGRE提供了粒子系统脚本语言,刻一张哎脚本中设置粒子的各种属性,而不用重新编译程序。这样给使用者带来了方便。需要注意的粒子系统脚本文件有自己的语法,类似c++,注释用“//”,用“{}”来区分界限,但不支持在代码后跟注释。
粒子系统给在脚本中式用模板的形式定义的,你可以在程序运行时期创建多个实例。
如何载入粒子脚本:
粒子系统脚本是在系统初始化的时候载入的,缺省情况下在系统在公共资源路径(Root::addResourceLocation函数指定)下查找所有扩展名为“.particle”的文件并解析它们,如果想要指定其他扩展名可以使用particleSystemManager::getsingleton().ParseAllSource方法,如果想要解析单个的粒子系统脚本文件可使用ParticleSystemManager::getsingleton().parseScript方法。
一旦粒子系统脚本被载入,你可以使用ParticleSystemManager::getSingleton().createSystem()方法来才创建一个实例化的粒子系统,该方法接受两个参数,一个该粒子系统的名称,而另一个参数是要参照的模板名称(也就是脚本中定义过的模板名称)
格式:
可以在一个脚本文件中定义多个粒子系统模板。
以下面的例子做说明(参考Ogre使用指南|Mage小组编写),下面是一个比较典型的粒子脚本,被用在了demo中:
particle_system Examples/GreenyNimbus
//粒子系统的模板名
{
material Examples/FlarePointSprite
//粒子的Material
particle_width 35
//粒子的宽度
particle_height 35
//粒子的高度
cull_each false
//粒子的裁剪模式:整体包围盒湖综合各单个粒子裁剪
quota 5000
//粒子的数目
billboard_type point
//公告板类型:point指代表粒子的四边形总是面向摄像机
// Area emitter 发射器区域
emitter Box
//盒状粒子发射器
{
angle 30
//粒子发射的时候偏离direction的最大角度
emission_rate 30
//发射速率(个/秒)
time_to_live 1
//粒子生存时间(秒)
direction 0 1 0
//粒子发射的方向
velocity 0
//速率
colour_range_start 1 1 0
//颜色起始值
colour_range_end 0.3 1 0.3
//颜色结束值(在起始值和结束值之间取随机数)
//粒子发射器BOX的大小(宽度、高度、深度定义)
width 60
height 60
depth 60
}
// Make em float upwards
//对运动中的粒子加上的一个外力,影响其运动轨迹
affector LinearForce
{
force_vector 0 100 0
//指定外力的影响(用向量表示)
force_application add
//指定将粒子的运动向量加上外力的向量 效果:匀加速运动
}
// Fader
//影响粒子中的颜色
affector ColourFader
{ //每秒衰减0.25
red -0.25
green -0.25
blue -0.25
}
}
脚本中的每一个粒子系统模板都必须有一个名字,且必须是在”{“前的一行。这个名称必须是唯一的。名字中可以包含“/”来构成路径,但是OGRE引擎只是把它当做字符串来看待,并不真正来分析这个路径,它仅仅方便程序员来区分层次。
一个例子系统可以设置一些上层属性。如:quota表示允许的最大粒子个数。除了最基本的属性之外,还必须在一个粒子系统模板内嵌套定义发射器emitters和属性变换器affectors。它们内部的属性与它们的类型有关。