OSG粒子系统应用:喷泉效果
2015-07-25 13:41
477 查看
粒子系统主要分为两大类:
- 一是Effective中已有的效果,如雨雪的效果应用;
- 二类是一步步从模版,发射器等创建。
关于第一种的使用可以参见上一篇博客OSG粒子系统应用:雨雪效果。本篇博客来使用第二种方式创建一个喷泉的效果。
废话补多说,直接上代码:
创建粒子的时候传入一个osg::Group*参数,创建成功后,返回一个osg::Node*值,这个Node还可以成为传入参数的子节点。
PS:此篇博客代码以及前几篇的均已放在github,欢迎获取,欢迎交流!
- 一是Effective中已有的效果,如雨雪的效果应用;
- 二类是一步步从模版,发射器等创建。
关于第一种的使用可以参见上一篇博客OSG粒子系统应用:雨雪效果。本篇博客来使用第二种方式创建一个喷泉的效果。
废话补多说,直接上代码:
osg::ref_ptr<osg::Node> Fountain::createFountain(osg::Group* parent) { // 设置粒子模板的参数,包括生命周期、颜色、透明度、半径、重量等 osgParticle::Particle pParticle; pParticle.setLifeTime(3); pParticle.setColorRange(osgParticle::rangev4( osg::Vec4(0.7, 1.0, 1.0, 1.0), osg::Vec4(0.8, 1.0, 1.0, 0.0))); pParticle.setSizeRange(osgParticle::rangef(0.1f, 0.1f)); pParticle.setAlphaRange(osgParticle::rangef(1.0f, 0.5f)); pParticle.setRadius(m_dParticlesSize); pParticle.setMass(0.05); osg::ref_ptr<osgParticle::ParticleSystem> pParticleSys = new osgParticle::ParticleSystem; pParticleSys->setDefaultAttributes("Image/smoke.rgb", false, false); pParticleSys->setDefaultParticleTemplate(pParticle); // 发射器 osg::ref_ptr<osgParticle::ModularEmitter> pEmitter = new osgParticle::ModularEmitter; pEmitter->setParticleSystem(pParticleSys); osg::ref_ptr<osgParticle::RandomRateCounter> pRandomCounter = new osgParticle::RandomRateCounter; pRandomCounter->setRateRange(osgParticle::rangef(m_dParticlesNum, m_dParticlesNum)); pEmitter->setCounter(pRandomCounter); // 粒子发射枪 osg::ref_ptr<osgParticle::RadialShooter> pShooter = new osgParticle::RadialShooter; pShooter->setInitialSpeedRange(m_dParticlesSpeed, 0); pEmitter->setShooter(pShooter); // 速度细节控制 osg::ref_ptr<osgParticle::ModularProgram> pProgram = new osgParticle::ModularProgram; pProgram->setParticleSystem(pParticleSys); osg::ref_ptr<osgParticle::AccelOperator> pAccelOperator = new osgParticle::AccelOperator; pAccelOperator->setToGravity(); pProgram->addOperator(pAccelOperator); osg::ref_ptr<osgParticle::FluidFrictionOperator> pOperator = new osgParticle::FluidFrictionOperator; pOperator->setFluidToAir(); pProgram->addOperator(pOperator); osg::ref_ptr<osg::Geode> pGeode = new osg::Geode; pGeode->addDrawable(pParticleSys); parent->addChild(pEmitter); parent->addChild(pProgram); parent->addChild(pGeode); osg::ref_ptr<osgParticle::ParticleSystemUpdater> pParticleSysUpdate = new osgParticle::ParticleSystemUpdater; pParticleSysUpdate->addParticleSystem(pParticleSys); return pParticleSysUpdate; }
创建粒子的时候传入一个osg::Group*参数,创建成功后,返回一个osg::Node*值,这个Node还可以成为传入参数的子节点。
PS:此篇博客代码以及前几篇的均已放在github,欢迎获取,欢迎交流!
相关文章推荐
- UVa 11584 - Partitioning by Palindromes(DP)
- swift语言中一些常用的运算符
- OC学习笔记——类别(Category)
- HTML之框架(frameest、ifram)
- hdu1213 How Many Tables(并查集)
- SpringMVC简单项目配置
- 机房收费系统之组合查询
- 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用
- Select count(*)和Count(1)的区别和执行方式
- apk打包过程
- Shell中反引号(`)与$()用法的区别
- swift基础语法
- CentOS 忘记 root password处理
- PHP判断用户登录状态
- POJ 1164:The Castle
- C# using 三种使用方式
- 包管理器控制台常用命令
- POJ 1164:The Castle
- 样本方差为何除以n-1
- Select count(*)和Count(1)的区别和执行方式