|
- #include <osg/Switch>
- #include <osgDB/ReadFile>
- #include <osgViewer/Viewer>
- class CessnaCallback : public osg::NodeCallback
- {
- public:
- static const int _fireStartFrame = 120;
- virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
- {
- osg::Switch* cessnaSwitch = dynamic_cast<osg::Switch*>(node);
- if(cessnaSwitch && nv)
- {
- const osg::FrameStamp* frameStamp = nv->getFrameStamp();
- if(frameStamp)
- {
- if(_fireStartFrame<frameStamp->getFrameNumber())
- {
- cessnaSwitch->setValue(0,false);
- cessnaSwitch->setValue(1,true);
- }
- }
- }
- traverse(node,nv);
- }
- };
- int main(int argc, char** argv)
- {
- osg::ref_ptr<osg::Switch> root = new osg::Switch;
- root->addChild(osgDB::readNodeFile("cessna.osg"),true);
- root->addChild(osgDB::readNodeFile("cessnafire.osg"),false);
- root->setUpdateCallback(new CessnaCallback);
- osgViewer::Viewer viewer;
- viewer.setSceneData(root.get());
- return viewer.run();
- }
复制代码 以上代码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节点呢? |
|