osgParticle.Emitter是OpenSceneGraph的一个粒子系统发射源类。该类允许用户创建一个发射源,用于向场景中发射一组粒子。
以下是使用osgParticle.Emitter创建发射源的基本步骤:
osg::ref_ptr<osgParticle::Emitter> emitter = new osgParticle::Emitter;
emitter->setParticleSystem(...); // 设置粒子系统
emitter->setReferenceFrame(...); // 设置参考坐标系
emitter->setPosition(...); // 设置位置
emitter->setVelocity(...); // 设置速度
... // 其他参数
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(emitter.get());
下面介绍osgParticle.Emitter的一些重要参数:
每个发射源都必须附着在一个粒子系统上,以便发射一组特定类型的粒子。粒子系统是一个osgParticle.ParticleSystem对象,包含了所有粒子的状态信息、渲染信息等。当创建一个粒子系统时,通常需要设置一些属性,例如粒子的贴图、渲染器、发射源等。
osg::ref_ptr<osgParticle::ParticleSystem> ps = new osgParticle::ParticleSystem;
ps->setDefaultAttributes("Images/smoke.rgb", false, false);
ps->setParticleAlignment(osgParticle::Particle::BILLBOARD_ALIGN);
ps->setParticleScaleRange(1.0f, 3.0f);
...
osg::ref_ptr<osgParticle::Emitter> emitter = new osgParticle::Emitter;
emitter->setParticleSystem(ps.get());
发射源可以位于场景图的任何位置,并且可以根据需要进行平移、旋转等变换操作。因此,必须确定发射源的参考坐标系,以便计算粒子的初始位置和速度等属性。osgParticle.Emitter支持三种参考坐标系:
emitter->setReferenceFrame(osgParticle::Emitter::RELATIVE_RF);
发射源的位置和速度都是在参考坐标系中指定的。位置表示发射源的起始位置,即从哪个点开始发射粒子。速度表示粒子的初始速度,可以是一个固定值,也可以是一个随机范围内的值。
emitter->setPosition(osg::Vec3(0.0f, 0.0f, 0.0f)); // 设置位置
emitter->setVelocity(osg::Vec3(10.0f, 0.0f, 0.0f)); // 设置速度
发射源可以设置角度和速度范围,以控制粒子的发射方向和速度分布。角度范围表示粒子发射的方向随机分布在一个范围内,一般使用弧度制表示。速度范围表示粒子的初始速度随机分布在一个范围内。
emitter->setThetaRange(osg::DegreesToRadians(45.0f), osg::DegreesToRadians(135.0f)); // 设置角度范围
emitter->setPhiRange(osg::DegreesToRadians(0.0f), osg::DegreesToRadians(360.0f));
emitter->setInitialSpeedRange(10.0f, 20.0f); // 设置速度范围
发射速率指的是粒子的发射密度,即每秒钟发射多少个粒子。生命周期指的是粒子的存活时间,即粒子从发射到消失所需的时间。这两个参数都可以是一个固定值,也可以是一个随机范围内的值。
emitter->setEmissionRate(100.0f); // 设置发射速率
emitter->setLifeTime(5.0f); // 设置生命周期
emitter->setParticleLifespan(0.5f, 1.0f); // 设置粒子的生命周期范围
除了上述常用参数外,osgParticle.Emitter还包含了一些其他参数,例如随机化因子、颜色变化、自旋等。
emitter->setRandomness(0.2f); // 设置随机化因子
emitter->setColorRange(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f), osg::Vec4(0.0f, 0.0f, 0.0f, 1.0f)); // 设置颜色范围
emitter->setAngularVelocity(osg::Vec3(0.0f, 0.0f, 10.0f)); // 设置自旋速度