查看: 1166|回复: 3

开关节点示例的一个问题

[复制链接]

该用户从未签到

发表于 2013-6-12 23:22:32 | 显示全部楼层 |阅读模式
  1. #include <osg/Switch>
  2. #include <osgDB/ReadFile>
  3. #include <osgViewer/Viewer>

  4. class CessnaCallback : public osg::NodeCallback
  5. {
  6. public:
  7.         static const int _fireStartFrame = 120;
  8.         virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
  9.         {
  10.                 osg::Switch* cessnaSwitch = dynamic_cast<osg::Switch*>(node);
  11.                 if(cessnaSwitch && nv)
  12.                 {
  13.                         const osg::FrameStamp* frameStamp = nv->getFrameStamp();
  14.                         if(frameStamp)
  15.                         {
  16.                                 if(_fireStartFrame<frameStamp->getFrameNumber())
  17.                                 {
  18.                                         cessnaSwitch->setValue(0,false);
  19.                                         cessnaSwitch->setValue(1,true);
  20.                                 }
  21.                         }
  22.                 }
  23.                 traverse(node,nv);
  24.         }
  25. };

  26. int main(int argc, char** argv)
  27. {
  28.         osg::ref_ptr<osg::Switch> root = new osg::Switch;
  29.         root->addChild(osgDB::readNodeFile("cessna.osg"),true);
  30.         root->addChild(osgDB::readNodeFile("cessnafire.osg"),false);
  31.         root->setUpdateCallback(new CessnaCallback);

  32.         osgViewer::Viewer viewer;
  33.         viewer.setSceneData(root.get());
  34.         return viewer.run();
  35. }
复制代码
以上代码5-27行定义一个名为CessnaCallback的节点更新回调,它使用getFrameNumber()随时取得当前的运行的累积的帧数,当帧数大于预先设定的切换值(120帧)的时候,使用setValue()执行子节点的切换。
第31-33行,定义一个开关节点,并将两个子节点传入其中,默认开启的子节点cessna.osg是一个飞机模型,而默认关闭(切换后开启)的子节点cessnafire.osg是一个起火后的飞机模型。

我的疑问是,
if(_fireStartFrame<frameStamp->getFrameNumber())
                                {
                                        cessnaSwitch->setValue(0,false);
                                        cessnaSwitch->setValue(1,true);
                                }
这里当_fireStartFrame<frameStamp->getFrameNumber(),即帧数小于120帧时,此式为真,故
cessnaSwitch->setValue(0,false)和cessnaSwitch->setValue(1,true)都被执行了,那么当帧数大于等于120帧后,此式为false,为何节点能自动切换到飞机着火那个模型呢?此时是何参数将false传递给switch节点呢?帧数小于120时没有切换到着火的飞机,同样,什么参数将true传递给switch节点呢?

该用户从未签到

发表于 2013-6-13 08:10:14 | 显示全部楼层
为false  怎么了?   

该用户从未签到

 楼主| 发表于 2013-6-13 12:12:14 | 显示全部楼层
liuzhiyu123 发表于 2013-6-13 08:10
为false  怎么了?

if(_fireStartFrame<frameStamp->getFrameNumber())

18.                                {

19.                                        cessnaSwitch->setValue(0,false);

20.                                        cessnaSwitch->setValue(1,true);

21.                                }
就是if里面条件为true时18-21执行,可是当if条件为false时候,18-21根本就不会执行了,为什么还能实现调用着火飞机呢?换句话说,就是root->addChild(osgDB::readNodeFile("cessnafire.osg"),false);是如何捕获开始执行的消息呢?

该用户从未签到

发表于 2013-6-13 14:48:14 | 显示全部楼层
就是root->addChild(osgDB::readNodeFile("cessnafire.osg"),false);是如何捕获开始执行的消息呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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