查看: 1322|回复: 5

如何单键切换子节点画面?

[复制链接]

该用户从未签到

发表于 2013-6-25 21:47:42 | 显示全部楼层 |阅读模式
我写了一个小程序,源代码如下文所示,根节点helpNode下有"cessna.osg"和"cessnafire.osg"两个模型,使用switch进行切换,当按下F1时切换到"cessnafire.osg",再次按下F1切换到"cessna.osg",如此往复……
现在问题是,如果"cessna.osg"和"cessnafire.osg"不是通过
helpNode->addChild(osgDB::readNodeFile("cessna.osg"),true);
helpNode->addChild(osgDB::readNodeFile("cessnafire.osg"),false);
直接添加到根节点helpNode下,而是helpNode只是场景树根节点root下的一个子节点(root->addChild(helpNode)),那么该如何控制这个子节点helpNode的切换实现上述程序相同的功能呢?
  1. #include <osg/Group>
  2. #include <osg/Geode>
  3. #include <osg/PositionAttitudeTransform>
  4. #include <osgViewer/Viewer>
  5. #include <osgDB/readFile>
  6. #include <osg/ShapeDrawable>
  7. #include <osg/TexEnv>
  8. #include <osgDB/Registry>
  9. #include <iostream>
  10. #include <osgSim/MultiSwitch>
  11. #include <osg/DrawPixels>
  12. #include <osgUtil/Optimizer>

  13. //helpBoard的值在每次按下F1时改变一次
  14. bool helpBoard = true;

  15. //定义一个人机交互事件处理器
  16. class helpNodeCallback : public osgGA :: GUIEventHandler
  17. {
  18. public:
  19.         virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor*)
  20.         {
  21.                 //动作适配器的对象为当前的场景视图
  22.                 osgViewer::Viewer* viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
  23.                 switch(ea.getEventType())
  24.                 {
  25.                 case osgGA::GUIEventAdapter::KEYDOWN:
  26.                         {
  27.                                 osg::Switch* helpNode = dynamic_cast<osg::Switch*>(viewer->getSceneData());
  28.                                 if(ea.getKey() == osgGA::GUIEventAdapter::KEY_F1)
  29.                                 {
  30.                                         //当捕获到键盘F1按下时改变bool型变量helpBoard(上文keyState类中)的值
  31.                                         helpBoard = !helpBoard;
  32.                                         //根据keyState->helpBoard的值来设定switch节点值
  33.                                         if(helpBoard == true)
  34.                                         {
  35.                                                 helpNode->setValue(0, true);
  36.                                                 helpNode->setValue(1, false);
  37.                                         }
  38.                                         else if(helpBoard == false)
  39.                                         {
  40.                                                 helpNode->setValue(0, false);
  41.                                                 helpNode->setValue(1, true);
  42.                                         }
  43.                                 }
  44.                         }
  45.                 default:
  46.                         break;
  47.                 }
  48.                 return false;
  49.         }
  50. };

  51. int main(int argc, char** argv)
  52. {
  53.         osg::ref_ptr<osg::Switch> helpNode = new osg::Switch;
  54.         helpNode->addChild(osgDB::readNodeFile("cessna.osg"),true);
  55.         helpNode->addChild(osgDB::readNodeFile("cessnafire.osg"),false);
  56.         osgViewer::Viewer viewer;
  57.         viewer.setSceneData(helpNode.get());
  58.         viewer.addEventHandler(new helpNodeCallback);
  59.         return viewer.run();
  60. }
复制代码

该用户从未签到

发表于 2013-6-26 09:52:39 | 显示全部楼层
通过viewer->getSceneData()得到场景根结点后,再由root->getChild(num,pos)来获得所需要的switch节点helpNode。

该用户从未签到

 楼主| 发表于 2013-6-26 21:55:57 | 显示全部楼层
shirro 发表于 2013-6-26 09:52
通过viewer->getSceneData()得到场景根结点后,再由root->getChild(num,pos)来获得所需要的switch节点helpN ...

谢谢这位兄弟!可是能不能说具体点呢?我小白,比如说我在main函数中插入下面代码:
  1.         osg::ref_ptr<osg::Group> root = new osg::Group;
  2.         osg::ref_ptr<osg::Switch> helpNode = new osg::Switch;
  3.         root->addChild(helpNode);
复制代码
那么要实现相同功能该如何改写呢?

该用户从未签到

 楼主| 发表于 2013-6-28 00:16:45 | 显示全部楼层
怎么没人回答呢?大家帮帮我啊

该用户从未签到

发表于 2013-6-28 09:29:00 | 显示全部楼层
你把switch节点传递给事件处理器就行了吧

该用户从未签到

 楼主| 发表于 2013-6-30 10:41:04 | 显示全部楼层
fenma3422 发表于 2013-6-28 09:29
你把switch节点传递给事件处理器就行了吧

还是不会啊,能不能讲具体点呢?例如代码怎么实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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