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

 

转载于:https://www.cnblogs.com/herd/p/11216675.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值