[osg]节点遍历nodevisitor浅析

Posted 南水之源

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[osg]节点遍历nodevisitor浅析相关的知识,希望对你有一定的参考价值。

参考:https://www.cnblogs.com/hzhg/archive/2010/12/17/1908764.html

 

OSG中节点的访问使用的是一种访问器模式。
一个典型的访问器涉及抽象访问者角色(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);
      }

 


  

以上是关于[osg]节点遍历nodevisitor浅析的主要内容,如果未能解决你的问题,请参考以下文章

OSG节点更新与事件回调

[原][OSG]深入osg函数----SceneView::cull 函数

OSG 中 相交測试 模块 工作流程及原理

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

OSG:第一章-1.1-节点类型

LinkedList源码浅析(jdk1.8)