查看: 4285|回复: 22

如何改变粒子发射器方向(11楼已放出源代码)

[复制链接]

该用户从未签到

发表于 2008-9-8 18:01:48 | 显示全部楼层 |阅读模式
如题,在哪设置的呢?以下是我写的代码,但好像改变的是下落方向(风力方向),而不是发射方向。
  1.         //设置发射枪,可以设置初速度等
  2.         osgParticle::RadialShooter *shooter = new osgParticle::RadialShooter;
  3.         //设置初速度
  4.         shooter->setInitialSpeedRange(m_fTheSpeech, 0);
  5. //        shooter->setThetaRange(90.0*3.14159265/180.0,90.0*3.14159265/180.0);与Z轴夹角
  6. //        shooter->setPhiRange(90.0*3.14159265/180.0,90.0*3.14159265/180.0);与X轴夹角
复制代码

[ 本帖最后由 Sailent 于 2008-9-17 10:45 编辑 ]

该用户从未签到

发表于 2008-9-18 18:11:38 | 显示全部楼层
原帖由 Sailent 于 2008-9-18 16:15 发表
晕,怎么会这样呢,不管从哪个角度看都得不到你那个图啊……


那你去掉snow试一下。我用不了你的snow.lib,所以把那段去掉了

如果这样就可以的话,恐怕是snow库的编写有问题

该用户从未签到

发表于 2008-9-8 18:24:46 | 显示全部楼层
我记得是设置 ModularEmitter::setPlacer,然后通过加载不同的Placer来改变发射方向

该用户从未签到

发表于 2008-9-9 00:36:09 | 显示全部楼层
你可以通过设置发射时的速度分量来控制方向或者是旋转角度,,只要风速不影响,,方向都是可以控制的~~~~~~~

该用户从未签到

 楼主| 发表于 2008-9-9 09:37:26 | 显示全部楼层
原帖由 array 于 2008-9-8 18:24 发表
我记得是设置 ModularEmitter::setPlacer,然后通过加载不同的Placer来改变发射方向

这个好像只能设置起始位置吧,不能设置方向。
  1. //设置位置
  2. osgParticle::PointPlacer *placer = new osgParticle::PointPlacer;
  3. placer->setCenter(m_VecPosition); //m_VecPosition是osg::vec3类型

  4. //加入到发射器中
  5. emitter->setPlacer(placer);
复制代码

该用户从未签到

发表于 2008-9-9 10:10:55 | 显示全部楼层
您所说的粒子射出方向是通过RadialShooter的函数setThetaRange和setPhiRange来设置的;
风力方向是通过FluidFrictionOperator来设置的,重力通过AccelOperator设置。
Placer可以改变粒子的出生位置,也就是它发射时所处的位置

该用户从未签到

 楼主| 发表于 2008-9-9 12:25:15 | 显示全部楼层
