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()
{} 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节点访问和遍历的更多相关文章
- OSG的节点访问
OSG的节点访问 转自:http://www.cnblogs.com/kanego/archive/2011/09/27/2193484.html SG中节点的访问使用的是一种访问器模式. 一个典型的 ...
- [osg]节点遍历nodevisitor浅析
参考:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html OSG中节点的访问使用的是一种访问器模式.一个典型的访问器涉及抽象访问者 ...
- 探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介
我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...
- 探索未知种族之osg类生物---渲染遍历之裁剪二
前言 上一节我们大致上过了一遍sceneView::cull()函数,通过研究,我们发现上图中的这一部分的代码才是整个cull过程的核心部分.所以今天我们来仔细的研究一下这一部分. sceneView ...
- 数据库的应用——直接从内存中读取osg节点 (转)
数据库的应用——直接从内存中读取osg节点 目的:要从数据库中读取节点数据到osg. 一开始的方法是这样的,每当我要添加一个数据库中的节点数据时,首先把它读取到内存中,然后写入一个文件,最后再次从文件 ...
- js 递归获取子节点所有父节点,深度遍历获取第一个子树
前端需求. 递归 深度优先遍历算法 // 查找一个节点的所有父节点 familyTree (arr1, id) { var temp = [] var forFn = function (arr, i ...
- 探索未知种族之osg类生物---渲染遍历之裁剪一
前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...
- 探索未知种族之osg类生物---渲染遍历之认识SceneView
前言 我们在进行osg程序的开发时,最常用到的场景管理方式是“场景节点树”的结构, a 场景树底端的叶节点(osg::Geode)包含了各种需要渲染的几何体的顶点和渲染状态信息: b ...
- DOM节点访问
简而言之,DOM(即文档对象模型)是一种将XML或HTML文档解析成树形节点的方法.通过DOM的方法与属性,我们就可以访问到页面中的任何元素,并进行元素的修改.删除以及添加的操作.同时,DOM也是一套 ...
随机推荐
- 使用DateTimeFormatter替换线程不安全的SimpleDateFormat
原文:https://blog.csdn.net/baofeidyz/article/details/81307478 如何让SimpleDateFormat保持安全运行? 方案一 每次都去new这种 ...
- Linux 本机/异机文件对比
一:提取异步机器文件 #ssh 192.168.1.2 "cat /etc/glance/glance-api.conf | grep -v '#' |grep -v ^$" 二: ...
- JVM元空间深度解析
回顾一下上一次对于这次做的实验的一个背景说明: 这里将借助cglib这个库来完成动态类的创建,为啥要使用它?因为使用简单,二是在程序运行期可以动态的生成类,动态生成类之后生成类的元数据就会落入到元空间 ...
- subprocess模块笔记
subprocess笔记 import subprocess subprocess.call("netstat -ano") #父进程等待子进程完成任务,返回执行结果和结束信息0或 ...
- 突然萌发关于 redis 的想法(1)
本来昨天就打算写这篇了,但是熬到忘了,至于为什么要写这个是因为我昨天在写 redis 的时候突然想到的 注:此篇文章并没有讲解 redis 内部的使用 或 如何使用redis写代码,等等..仅仅只是突 ...
- HDU-1398-Square Coins(母函数)
链接: https://vjudge.net/problem/HDU-1398 题意: People in Silverland use square coins. Not only they hav ...
- Maximum Subarray II
Given an array of integers, find two non-overlapping subarrays which have the largest sum. The numbe ...
- mutt/mail
邮件管理命令 发送和接收邮件
- gdisk分区命令
GPT fdisk(由gdisk.cgdisk.sgdisk和fixparts程序组成)是一组用于Linux.FreeBSD.Mac OS X和Windows的文本模式分区工具.gdisk.cgdis ...
- linux系列(十六):which命令
1.命令格式: which 可执行文件名称 2.命令功能: which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果. 3.命令参数: -n 指定文件名长度,指定的长 ...