【Ogre引擎架构】 第十二讲 粒子系统-飘雪之国

来源:互联网 发布:咖啡游戏源码 编辑:程序博客网 时间:2024/04/30 03:15

    这个冬天有点冷,南国的上海已渐入深冬,也许是房子不向阳的缘故,感觉日子越发寒冷了,顺应季节的需要,博主临时决定实现一下飘雪效果。

    实现之后的效果:

     

    窗户结霜:

    

    画个笑脸:

    

   飘雪效果的实现是通过一个盒子发射器BoxEmitter和一个方向随机影响器DirectionRandomiserAffector完成的。

SceneNode* psNode = sm->GetRootSceneNode()->CreateChildSceneNode();ParticleSystem* ps(0);ps = static_cast<ParticleSystem*>(sm->CreateParticleSystem("snow",ParticleSystemFactory::FACTORY_TYPE_NAME,"Snow"));streakNode->AttachObject(ps);

   第一步:把相机放在世界原点,或者z轴正坐标的位置朝向-z方向。

   第二步:编写BoxEmitter类,通过将盒子置于摄像机视野的上方,达到雪花飘落。

class ParticleEmitter:public Tomo::StringInterface{public:virtual void InitParticle(Particle* pParticle);protected:virtual void InitParticlePos(Particle* pParticle);virtual void InitParticleDirection(Particle* pParticle);void AddBaseParameters();unsigned short GenConstantEmissionCount(float timeElapsed);float m_Angle;float m_EmissionRate;float m_MinTTL;float m_MaxTTL;Vector3 m_Direction;float m_MinVelocity;float m_MaxVelocity;Vector3 m_Position;ColorValue m_Color;float m_Duration;DynamicAttributeRandom* m_pDynAllParticleDimens;};
void ParticleEmitter::InitParticleDirection(Particle* pParticle){//设置粒子运动方向,direction的大小表示运动的速度大小pParticle->direction = m_Direction;}void ParticleEmitter::InitParticle(Particle* pParticle){//初始化位置InitParticlePos(pParticle);//初始化方向InitParticleDirection(pParticle);pParticle->timeToLive = m_MaxTTL;//初始化尺寸if(m_pDynAllParticleDimens){float dim = m_pDynAllParticleDimens->GetValue();pParticle->width = dim;pParticle->height = dim;}pParticle->color = m_Color;pParticle->origin_color = m_Color;//初始化速度if(m_MinVelocity > 0.f)pParticle->direction = pParticle->direction*(m_MinVelocity+(m_MaxVelocity-m_MinVelocity)*Math::UnitRandom());}
     接着是BoxEmitter
void BoxEmitter::InitParticlePos(Particle* pParticle){//只需按范围随机生成即可 这个范围是 XY面,z方向取一个很小的阈值,//粒子运动时保证没有z方向的速度分量Vector3 xOff,yOff,zOff;xOff = Math::SymmetricRandom()*m_XRange;yOff = Math::SymmetricRandom()*m_YRange;zOff = Math::SymmetricRandom()*m_ZRange;pParticle->position = m_Position+xOff+yOff+zOff;}


   第三步:编写发射出的粒子所受的影响器,让粒子在x方向做连续随机的移动即可

void DirectionRandomiserAffector::Affect(ParticleTechnique* technique,Particle* pParticle,float timeElapsed){//m_Randomness是随机飘动速度的阈值Vector2 xzOffset;xzOffset.x = m_Randomness*Math::SymmetricRandom()*timeElapsed;pParticle->direction.x += xzOffset.x;if(pParticle->direction.x > m_Randomness)pParticle->direction.x -= m_Randomness;else if(pParticle->direction.x < -m_Randomness)pParticle->direction.x += m_Randomness;}

    第四步:编写配置文件

system Snow{visual_particle_quota                   2000material                                Examples/FlarePointSpriterenderer                                billboard{billboard_type                      oriented_self}// 发射器emitter Box{emission_rate40position0 40 -5time_to_live50   direction0 -1 0velocity_range 1.5 4all_particle_dimensions             dyn_random{min                             0.5max                             1}}//影响器affector DirectionRandomiser{randomness3}}

    第五步:实现效果所需的图片

                       

      至于上面的第二张和第三张效果图里面有一个窗户结霜效果,可以通过动态纹理实现。

0 0
原创粉丝点击