遍历节点树:
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. Three.js入门详解

    什么是WebGL   WebGL(Web 图形库)是一种 JavaScript API,用于在任何兼容的 Web 浏览器中呈现交互式 3D 和 2D 图形,而无需使用插件.WebGL 通过引入一个与 ...

  2. python基础--文件控制

    读写文件是最常见的IO操作.Python内置了读写文件的函数,用法和C是兼容的. 读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘, ...

  3. Makefile:248: /usr/local/otp_src_18.1/make/x86_64-unknown-linux-gnu/otp_ded.mk: No such file

    安装erlang的时候,使用make命令一直报这个错 Makefile:248: /usr/local/otp_src_18.1/make/x86_64-unknown-linux-gnu/otp_d ...

  4. BZOJ1257: [CQOI2007]余数之和——整除分块

    题意 求 $\sum _{i=1}^n k \ mod \ i$($1\leq n,k\leq 10^9$). 分析 数据范围这么大 $O(n)$ 的复杂度也挺不住啊 根据取模的意义,$k \ mod ...

  5. C# 通过 参数返回 C++ 指针

    参数返回 C++ 指针 C++ 代码 Extern_C BASECORELIBRARY_API char * GetFileByteArray(wchar_t * BinfilePath, wchar ...

  6. JS 导出网页中Table内容到excel

    <html> <head> <script type="text/javascript" language="javascript" ...

  7. Appium自动化测试教程-自学网-monkey日志管理

    日志管理作用 Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和 ...

  8. Greenplum table 之 appendonly表

    一.压缩表 1.appendonly压缩表的数据视图为pg_appendonly 2.appendonly在Greenplum后也可更新与删除

  9. java上传1t文件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用.此控件PC全平台支持包括mac,linux系统的文件上传,文章末尾将附上控件下载与教程链接 ...

  10. 如何自定义 GNOME 3 桌面?

    作者: Magesh Maruthamuthu 译者: LCTT 郑 | 2019-08-22 00:02   评论: 2 收藏: 1 我们收到很多来自用户的电子邮件,要我们写一篇关于 GNOME 3 ...