查看: 2534|回复: 6

如何控制粒子系统的发射速度和方向???

[复制链接]

该用户从未签到

发表于 2009-7-14 11:07:13 | 显示全部楼层 |阅读模式
我做一个飞行器的动态尾迹,由于飞行器飞行方向不固定,所以需要不断变化粒子系统的方向和发射速度,我参照osgparticleeffects实例作,但是结果如下,不知道大家怎么做的,是用osgParticle::RadialShooter()控制么??
1.jpg

该用户从未签到

发表于 2009-7-14 12:51:17 | 显示全部楼层
设置Placer

该用户从未签到

 楼主| 发表于 2009-7-14 13:23:18 | 显示全部楼层
有例子可以借鉴么,或者介绍下怎么做,感觉Placer只是设置粒子产生时为置,如何实时设置方向?????

该用户从未签到

发表于 2009-7-14 15:00:47 | 显示全部楼层
感觉是不是速度设的太大了
假设粒子的速度是0,那么粒子的轨迹是不是就等于飞机的轨迹了呢
只是猜测,不妨把速度设小点试试

该用户从未签到

 楼主| 发表于 2009-7-14 15:12:51 | 显示全部楼层
下面是我的代码,不知道如何设置????一直都对osg粒子系统比较模糊,希望能解决

osg::Group* pGroup = new osg::Group;
//创建粒子系统模板
osgParticle:article ptemplate;
//设置生命周期
ptemplate.setLifeTime(1);
//设置粒子大小变化范围
ptemplate.setSizeRange(osgParticle::rangef(0.01f, 0.03f));
//设置例子Alpha变化范围
ptemplate.setAlphaRange(osgParticle::rangef(0.0f, 1.0f));
//设置粒子颜色变化范围
ptemplate.setColorRange(osgParticle::rangev4(
                                        osg::Vec4(1.0f, 0.5f, 0.3f, 1.0f),
                                        osg::Vec4(0.0f, 0.7f, 1.0f, 0.0f)));
//设置半径
ptemplate.setRadius(0.1f);   
//设置重量
ptemplate.setMass(0.01f);  
ptemplate.setShape(osgParticle::Particle:UAD);
//创建粒子系统
osgParticle::ParticleSystem *ps = new osgParticle::ParticleSystem();
//设置材质,是否放射例子,是否添加光照
ps->setDefaultAttributes("Images/smoke.rgb", false, false);
//加入模板
ps->setDefaultParticleTemplate(ptemplate);
//创建粒子放射器(包括计数器,放置器,发射器)
osgParticle::ModularEmitter *emitter = new osgParticle::ModularEmitter();
//关联粒子系统
emitter->setParticleSystem(ps);
emitter->setEndless(true);
//创建发射器计数器,调整每一帧增加的粒子的数目
m_pCounter = new osgParticle::RandomRateCounter();   
//设置每秒添加的粒子的个数
m_pCounter->setRateRange(100.0f, 100.0f);
//关联计数器
emitter->setCounter(m_pCounter.get());       
//设置一个点放置器
m_pPlacer = new osgParticle::PointPlacer();
//设置位置
m_pPlacer->setCenter(osg::Vec3(0.0f,0.0f,0.0f));
//关联点放置器
emitter->setPlacer(m_pPlacer.get());
//创建弧度发射器
m_pShooter = new osgParticle::RadialShooter();
//设置发射器速度变化范围
m_pShooter->setInitialSpeedRange(0.0001, 0.0001);
//m_pShooter->setThetaRange(osg::inDegrees(-90.f),osg::inDegrees(-90.f));
//m_pShooter->setPhiRange(osg::inDegrees(0.f),osg::inDegrees(360.f));
//关联发射器
emitter->setShooter(m_pShooter.get());
//加入到场景中
pGroup->addChild(emitter);
//创建标准编程器对象,控制粒子在生命周期中的更新
osgParticle::ModularProgram *program = new osgParticle::ModularProgram();
//关联粒子系统
program->setParticleSystem(ps);
//添加到场景
pGroup->addChild(program);
//添加更新器,实现每帧粒子的管理
osgParticle::ParticleSystemUpdater* psu = new osgParticle::ParticleSystemUpdater();
//关联粒子系统
psu->addParticleSystem(ps);
//加入场景
osg::Geode *geode = new osg::Geode;
geode->addDrawable(ps);
pGroup->addChild(psu);

该用户从未签到

发表于 2009-7-23 22:02:44 | 显示全部楼层
直接将粒子节点放在变换节点下了就可以阿,飞机机头朝向的反方向!

该用户从未签到

发表于 2009-7-24 00:50:26 | 显示全部楼层
那个NAVY的教程上有个例子
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表