遍历节点树:
osg::Node类中有两个辅助函数:

  1. void ascend(NodeVisitor& nv) //虚函数,向上一级节点推进访问器
  2. void traverse(NodeVisitor& nv) //虚函数,向下一级节点推进访问器
  3. NodeVisitortraverse()函数实现如下:
  4. inline void traverse(Node& node)
  5. {
  6. if (_traversalMode == TRAVERSE_PARENTS)
  7. {
  8. node.ascend(*this);
  9. }
  10. else if (_traversalMode != TRAVERSE_NONE)
  11. {
  12. node.traverse(*this);
  13. }
  14. }
  1. #include <osg/Node>
  2. #include <osgDB/ReadFile>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. class InfoVisitor: public osg::NodeVisitor
  8. {
  9. public:
  10. InfoVisitor()
  11. :osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), _indent()
  12. {}
  13.  
  14. virtual void apply(osg::Node& node)
  15. {
  16. for(int i = ; i < _indent; i++) cout << " ";
  17. cout << "[" << _indent << "]"<< node.libraryName()
  18. << "::" << node.className() << endl;
  19.  
  20. _indent++;
  21. traverse(node);
  22. _indent--;
  23.  
  24. for(int i = ; i < _indent; i++) cout << " ";
  25. cout << "[" << _indent << "] "<< node.libraryName()
  26. << "::" << node.className() << endl;
  27. }
  28.  
  29. virtual void apply(osg::Geode& node)
  30. {
  31. for(int i = ; i < _indent; i++) cout << " ";
  32. cout << "[" << _indent << "] "<< node.libraryName()
  33. << "::" << node.className() << endl;
  34.  
  35. _indent++;
  36.  
  37. for(unsigned int n = ; n < node.getNumDrawables(); n++)
  38. {
  39. osg::Drawable* draw = node.getDrawable(n);
  40. if(!draw)
  41. continue;
  42. for(int i = ; i < _indent; i++) cout << " ";
  43. cout << "[" << _indent << "]" << draw->libraryName() << "::"
  44. << draw->className() << endl;
  45. }
  46.  
  47. traverse(node);
  48. _indent--;
  49.  
  50. for(int i = ; i < _indent; i++) cout << " ";
  51. cout << "[" << _indent << "]"<< node.libraryName()
  52. << "::" << node.className() << endl;
  53. }
  54. private:
  55. int _indent;
  56. };
  57.  
  58. int main(int argc, char** argv)
  59. {
  60. osg::ArgumentParser parser(&argc, argv);
  61. osg::Node* root = osgDB::readNodeFiles(parser);
  62.  
  63. if(!root)
  64. {
  65. root = osgDB::readNodeFile("avatar.osg");
  66. }
  67.  
  68. InfoVisitor infoVisitor;
  69. if(root)
  70. {
  71. root->accept(infoVisitor);
  72. }
  73.  
  74. system("pause");
  75. return ;
  76. }

转自: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. SSH与ansible 部署方法与核心模块简介

    SSH与ansible 部署方法 部署环境 管理服务器 172.16.1.61 NFS服务器 172.16.1.31 备份服务器 172.16.1.41 1检查SSH服务是否运行并开启服务 netst ...

  2. Socket实现client和server端通信(Java)(转)

    转自: https://blog.csdn.net/yayun0516/article/details/50819147 https://www.jianshu.com/p/2d4f223f1462 ...

  3. JDBC_通过DriverManager获得数据库连接

    package day_18; import org.junit.Test; import java.io.InputStream; import java.sql.*; import java.sq ...

  4. ABCD组·第五次团队作业项目需求分析改进与系统设计

    项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh 团队 ...

  5. 《hello--world团队》第四次作业:项目需求调研与分析

    项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验八 团队作业4:基于原型的团队项目需求调研与分析 团队名称 <hello--w ...

  6. 有关Django的smallDemo

    注: 电脑为Mac,Python解释器为3.5.4 数据库使用的是pymysql模块代替mysqldb 功能: 运行服务器,在login登录界面输入用户名和密码,post到服务器, 通过数据库判断用户 ...

  7. C# TreeView 右键菜单

    方法一: 在winform中,添加一个contextMenuStrip1,设置TreeView的属性ContextMenuStrip为contextMenuStrip1,并为这个contextMenu ...

  8. jQuery相关方法5----表单相关

    一.value属性在表单的相关操作-----val()方法 <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js ...

  9. [NOI2010]超级钢琴 倍增

    [NOI2010]超级钢琴 倍增 题面 暴力:枚举区间丢入堆\(O(n^2logn)\) 正解:考虑每次枚举和弦起点\(s\),那么以\(s\)为起点的和弦为\(sum[t]-sum[s](s+L-1 ...

  10. NetworkX系列教程(10)-算法之五:广度优先与深度优先

    小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...