查看: 906|回复: 6

粒子系统中,线发射源如何更改喷射方向。

[复制链接]

该用户从未签到

发表于 2014-5-7 10:36:24 | 显示全部楼层 |阅读模式
粒子总是向上喷出,想水平喷出呢。。。。。

该用户从未签到

发表于 2014-5-13 15:02:20 | 显示全部楼层
可利用void setPhiRange();void setPhiRange();这两个语句进行设置。

该用户从未签到

 楼主| 发表于 2014-5-13 19:59:15 | 显示全部楼层
StarShine 发表于 2014-5-13 15:02
可利用void setPhiRange();void setPhiRange();这两个语句进行设置。

为什么我改这个的时候,方向没改变。一直是垂直向上的。

该用户从未签到

 楼主| 发表于 2014-5-13 20:03:43 | 显示全部楼层
hczhang 发表于 2014-5-13 19:59
为什么我改这个的时候,方向没改变。一直是垂直向上的。


这是代码,改变这个参数(shooter->setPhiRange(osgParticle::rangef(-0.1,0.1));),没有多大的影响。。。。谢谢。。
osg::ref_ptr<osg::Group> CreateMultiSegmentPlacerPlacer()
{
        osgParticle:article ptemplate;
        ptemplate.setLifeTime(3);
        ptemplate.setSizeRange(osgParticle::rangef(0.75f, 1.0f));
        ptemplate.setAlphaRange(osgParticle::rangef(0.0f, 1.0f));
        ptemplate.setRadius(0.07f);   
        ptemplate.setMass(0.05f);  
        //ptemplate.setAngle(osg::Vec3(1,1,0));
        osg::ref_ptr<osg::Group> root = new osg::Group() ;
        osg::ref_ptr<osgParticle::ParticleSystem> ps = new osgParticle::ParticleSystem();
        ps->setDefaultAttributes("Images/Particle.rgb",true,false);
        ps->setDefaultParticleTemplate(ptemplate);
        osgParticle::ModularEmitter * emitter = new osgParticle::ModularEmitter;
        emitter->setParticleSystem(ps.get());
        osgParticle::RandomRateCounter *rrc = static_cast<osgParticle::RandomRateCounter *> (emitter->getCounter());
        rrc->setRateRange(1000,1000);
        osgParticle::MultiSegmentPlacer *pp = new osgParticle::MultiSegmentPlacer;
        pp->addVertex(-5,5,0);
        pp->addVertex(30,5,0);
        emitter->setPlacer(pp);
        osg::ref_ptr<osgParticle::RadialShooter>  shooter =new osgParticle::RadialShooter();
        shooter->setInitialSpeedRange(100,0);
        shooter->setThetaRange(0.05,0.1);
        shooter->setPhiRange(osgParticle::rangef(-0.1,0.1));
        //shooter->setInitialRotationalSpeedRange(osg::Vec3(1,1,0) ,osg::Vec3(1,0,0));
        emitter->setShooter(shooter.get());
        root->addChild(emitter);
        osg::ref_ptr<osgParticle::ModularProgram> program = new osgParticle::ModularProgram();
        program->setParticleSystem(ps.get());
        osg::ref_ptr<osgParticle::AccelOperator> ap = new osgParticle::AccelOperator();
        ap->setToGravity(0);
        program->addOperator(ap.get());
        osg::ref_ptr<osgParticle::FluidFrictionOperator> ffo = new osgParticle::FluidFrictionOperator();
        //ffo->setFluidToAir();
        //ffo->setWind(osg::Vec3(0,-10,-10));
        //program->addOperator(ffo.get());
        root->addChild(program.get());
        osg::ref_ptr<osgParticle::ParticleSystemUpdater> psu = new osgParticle::ParticleSystemUpdater();
        psu->addParticleSystem(ps.get());
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        geode->addDrawable(ps);
        root->addChild(geode.get());
        root->addChild(psu.get());
        return root.get();
}

该用户从未签到

发表于 2014-5-13 20:36:48 | 显示全部楼层
hczhang 发表于 2014-5-13 20:03
这是代码,改变这个参数(shooter->setPhiRange(osgParticle::rangef(-0.1,0.1));),没有多大的影响。 ...

我不知道你的为什么不行,你可以试试这两句,看行不行!
shooter->setThetaRange(3.14159/2-3.14159/32,3.14159/2+3.14159/32);
shooter->setPhiRange(0.0,3.14159/16);

该用户从未签到

 楼主| 发表于 2014-5-14 08:48:40 | 显示全部楼层
StarShine 发表于 2014-5-13 20:36
我不知道你的为什么不行,你可以试试这两句,看行不行!
shooter->setThetaRange(3.14159/2-3.14159/32, ...

确实是,需要这两个函数参数一起改,惭愧现在才弄懂这两个函数的含义。。谢谢你!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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