OSG节点访问和遍历
遍历节点树:
osg::Node类中有两个辅助函数:
void ascend(NodeVisitor& nv) //虚函数,向上一级节点推进访问器 void traverse(NodeVisitor& nv) //虚函数,向下一级节点推进访问器 NodeVisitor的traverse()函数实现如下: inline void traverse(Node& node) { if (_traversalMode == TRAVERSE_PARENTS) { node.ascend(*this); } else if (_traversalMode != TRAVERSE_NONE) { node.traverse(*this); } }
#include <osg/Node> #include <osgDB/ReadFile> #include <iostream> using namespace std; class InfoVisitor: public osg::NodeVisitor { public: InfoVisitor() :osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent(0) {} virtual void apply(osg::Node& node) { for(int i = 0; i < _indent; i++) cout << " "; cout << "[" << _indent << "]"<< node.libraryName() << "::" << node.className() << endl; _indent++; traverse(node); _indent--; for(int i = 0; i < _indent; i++) cout << " "; cout << "[" << _indent << "] "<< node.libraryName() << "::" << node.className() << endl; } virtual void apply(osg::Geode& node) { for(int i = 0; i < _indent; i++) cout << " "; cout << "[" << _indent << "] "<< node.libraryName() << "::" << node.className() << endl; _indent++; for(unsigned int n = 0; n < node.getNumDrawables(); n++) { osg::Drawable* draw = node.getDrawable(n); if(!draw) continue; for(int i = 0; i < _indent; i++) cout << " "; cout << "[" << _indent << "]" << draw->libraryName() << "::" << draw->className() << endl; } traverse(node); _indent--; for(int i = 0; i < _indent; i++) cout << " "; cout << "[" << _indent << "]"<< node.libraryName() << "::" << node.className() << endl; } private: int _indent; }; int main(int argc, char** argv) { osg::ArgumentParser parser(&argc, argv); osg::Node* root = osgDB::readNodeFiles(parser); if(!root) { root = osgDB::readNodeFile("avatar.osg"); } InfoVisitor infoVisitor; if(root) { root->accept(infoVisitor); } system("pause"); return 0; }
转自:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html
QQ 3087438119