zoukankan      html  css  js  c++  java
  • OSG的节点访问

    OSG的节点访问

    转自: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 和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    UML用例图总结
    项目管理心得:一个项目经理的个人体会、经验总结
    UML类图符号简介
    C++中栈和堆上建立对象的区别
    Win32 API
    Python
    remove extra kernel
    Create short cut
    Set Form Position
    Get folder
  • 原文地址:https://www.cnblogs.com/flylong0204/p/4580197.html
Copyright © 2011-2022 走看看