当前位置:   article > 正文

osg控制节点的显示与否_osg::node 不显示

osg::node 不显示

                      欢迎关注公众号可以查看更多完整文章

使物体或者说Node隐藏方式有两种,一种是设置NodeMask,另外一种是使用osg的switch类来控制。
两者的区别是
前者只是看不到,数据还在场景中,隐藏了并不能影响渲染性能,不影响内存中的数据;

后者是从内存中暂时移除,会对性能有所影响,需要显示时再加载进场景。

回调的速度好像是每帧调用一次,这样程序运行起来,会看到球以很快的速度在闪。为了更方便的观察,我在回调中做了限制,每5000次取反一次进行显示。

osg::Switch隐藏和显示节点的接口有很多种组合方法,我在程序中有体现。将节点添加到Switch对象中,可以通过getChildIndex来获取当前节点在Switch对象中的索引。

如果需要将Switch对象中节点全部隐藏和显示,可以使用setAllChildrenOff和setAllChildrenOn接口。

完整程序:

  1. #include <osg/Geode>
  2. #include <osgViewer/Viewer>
  3. #include <osg/ShapeDrawable>
  4. #include <osg/Switch>
  5. using namespace osg;
  6. using namespace osgViewer;
  7. #pragma comment(lib,"osgd.lib")
  8. #pragma comment(lib,"osgViewerd.lib")
  9. class NodeVisiableCallback :public NodeCallback
  10. {
  11. public:
  12. NodeVisiableCallback(unsigned int index) :_bVisiable(false), _childIndex(index), _tick(0){}
  13. ~NodeVisiableCallback(){};
  14. virtual void operator()(Node* node, NodeVisitor* nv)
  15. {
  16. if (_tick < 5000)
  17. {
  18. _tick++;
  19. return;
  20. }
  21. else
  22. {
  23. _tick = 0;
  24. }
  25. ref_ptr<Switch> sw = dynamic_cast<Switch*>(node);
  26. if (sw)
  27. sw->setValue(_childIndex, _bVisiable = !_bVisiable);
  28. }
  29. protected:
  30. bool _bVisiable;
  31. unsigned int _tick;
  32. unsigned int _childIndex;
  33. };
  34. int main(int argc, char **argv)
  35. {
  36. Viewer viewer;
  37. ref_ptr<Group> group = new Group;
  38. ref_ptr<Geode> node1 = new Geode;
  39. ref_ptr<Geode> node2 = new Geode;
  40. ref_ptr<ShapeDrawable> sphere1 = new ShapeDrawable(new Sphere(Vec3(10, 0, 0), 2.f));
  41. ref_ptr<ShapeDrawable> sphere2 = new ShapeDrawable(new Sphere(Vec3(-10, 0, 0), 2.f));
  42. node1->addDrawable(sphere1);
  43. node2->addDrawable(sphere2);
  44. ref_ptr<Switch> sw = new Switch;
  45. //on
  46. sw->addChild(node1);
  47. sw->setUpdateCallback(new NodeVisiableCallback(sw->getChildIndex(node1)));
  48. //off 1
  49. //sw->addChild(node1,0);
  50. //off 2
  51. //sw->addChild(node1);
  52. //sw->setChildValue(node1, 0);
  53. //off 3
  54. //sw->addChild(node1);
  55. //sw->setValue(sw->getChildIndex(node1), 0);
  56. //off 4
  57. //sw->addChild(node1);
  58. //sw->setAllChildrenOff();
  59. group->addChild(sw);
  60. group->addChild(node2);
  61. viewer.setSceneData(group.get());
  62. viewer.realize();
  63. viewer.run();
  64. }


本文地址:http://blog.csdn.net/u011417605/article/details/70237688

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/314939
推荐阅读
相关标签
  

闽ICP备14008679号