11、osg中的粒子系统所用到的类以及相关函数

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

设置模拟水下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值