遍历节点树:
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()
{} virtual void apply(osg::Node& node)
{
for(int i = ; i < _indent; i++) cout << " ";
cout << "[" << _indent << "]"<< node.libraryName()
<< "::" << node.className() << endl; _indent++;
traverse(node);
_indent--; for(int i = ; i < _indent; i++) cout << " ";
cout << "[" << _indent << "] "<< node.libraryName()
<< "::" << node.className() << endl;
} virtual void apply(osg::Geode& node)
{
for(int i = ; i < _indent; i++) cout << " ";
cout << "[" << _indent << "] "<< node.libraryName()
<< "::" << node.className() << endl; _indent++; for(unsigned int n = ; n < node.getNumDrawables(); n++)
{
osg::Drawable* draw = node.getDrawable(n);
if(!draw)
continue;
for(int i = ; i < _indent; i++) cout << " ";
cout << "[" << _indent << "]" << draw->libraryName() << "::"
<< draw->className() << endl;
} traverse(node);
_indent--; for(int i = ; 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 ;
}

转自:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html

OSG节点访问和遍历的更多相关文章

  1. OSG的节点访问

    OSG的节点访问 转自:http://www.cnblogs.com/kanego/archive/2011/09/27/2193484.html SG中节点的访问使用的是一种访问器模式. 一个典型的 ...

  2. [osg]节点遍历nodevisitor浅析

    参考:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html OSG中节点的访问使用的是一种访问器模式.一个典型的访问器涉及抽象访问者 ...

  3. 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介

    我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...

  4. 探索未知种族之osg类生物---渲染遍历之裁剪二

    前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...

  5. 数据库的应用——直接从内存中读取osg节点 (转)

    数据库的应用——直接从内存中读取osg节点 目的:要从数据库中读取节点数据到osg. 一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件 ...

  6. js 递归获取子节点所有父节点,深度遍历获取第一个子树

    前端需求. 递归 深度优先遍历算法 // 查找一个节点的所有父节点 familyTree (arr1, id) { var temp = [] var forFn = function (arr, i ...

  7. 探索未知种族之osg类生物---渲染遍历之裁剪一

    前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...

  8. 探索未知种族之osg类生物---渲染遍历之认识SceneView

    前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构,     a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息:     b  ...

  9. DOM节点访问

    简而言之,DOM(即文档对象模型)是一种将XML或HTML文档解析成树形节点的方法.通过DOM的方法与属性,我们就可以访问到页面中的任何元素,并进行元素的修改.删除以及添加的操作.同时,DOM也是一套 ...

随机推荐

  1. 【记忆化搜索】[NOIP-2017--普及组] -- 棋盘

    [题目描述] 原题目链接地址:   有一个m × m的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你所站在的位置必须是有颜色的( ...

  2. ajax二进制流乱码图片解决方法

    仅供自己参考 参考博客 在请求成功的地方 添加以下代码: var blob=new Blob(); blob=this.response; 既然二进制数据拿到了,那么要把它放在一个 html标签中,并 ...

  3. python_面向对象——双下划线方法

    1.__str__和__repe__ class Person(object): def __init__(self,name,age): self.name = name self.age = ag ...

  4. celery timeout的拦截

    0X01 场景 celery任务超时报错,想查看是传入哪一类数据运行时导致的超时(哪一个插件),但是该报错难以拦截. [2019-06-30 17:23:21,070: ERROR/MainProce ...

  5. Codeforces Round #336 (Div. 2) D. Zuma(区间DP)

    题目链接:https://codeforces.com/contest/608/problem/D 题意:给出n个宝石的颜色ci,现在有一个操作,就是子串的颜色是回文串的区间可以通过一次操作消去,问最 ...

  6. [Angular 8] Implement a Custom Preloading Strategy with Angular

    Preloading all modules is quite an extreme approach and might not always be desirable. For instance, ...

  7. Java中static用来计数

    搓搓的代码 import java.util.ArrayList; import java.util.Iterator; class Student{ private static int num; ...

  8. MongoDB 分片管理(三)服务器管理

    MongoDB 分片管理(三)服务器管理

  9. 067_查看 KVM 虚拟机中的网卡信息(不需要进入启动或进入虚拟机)

    #!/bin/bash #该脚本使用 guestmount 工具,可以将虚拟机的磁盘系统挂载到真实机文件系统中#Centos7.2 中安装 libguestfs-tools-c 可以获得 guestm ...

  10. 四十.创建Redis集群 管理集群

    环境准备 准备 6台(51-56) redis服务器  以默认配置运行redis服务即可  一.创建Redis集群 1.启用集群功能( 51-56 都要配置) ]#  netstat -antupl ...