博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OSG的节点访问
阅读量:7020 次
发布时间:2019-06-28

本文共 1246 字,大约阅读时间需要 4 分钟。

转自:http://www.cnblogs.com/kanego/archive/2011/09/27/2193484.html

SG中节点的访问使用的是一种访问器模式。 

  一个典型的访问器涉及抽象访问者角色(Visitor), 具体访问者(Concrete Visitor), 节点角色(Node)。 

  OSG中访问者角色为NodeVisitor类,其基本结构如下: 

  NodeVisitor(TraversalMode tm)    //构造函数,TraversalMode为节点树的遍历方式 

  //TRAVERSE_NONE, 仅当前节点 

  //TRAVERSE_PARENTS, 向当前节点的父节点遍历

   //TRAVERSE_ALL_CHILDREN, 向子节点遍历 

  void traverse(Node& node)  //向下一个需要访问的节点推进 

  void apply(Node& node)   //虚函数,访问各种节点类型,并执行访问器中的自定义操作 

  void apply(Group& node) 

  void apply(Geode& node) 

  …………

 

  NodeVisitor 只是访问器角色的抽象接口,要使用访问器访问节点并执行自定义操作时,需要继承并重写 

  apply(……)函数实现自定义功能。osg::Node类中的访问接口为 void accept(NodeVisitor& nv)。对节点 

  的访问从节点接受一个访问器开始,将一个具体的访问器对象传递给节点,节点反过来执行访问器的apply(...) 

  函数,并将自己传入访问器。可如下简单表示: 

  void Node::accept(NodeVisitor& nv) 

  {

 

      nv.apply(*ths) ; 

  } 

  遍历节点树: 

  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); 

  } 

 

本文版权归作者 kanego 和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

转载于:https://www.cnblogs.com/flylong0204/p/4580197.html

你可能感兴趣的文章
HDU 2196 Computer【树形DP】
查看>>
js 给链接 url或href或js、css、图片等解决浏览器缓存
查看>>
ife2015-task2-4-5
查看>>
发布的时候Archive灰色
查看>>
html 锚点的使用
查看>>
052(一)
查看>>
grafana 5.0+ templating变化
查看>>
Oracle中synonym和index
查看>>
读汤姆大叔的深入理解javascrip 系列2
查看>>
安装补丁后,发生“无法在Web服务器上启动调试,与Web服务器通信时出现身份验证错误”!...
查看>>
linux系统光盘开机自动挂载-配置本地yum源
查看>>
如何高效学习和工作(撸代码)
查看>>
坐标系与基本图元(5)
查看>>
IE8崩溃在CElement::GetUpdatedLayoutWithContext
查看>>
用PHP实现单向链表
查看>>
PIL中分离通道发生“AttributeError: 'NoneType' object has no attribute 'bands'”
查看>>
通过rails console执行sql语句
查看>>
调试+运行
查看>>
you-get下载视频
查看>>
centos 安装pecl
查看>>