OSG节点访问和遍历

Wesley13
• 阅读 647

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
菜园前端 菜园前端
1年前
DOM 文档对象模型使用教程来喽!
原文链接:HTML模板html我是网站标题访问节点通过id访问指定节点getElementByIdjavascriptvarnodedocument.getElementById('box')通过name访问指定节点getElementsByNamejav
Stella981 Stella981
2年前
C++primer学习笔记(六)
1.virtual函数是基类希望派生类重新定义的函数,希望派生类继承的函数不能为虚函数。根类一般要定义虚析构函数。2.派生类只能通过派生类对象访问protected成员,不能用基类对象访问。基类定义为virtual就一直为虚函数,派生类写不写virtual都是虚函数。用做基类的类必须是已定义的。3.存在虚函数指针或引用
Wesley13 Wesley13
2年前
GoJS API学习
varnode{};node"key""节点Key";node"loc""00";//节点坐标node"text""节点名称";//添加节点通过按钮点击,添加新的节点到画布myDiagram.model.addNodeData(nod
Stella981 Stella981
2年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
2年前
HIVE 时间操作函数
日期函数UNIX时间戳转日期函数: from\_unixtime语法:   from\_unixtime(bigint unixtime\, string format\)返回值: string说明: 转化UNIX时间戳(从19700101 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式举例:hive   selec
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
菜园前端 菜园前端
11个月前
什么是二叉树?
原文链接:什么是二叉树?树中每个节点最多只能有两个子节点,在JavaScript中一般都是通过Object来模拟二叉树。常用操作前序遍历中序遍历后序遍历前序遍历根左右。口诀:1.访问根节点2.对根节点的左子树进行前序遍历3.对根节点的右子树进行前序遍历通过
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这