在OSG中提供有专门的粒子系统工具,名字空间为osgParticle,OSG对经常使用的粒子模拟都做了专门的类,如:ExplosionEffect用于暴炸的模拟,FireEffect用于火的模拟,ExplosionDebrisEffect用于爆炸后四散的颗粒模拟,等等。这些类基本上使用起来极其方便,稍后我们来介绍这几个类。在OSG中有下面这几个类组成OSG粒子系统的中坚部分:
osgParticle::Particle : 粒子模版,块定粒子的大小,颜色,生命周期,等等。
osgParticle::ParticleSystem : 粒子系统的总体属性,粒子总数,纹理等等
osgParticle::Counter : 粒子产生的数目范围
osgParticle::Placer : 粒子出生点的形状态,如环形,圆形,点形
osgParticle::Shooter : 粒子发射器,决定粒子的初速
osgParticle::Emitter : 上述模版以及操作都为这个类服务,类名:发射器
osgParticle::Program : 可接受对粒子的操作,如轨迹的定义,矩阵的变换等等
osgParticle::Operator : 粒子操作或用户自定义粒子操作
osgParticle::ParticleEffect : 可单独使用的粒子渲染,模仿烟雾,爆炸等等。
osgParticle::osgPrecipitationEffect : 这可能是个新类,可以使用雾效(其实不属于粒子系统),雪效等
上面的基类中下面各有很多的派生类,这些派生类大多数的使用方法大同小异,比BoxPlacer(出生点为盒状态)与SectorPlacer(出生点可定义为圆形,环形),同为Placer,使用方法基本雷同。
在OSG中使用粒子系统一般要经历以下几个步骤:
在OSG中使用粒子系统一般要经历以下几个步骤: 第一步:确定意图(包括粒子的运动方式等等诸多方面)。第二步:建立粒子模版,按所需要的类型确定粒子的角度(该角度一经确定,由于粒子默认使用有Billboard所以站在任何角度看都是一样的),形状(圆形,多边形等等),生命周期等。第三步:建立粒子系统,设置总的属性,第四步:设置发射器(发射器形状,发射粒子的数目变化等),第五步:设置操作(旋转度,风力等等因素)。第六步:加入结点,更新。
首先来看一下类ParticleSystem与类Particle,来看一下类常用的操作
一、类osgParticle::Particle
1、Shape getShape () const
得到粒子的形状,Shape有以下枚举值 (这些值大家应该都非常熟悉):POINT, QUAD, QUAD_TRIANGLESTRIP, HEXAGON, LINE
2、void setShape (Shape s)
设置粒子的形状,值得注意的是如果定义 与点线有关的,最好设置一下点大与线宽,这两个(point/linewidth)属于osg::StateAttribute,这就使使用起来非常方便。
3、bool isAlive () const
查看粒子系统的生命周期是否结束
4、double getLifeTime () const
得到粒子系统的生存周期,单位是秒
5、double getAge () const
得到粒子的年龄,已运行了多长时间,单位是秒
6、const rangef & getSizeRange () const
得到形状态的变化范围,rangef是个包含两个值的小类,因为点与线是通过osg::StateAttribute设置的,所以这个操作以及设置范围的操作只对多边形有效
7、const rangef & getSizeRange () const
得到透明度的变化范围
8、const rangef & getAlphaRange () const
得到颜色的变化范围
二、类osgParticle::Particle
1、const rangev4 & getColorRange () const
得到颜色的变化范围
2、float getRadius () const
得到半径,单位为米
3、float getMass () const
得到粒子重量,单位是KG
4、float getMassInv () const
得到重量的倒数
5、const osg::Vec3 & getPosition () const
得到位置向量
6、const osg::Vec3 & getVelocity () const
得到速度
7、const osg::Vec3 & getPreviousPosition () const
得到上帧更新时的位置
8、const osg::Vec3 & getAngle () const
得到角度向量
9、const osg::Vec3 & getAngularVelocity () const
得到角速度
10、const osg::Vec3 & getPreviousAngle () const
得到上一帧渲染时的角速度
11、const osg::Vec4 & getCurrentColor () const
得到当前的颜色值
12、void kill ()
摧毁粒子模版
13、void setLifeTime (double t)
设置生命周期,量纲应该是秒,如果设置成<=0,则粒子永不消失
14、void setSizeRange (const rangef &r)
设置尺寸变化范围,当然还是只对多边形形状态是有效的
15、void setAlphaRange (const rangef &r)
设置在生命周期中透明度的变化范围
16、void setColorRange (const rangev4 &r)
设置在生命周期中颜色的变化范围
17、void setRadius (float r)
设置半径
18、void setMass (float m)
设置重量
19、void setPosition (const osg::Vec3 &p)
获得位置
20、void setVelocity (const osg::Vec3 &v)
获得速度
21、void addVelocity (const osg::Vec3 &dv)
加上当前速度
三、osgParticle::Particle类
1、void transformPositionVelocity (const osg::Matrix &xform)
改变速度向量值
2、void transformPositionVelocity (const osg::Matrix &xform1, const osg::Matrix &xform2, float r)
改变速度向量值
3、void setAngle (const osg::Vec3 &a)
设置角度
4、void setAngularVelocity (const osg::Vec3 &v)
设置角速度
5、void addAngularVelocity (const osg::Vec3 &dv)
增加角速度到当前
6、void transformAngleVelocity (const osg::Matrix &xform)
改变角速度向量
7、bool update (double dt)
更新渲染
8、void beginRender () const
开始渲染
9、void render (const osg::Vec3 &xpos, const osg::Vec3 &px, const osg::Vec3 &py, float scale=1.0f) const
渲染,粒子系统会自动调用
10、void endRender () const
结束渲染
11、float getCurrentSize () const
得到当前尺寸
12、void setPreviousParticle (int previous)
设置当前粒子
13、int getPreviousParticle () const
得到上一帧渲染粒子
14、void setNextParticle (int next)
设置下一帧渲染粒子
15、int getNextParticle () const
得到下一帧渲染粒子
四、ParticleSystem类
1、Alignment getParticleAlignment () const
void setParticleAlignment (Alignment a)
得到/设置粒子排列方式,是Billboard还是Fixed,一般使用Billboard,但是Billboard在旋转过程中如果粒子叶片过大,可能被某些物体档住,从而失真
2、const osg::BoundingBox & getDefaultBoundingBox () const
得到BoundingBox
3、void setDefaultBoundingBox (const osg::BoundingBox &bbox)
设置BoundingBox,可能会导致缩放
4、bool getDoublePassRendering () const
得到是否启用DoublePass渲染
5、void setDoublePassRendering (bool v)
启用DoublePass渲染
6、bool isFrozen () const
当前是否在冻结中,如果被冻结,将会暂停渲染直至开启
7、void setFrozen (bool v)
设置是否冻结
8、int numParticles () const
得到总粒子数
9、int numDeadParticles () const
得到死亡粒子数
10、bool areAllParticlesDead () const
判断是否所有粒子都已死亡
11、Particle * getParticle (int i)
const Particle * getParticle (int i) const
得到指向第I个粒子的指针
12、virtual Particle * createParticle (const Particle *ptemplate)
从已有模版中创建新模版
13、virtual void destroyParticle (int i)
杀死第I个粒子
14、virtual void reuseParticle (int i)
重新激活第I个粒子
15、Particle & getDefaultParticleTemplate ()
const Particle & getDefaultParticleTemplate () const
16、void setDefaultParticleTemplate (const Particle &p)
设置默认粒子模版
17、bool getFreezeOnCull () const
得到是否冻结被裁切剔除的粒子(可能不需要显示)
18、void setFreezeOnCull (bool v)
设置是否冻结被裁切剔除的粒子(可能不需要显示)
19、void setDefaultAttributes (const std::string &texturefile="", bool emissive_particles=true, bool lighting=false, int texture_unit=0)
设置默认属性,纹理名
20、virtual osg::BoundingBox computeBound () const
计算BoundingBox
五、Counter类
1、virtual int numParticlesToCreate (double dt) const =0
创建粒子的数目,纯虚函数,必须在派生类中实现
2、类ConstantRateCounter
此类用于创建连续发射的粒子,创建在单位时间内发射的粒子
3、void setMinimumNumberOfParticlesToCreate (int minNumToCreate)
设置创建的最小粒子数目/每秒(但不是每秒创建的粒子数目)
4、int getMinimumNumberOfParticlesToCreate () const
得到创建的最小粒子数目/每秒
5、void setNumberOfParticlesPerSecondToCreate (double numPerSecond)
设置每秒创建的粒子数(但并不是场景中现有的粒子数)
6、double getNumberOfParticlesPerSecondToCreate () const
得到每秒钟创建的粒子数
7、virtual int numParticlesToCreate (double dt) const
在当前帧中创建的粒子数
8、类VariableRateCounter
此类用于创建当前场景内共有的粒子,创建场景中共有多少粒子,注意与ConstantRateCounter的区别
9、const rangef & getRateRange () const
得到场景中粒子数的最小与最大值
10、void setRateRange (const rangef &r)
设置场景中粒子数的最小与最大值
11、void setRateRange (float minrange, float maxrange)
设置场景中粒子的最小与最大值
12、类RandomRateCounter
此类从VariableRateCounter派生而来
13、Int numParticlesToCreate (double dt) const
当前帧创建的粒子总数
六、类RadialShooter
1、const rangef & getThetaRange () const
得到Theta,此角度一般认为是速度方向(量)与Z轴的夹角
2、void setThetaRange (const rangef &r)
设置Theta范围,此角度一般认为是速度方向(量)与Z轴的夹角
3、void setThetaRange (float r1, float r2)
设置Theta 范围
4、const rangef & getPhiRange () const
得到Phi范围,此角度一般认为是速度在X-Y平面上的投影与X轴的夹角
5、void setPhiRange (const rangef &r)
设置Phi范围,此角度一般认为是速度在X-Y平面上的投影与X轴的夹角
6、void setPhiRange (float r1, float r2)
设置Phi范围,此角度一般认为是速度在X-Y平面上的投影与X轴的夹角
7、const rangef & getInitialSpeedRange () const
得到初始速度范围
8、void setInitialSpeedRange (const rangef &r)
设置初始速度范围
9、void setInitialSpeedRange (float r1, float r2)
设置初始速度范围
10、const rangev3 & getInitialRotationalSpeedRange () const
void setInitialRotationalSpeedRange (const rangev3 &r)
void setInitialRotationalSpeedRange (const osg::Vec3 &r1, const osg::Vec3 &r2)
得到/设置最初速度旋转的范围
11、void shoot (Particle *P) const
设置需要发身的粒子模版,一般需要系统自动调用
七、虚基类Placer,这个类负责创建发射源的形状,可以是点形,圆形,环形,等:
1、virtual void place (Particle *P) const =0
取得&放置粒子模版
2、virtual osg::Vec3 getControlPosition () const =0
得到粒子源位置
八、SegmentPlacer类,这个类创建线段型的发射源
1、const osg::Vec3 & getVertexA () const
得到线段起点 ,用线段的起点与终点来确定发射源的线段
2、void setVertexA (const osg::Vec3 &v)
void setVertexA (float x, float y, float z)
设置线段的起点
3、const osg::Vec3 & getVertexB () const
得到线段的终点
4、void setVertexB (const osg::Vec3 &v)
void setVertexB (float x, float y, float z)
void setSegment (const osg::Vec3 &A, const osg::Vec3 &B)
设置线段的终点
5、void place (Particle *P) const
设置粒子模版,一般OSG调用
6、osg::Vec3 getControlPosition () const
得到控制点,为线段的中点
八、MultiSegmentPlacer类
1、int numVertices () const
设置线段的总顶点数
2、const osg::Vec3 & getVertex (int i) const
得到第i个顶点
3、void setVertex (int i, const osg::Vec3 &v)
void setVertex (int i, float x, float y, float z)
设置第i个顶点
4、void addVertex (const osg::Vec3 &v)
void addVertex (float x, float y, float z)
增加一个顶点,在末尾
5、void removeVertex (int i)
删除第i个顶点
6、void place (Particle *P) const
设置粒子模版,OSG自己调用
7、osg::Vec3 getControlPosition () const
得到控制点,是顶点序列的第一个点
九、CenteredPlacer是设置圆环形发射源,为虚基类
1、const osg::Vec3 & getCenter () const
得到圆心
2、void setCenter (const osg::Vec3 &v)
void setCenter (float x, float y, float z)
十、BoxPlacer类是设置盒型发射源从CenterPlacer派生而来
1、const rangef & getXRange () const
得到X坐标范围
2、void setXRange (const rangef &r)
void setXRange (float r1, float r2)
设置X坐标范围
3、const rangef & getYRange () const
得到Y坐标范围
4、void setYRange (const rangef &r)
void setYRange (float r1, float r2)
设置Y坐标范围
5、const rangef & getZRange () const
得到Z坐标范围
6、void setZRange (const rangef &r)
void setZRange (float r1, float r2)
设置Z坐标范围
7、void place (Particle *P) const
设置粒子模版,OSG自己调用
8、osg::Vec3 getControlPosition () const
得到控制点,认为是中心原点
十、PointPlacer类是设置点形发射源从CenterPlacer派生而来
1、void place (Particle *P) const
设置粒子模版,OSG自己调用
2、osg::Vec3 getControlPosition () const
得到控制点,是Center
十一、SectorPlacer类是设置环形发射源从CenterPlacer派生而来
1、const rangef & getRadiusRange () const
得到环形半径的范围
2、void setRadiusRange (const rangef &r)
void setRadiusRange (float r1, float r2)
设置环形半径的范围
3、const rangef & getPhiRange () const
得到phi范围,在这里代表圆心角
4、void setPhiRange (const rangef &r)
void setPhiRange (float r1, float r2)
设置phi范围,在这里代表圆心角
5、void place (Particle *P) const
设置粒子源,OSG自己调用
6、osg::Vec3 getControlPosition () const
得到控制点,圆心
十二、osgParticle::ParticleEffect类,从它派生出的四个类操作基本相同 类ParticleEffect
1、void setTextureFileName (const std::string &filename)
const std::string & getTextureFileName () const
设置/得到纹理图片名
2、void setDefaultParticleTemplate (const Particle &p)
const Particle & getDefaultParticleTemplate () const
设置/得到默认粒子模版
3、void setPosition (const osg::Vec3 &position)
const osg::Vec3 & getPosition () const
设置/得到具体位置
4、void setScale (float scale)
float getScale () const
设置/得到缩放率
5、void setIntensity (float intensity)
float getIntensity () const
设置/得到剧烈程度
6、void setStartTime (double startTime)
double getStartTime () const
设置/得到开始时间
7、void setEmitterDuration (double duration)
double getEmitterDuration () const
void setParticleDuration (double duration)
double getParticleDuration () const
设置/得到发射器的持续/间隔时间
8、void setWind (const osg::Vec3 &wind)
const osg::Vec3 & getWind () const
设置/得到风速影响
9、bool areAllParticlesDead () const
判断是否所有粒子都已死亡,场景中看不见粒子并不代表已经死亡
十二、FluidProgram是最常见的是气流
1、void setFluidViscosity (float v)
设置粘性指数
2、float getFluidViscosity () const
得到粘性指数
3、void setFluidDensity (float d)
设置密度
4、float getFluidDensity () const
得到密度
5、void setWind (const osg::Vec3 &wind)
设置风速
6、const osg::Vec3 & getWind () const
得到风速
7、void setAcceleration (const osg::Vec3 &v)
设置加速度
8、const osg::Vec3 & getAcceleration () const
得到加速度
9、void setToGravity (float scale=1.0f)
设置向下引力
10、void setFluidToAir ()
设置模拟空气
11、void setFluidToWater ()
设置模拟水下