【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
- 【Ogre引擎架构】 第十二讲 粒子系统-飘雪之国
- 【Ogre引擎架构】 第七讲 粒子系统-爆破特效
- 【Ogre引擎架构-第七讲】 爆破特效Explosion-粒子系统初体验 脚本
- Ogre引擎粒子系统
- OGRE渲染引擎粒子系统小节
- OGRE渲染引擎粒子系统小节
- 【Ogre引擎架构】 第十一讲 渲染系统封装OpenGL 2.x (一)
- 【Ogre引擎架构】 第十讲 唯美场景-天空盒SkyBox
- Ogre粒子系统编辑器
- OGRE粒子系统参数
- Ogre粒子系统简介
- libgdx游戏引擎(三)之粒子系统
- Ogre 粒子系统及粒子脚本
- Ogre 粒子系统及粒子脚本
- Ogre 粒子系统及粒子脚本
- Ogre 粒子系统及粒子脚本
- Ogre粒子系统 以及 粒子脚本
- Ogre 粒子系统及粒子脚本
- CentOS yum 源的配置与使用
- android开机向导实现
- hihocoder #1185 : 连通性·三
- ios推送证书制作
- 冒泡排序bubbleSort
- 【Ogre引擎架构】 第十二讲 粒子系统-飘雪之国
- Excel事件触发VBA配置 - 名称管理器下拉菜单选项事件
- 旋转VR相机不头晕:一个反直觉的发现
- java.util.regex
- iOS-App提交App Store上线被拒原因--审核指南中文版
- 前端知识
- android Ubuntu adb: cannot execute binary file: 可执行文件格式错误
- 2016-1-20(document.createEvent事件模拟)
- Android Material Design之Toolbar与Palette实践