但是我使用setThetaRange和setPhiRange后并没有改变粒子射出的方向呀,一直是90度朝天上射的。下落的方向倒是改变了。
我的全部代码是这样的:
  1. osgParticle::ParticleSystem * Conduit::CreatFireworks(osg::Group * root)
  2. {
  3.         m_fTheSpeech=80;
  4.         osgParticle::Particle ptemplate;
  5.         //生周期为2,对于喷泉已经够了
  6.         ptemplate.setLifeTime(2);
  7.         //设置图形变化范围
  8.         ptemplate.setSizeRange(osgParticle::rangef(0.1f, 0.1f));
  9.         //设置透明度变化范围
  10.         ptemplate.setAlphaRange(osgParticle::rangef(1.0f, 0.5f));
  11.         //设置颜色范围
  12.         ptemplate.setColorRange(osgParticle::rangev4( osg::Vec4(0.7f, 1.0f, 1.0f, 1.5f), osg::Vec4(0.8f, 0.8f, 1.0f, 0.0f)));
  13.         //        ptemplate.setColorRange(osgParticle::rangev4( osg::Vec4(0.0f, 0.0f, 1.0f, 1.5f), osg::Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
  14.         //设置半径
  15.         ptemplate.setRadius(m_fTheSize);
  16.         // 设置重量
  17.         ptemplate.setMass(0.05f);
  18.         osgParticle::ParticleSystem *ps = new osgParticle::ParticleSystem;
  19.         ps->setDefaultAttributes("Images/smoke.rgb", false, false);//纹理
  20.         //加入模版
  21.         ps->setDefaultParticleTemplate(ptemplate);
  22.         //建立发射器,中包含发射枪,数目及位置设定
  23.         osgParticle::ModularEmitter *emitter = new osgParticle::ModularEmitter;
  24.         //加入模版及总属性
  25.         emitter->setParticleSystem(ps);
  26.         //数目变化
  27.         osgParticle::RandomRateCounter *counter = new osgParticle::RandomRateCounter;
  28.         //数目变化,当前场景中的粒子数目
  29.         counter->setRateRange(m_fTheNum, m_fTheNum);
  30.         //加入到发射器中
  31.         emitter->setCounter(counter);
  32.         //设置位置
  33.         osgParticle::PointPlacer *placer = new osgParticle::PointPlacer;
  34.         placer->setCenter(m_VecPosition);

  35.         //加入到发射器中
  36.         emitter->setPlacer(placer);
  37.         //设置发射枪,可以设置初速度等
  38.         osgParticle::RadialShooter *shooter = new osgParticle::RadialShooter;
  39.         //设置初速度
  40.         shooter->setInitialSpeedRange(m_fTheSpeech, 0);

  41.         shooter->setThetaRange(90.0*3.14159265/180.0,90.0*3.14159265/180.0);
  42.         shooter->setPhiRange(90.0*3.14159265/180.0,90.0*3.14159265/180.0);
  43. //        shooter->setThetaRange(90,90);
  44. //        shooter->setPhiRange(90,90);
  45.         emitter->setShooter(shooter);
  46.         root->addChild(emitter);
  47.         //设置影响操作,
  48.         osgParticle::ModularProgram *program = new osgParticle::ModularProgram;
  49.         program->setParticleSystem(ps);
  50.         //速度操作
  51.         osgParticle::AccelOperator *op1 = new osgParticle::AccelOperator;
  52.         op1->setToGravity();
  53.         program->addOperator(op1);
  54.         osgParticle::FluidFrictionOperator *op3 = new osgParticle::FluidFrictionOperator;
  55.         op3->setFluidToAir();
  56.         program->addOperator(op3);
  57.         root->addChild(program);
  58.         osg::Geode *geode = new osg::Geode; geode->addDrawable(ps);
  59.         root->addChild(geode);
  60.         return ps;
  61. }
复制代码

该用户从未签到

 楼主| 发表于 2008-9-16 14:24:43 | 显示全部楼层
顶贴求助~

该用户从未签到

发表于 2008-9-16 21:14:06 | 显示全部楼层
原帖由 Sailent 于 2008-9-16 14:24 发表
顶贴求助~


这个问题还没有解决吗?事实上您的代码经过测试是完全正常的,发射方向可以按照要求改动。我就没有再回帖

您认为向下发射恐怕只是因为您的观察没有任何参照物,因而造成了视觉上的失误,加上一个子节点axes.osg就可以了,能够很清晰地看到发射方向的变化~~

此外建议:
90.0*3.14159265/180.0,90.0*3.14159265/180.0
这样自己算没什么必要,精度也有损失。直接用
osg::inDegrees(90.0)
比较好

该用户从未签到

 楼主| 发表于 2008-9-17 09:37:19 | 显示全部楼层
原帖由 array 于 2008-9-16 21:14 发表


这个问题还没有解决吗?事实上您的代码经过测试是完全正常的,发射方向可以按照要求改动。我就没有再回帖

您认为向下发射恐怕只是因为您的观察没有任何参照物,因而造成了视觉上的失误,加上一个子节点axes.o ...


第一张是改变了方向的截图,也就是有这两句的:
  1. shooter->setThetaRange(90.0*3.14159265/180.0,90.0*3.14159265/180.0);
  2. shooter->setPhiRange(90.0*3.14159265/180.0,90.0*3.14159265/180.0);
复制代码
第二张是没改变方向的,也就是把那两句注释掉了的。
可以看出,这2张图的差别是在竖直方向发射到了最高点的时候才开始改变方向,而不是一开始就改变发射方向。

[ 本帖最后由 Sailent 于 2008-9-17 09:40 编辑 ]
shoot1.JPG
shoot2.JPG

该用户从未签到

发表于 2008-9-17 10:13:10 | 显示全部楼层
您的代码在我这里执行的很正确。如附图

