• 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

  • 相关阅读:
    .net解决跨域问题
    win7系统安装不了Visual Studio及sql server相关问题整理
    Visual Studio注释代码段快捷键
    实现文件下载,将后台返回的字节流转成下载链接
    表单中输入内容,搜索时,下面table中该列中包含关键字的高亮显示
    实现select联动效果,数据从后台获取
    vue的v-model指令
    SSM框架中,controller的action返回参数给vue.js
    vue路由实现多视图的单页应用
    关于vue的增删改查操作
  • 原文地址:https://www.cnblogs.com/herd/p/11216675.html
Copyright © 2020-2023  润新知