OSG学习笔记5—使用开关节点

来源:互联网 发布:配电网数据采集与监控 编辑:程序博客网 时间:2024/04/30 08:30
// osg_4_23.cpp : 定义控制台应用程序的入口点。
//使用开关节点
//开关节点的用法,以及使用开关节点的更新回调完成了动态的子节点切换过程。 
//一共切换两次,一次在120帧时,一次在240帧时
//关于节点的实现:判断某个子节点对于的开关值,当开关值为false时,不执行其accept()函数,因此该子节点及其子树也不会被访问器遍历到。
//否则执行正常的访问器推进操作

#include "stdafx.h"#include<osg/Switch>#include<osgDB/ReadFile>#include<osgViewer/Viewer>class CessnaCallback :public osg::NodeCallback//定义了节点更新回调,每一帧系统遍历到当前节点时都会被自动调用{public:static const int _fireStartFrame = 120;//预先设定第一次切换值为120帧static const int _fireStartFrame1 = 240;//预先设定第二次切换值为240帧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())//当当前帧大于120时,使用setValue()执行子节点的切换。{cessnaSwitch->setValue(0, false);cessnaSwitch->setValue(1, true);}if (_fireStartFrame1 < frameStamp->getFrameNumber())//当当前帧大于240时,使用setValue()执行子节点的切换。{cessnaSwitch->setValue(0, true);cessnaSwitch->setValue(1,false);}}}traverse(node, nv);}};int _tmain(int argc, _TCHAR* argv[]){osg::ref_ptr<osg::Switch> root = new osg::Switch;root->addChild(osgDB::readNodeFile("cessna.osg"), true);//添加模型到子节点,并设置为当前要遍历到的节点,为trueroot->addChild(osgDB::readNodeFile("cessnafire.osg"), false);root->setUpdateCallback(new CessnaCallback);osgViewer::Viewer viewer;viewer.setSceneData(root.get());return viewer.run();}



0 0
原创粉丝点击