遍历节点树:
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