查看: 1063|回复: 5

更新回调

[复制链接]

该用户从未签到

发表于 2011-10-17 10:57:52 | 显示全部楼层 |阅读模式
本帖最后由 yugang2010 于 2011-10-17 11:04 编辑

osg在更新回调operator()函数中是不是仅仅能对当前节点进行姿态的控制,不能对当前节点进行添加节点的操作???谢谢

下面代码,检测某个节点是否发生碰撞。如果碰撞,添加paticle粒子效果。不知道这种方式是不是不正确。是否有其他思路,谢谢指点。




  1. class bulletcallback : public osg::NodeCallback
  2. {
  3. public:
  4. bulletcallback(osg::Group* group)  
  5. {
  6.           root=group;
  7. }
  8. virtual void operator()(osg::Node* node,osg::NodeVisitor* nv)
  9. {  

  10. osg::MatrixTransform* pat=dynamic_cast<osg::MatrixTransform*> (node);
  11.    
  12.         osg::BoundingSphere  bs = pat->getBound();
  13.         osg::ref_ptr<osgUtil::LineSegmentIntersector> inter=new osgUtil::LineSegmentIntersector(bs.center(),bs.center()+osg::Vec3(0.0f,0.0f,bs.radius()));
  14.         osgUtil::IntersectionVisitor v(inter.get());
  15.         pat->accept(v);
  16.         unsigned int size=inter->getIntersections().size();
  17.         if ( size>0 ) {
  18. osg::Vec3 resultCoord=inter.get()->getIntersections().begin()->getWorldIntersectPoint();
  19.         osg::Vec3 coord;
  20.         coord[0]=resultCoord[0];
  21.         coord[1]=resultCoord[1];
  22.         coord[2]=resultCoord[2];

  23. float posx=coord[0];
  24. float posy=coord[1];
  25. float posz=coord[2];
  26. osg::ref_ptr<osg::Group> explode=new osg::Group();
  27. osg::Vec3 wind(1.0f,0.0f,0.0f);
  28. osg::Vec3 position(posx,posy,posz);
  29. osg::ref_ptr<osgParticle::ExplosionEffect> explosion=new osgParticle::ExplosionEffect(position,2.0f);
  30. osg::ref_ptr<osgParticle::ExplosionDebrisEffect> explosionDebri=new osgParticle::ExplosionDebrisEffect(position,2.0f);
  31. osg::ref_ptr<osgParticle::SmokeEffect> smoke=new osgParticle::SmokeEffect(position,5.0f);
  32. osg::ref_ptr<osgParticle::FireEffect> fire=new osgParticle::FireEffect(position,2.0f);
  33. explosionDebri->setWind(wind);
  34. explosion->setWind(wind);
  35. smoke->setWind(wind);
  36. fire->setWind(wind);
  37. explode->addChild(explosion.get());
  38. explode->addChild(explosionDebri.get());
  39. explode->addChild(smoke.get());
  40. explode->addChild(fire.get());
  41. root->addChild(explode.get());
  42. root->addChild(nod);

  43.   }
  44. private : osg::Group* root;
  45.         };

复制代码

该用户从未签到

发表于 2011-10-17 16:57:39 | 显示全部楼层
回调中当然可以更新下挂节点,请检查是否正确操作!
碰撞添加节点的思路正确~~~~~~~

该用户从未签到

 楼主| 发表于 2011-10-17 22:28:45 | 显示全部楼层
回复 2# tianxiao888


    我在这个更新回调中添加节点,总是崩溃。兄弟,帮帮忙吧。我确实不知道怎么弄了。就算不添加那些粒子,随便添加个都崩溃。

该用户从未签到

发表于 2011-10-18 08:59:36 | 显示全部楼层
private : osg::Group* root;
这个节点传进来的是什么?
明明是给一个osg::MatrixTransform节点做的更新回调,你不操作这个节点,非得传个节点进来操作是什么意思......

该用户从未签到

 楼主| 发表于 2011-10-18 11:52:44 | 显示全部楼层
回复 4# StackSnow


    谢谢,看来只能对使用更新回调的节点进行操作。外部节点,不能操作。

该用户从未签到

发表于 2011-10-21 16:56:58 | 显示全部楼层
谢谢,看来只能对使用更新回调的节点进行操作。外部节点,不能操作
毫无根据的结论
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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