您可以看看是否还有别的影响因素;或者方便的话,您也可以把全部源代码传上来看一下。
此外,您的createFireworks函数中估计是漏写了一段,我补上了,不然不会有粒子发生的:
  1. osgParticle::ParticleSystemUpdater *ip = new osgParticle::ParticleSystemUpdater;
  2. ip->addParticleSystem(ps);
  3. root->addChild(ip);
复制代码
ps.PNG

该用户从未签到

 楼主| 发表于 2008-9-17 10:44:35 | 显示全部楼层
你补上的那段代码在别的函数里有啦

test24.rar

73.32 KB, 下载次数: 260, 下载积分: 威望 1

程序源代码

该用户从未签到

发表于 2008-9-17 11:35:59 | 显示全部楼层
呵呵,楼主把那个庞大的天空盒屏蔽掉,然后用Trackball漫游器靠近粒子束看一看,你的方向是起作用的。只不过视觉上处理得不太好而已。

该用户从未签到

 楼主| 发表于 2008-9-17 12:12:40 | 显示全部楼层
按照你说的改了,为什么效果还是这样啊~~
shoot3.JPG

该用户从未签到

发表于 2008-9-17 12:21:58 | 显示全部楼层
应该是我问为什么吧……

您选的是什么角度?旋转一下看看

[ 本帖最后由 array 于 2008-9-17 12:37 编辑 ]
ps.PNG

该用户从未签到

 楼主| 发表于 2008-9-17 15:02:20 | 显示全部楼层
原帖由 array 于 2008-9-17 12:21 发表
应该是我问为什么吧……

您选的是什么角度?旋转一下看看

你是说这样旋转吗?
  1.         Conduit odf1;//|
  2.         odf1.m_VecPosition.set(boundingSphere._center+osg::Vec3( 0.0,-3.5f * boundingSphere._radius+1610.0f,10.0f));
  3.         osg::Matrix ro1;
  4.         ro1.makeRotate(90*3.14159265/180.0,osg::Vec3(1.0,0.0,0.0));
  5.         osg::ref_ptr<osg::MatrixTransform> ml1=new osg::MatrixTransform;
  6.         ml1->addChild(odf1.CreateConduit (rootnode.get(),2));
  7.         ml1->setMatrix(ro1);
  8.         rootnode->addChild(ml1.get());
  9. //        rootnode->addChild (odf1.CreateConduit (rootnode.get(),2)) ;
复制代码
还是一样啊……

该用户从未签到

发表于 2008-9-17 16:10:22 | 显示全部楼层
我是说,您的代码得到的结果应该是正确的,不需要添加任何代码,只不过您观察的角度使您错误地以为粒子出生时的方向是向下的。

我给您的截图中不是清楚地体现了粒子的方向吗?我没有修改您的任何代码,除了换而使用TrackBall漫游器

该用户从未签到

 楼主| 发表于 2008-9-18 16:15:05 | 显示全部楼层
晕,怎么会这样呢,不管从哪个角度看都得不到你那个图啊……

该用户从未签到

 楼主| 发表于 2008-9-19 09:40:10 | 显示全部楼层
终于找出原因了,是初速度的问题:shooter->setInitialSpeedRange(m_fTheSpeech, 0);把m_fTheSpeech设为40就没有竖直的那根粒子流了。谢谢array~~~
不过,为什么初速度设置过大就会出现一根竖直方向的粒子流呢?比如m_fTheSpeech=800,这不符合物理常识啊~~~

该用户从未签到

发表于 2008-10-20 15:14:57 | 显示全部楼层
借这个问题问一下,setPhiRange设置的是哪个角啊,我从0到π试,发现效果一样。能用图表示出来最好了

该用户从未签到

发表于 2011-4-1 14:44:34 | 显示全部楼层
回复 14# array


麻烦问一下array,14L中用粒子实现的那个“菲”字,怎么实现的?我看了些资料,总是对粒子系统理解的不深入。 没有完全理解各个参数和设置的含义,觉得array做的那个“粒子字”很神奇!

该用户从未签到

发表于 2011-4-1 15:35:37 | 显示全部楼层
那个“菲”管我什么事……用Placer做就可以了

该用户从未签到

发表于 2011-4-1 16:44:17 | 显示全部楼层
本帖最后由 qingfeng5211 于 2011-4-1 17:10 编辑

回复 22# array


惭愧啊,我第一眼只看到14L有这个效果,楼主的图都没有。刚发现9L就有,这眼神真差!

刚把楼主的代码编译运行了一下,知道怎么回事了


LZ有心人啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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