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

主要涉及三个类:

1. osgUtil::PolytopeIntersector // 具体不同算法实现类

2. osgUtil::IntersectionVisitor //用来遍历节点树的每个节点

3.osg::Node * mNode;  //  你要做相交测试的根节点


先看用法: 

 

[cpp]  view plain copy print ?
  1. osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector(osgUtil::Intersector::WINDOW, xMin, yMin, xMax, yMax);   
  2. intersector->setIntersectionLimit(osgUtil::Intersector::LIMIT_ONE_PER_DRAWABLE);  
  3. osgUtil::IntersectionVisitor iv( intersector.get() );  
  4.   
  5. mRootNode->accept(iv);  

 

关系

osgUtil::IntersectionVisitor 中含有一个osgUtil::PolytopeIntersector的实例化对象,功能是主要负责遍历每个节点,然后把每个节点的信息传入到  osgUtil::PolytopeIntersector  中

(含有一系列的apply方法)如:

[cpp]  view plain copy print ?
  1. void IntersectionVisitor::apply(osg::Group& group)  
  2. {  
  3.     if (!enter(group)) return;  
  4.   
  5.     traverse(group);  
  6.   
  7.     leave();  
  8. }  
  9.   
  10. void IntersectionVisitor::apply(osg::Geode& geode)  
  11. {  
  12.     // OSG_NOTICE<<"apply(Geode&)"<<std::endl;  
  13.   
  14.     if (!enter(geode)) return;  
  15.   
  16.     // OSG_NOTICE<<"inside apply(Geode&)"<<std::endl;  
  17.   
  18.     for(unsigned int i=0; i<geode.getNumDrawables(); ++i)  
  19.     {  
  20.         intersect( geode.getDrawable(i) );  
  21.     }  
  22.   
  23.     leave();  
  24. }  

其中enter、leave 、intersect 函数中又会反过来调用 osgUtil::PolytopeIntersector 中相应的方法,如:

[cpp]  view plain copy print ?
  1. inline bool enter(const osg::Node& node) { return _intersectorStack.empty() ? false : _intersectorStack.back()->enter(node); }  
  2.        inline void leave() { _intersectorStack.back()->leave(); }  
  3.        inline void intersect(osg::Drawable* drawable) { _intersectorStack.back()->intersect(*this, drawable); }  
  4.        inline void push_clone() { _intersectorStack.push_back ( _intersectorStack.front()->clone(*this) ); }  
  5.        inline void pop_clone() { if (_intersectorStack.size()>=2) _intersectorStack.pop_back(); }  


这样几乎所有的算法都集中到了 osgUtil::PolytopeIntersector 中 intersect 方法中

[cpp]  view plain copy print ?
  1. void PolytopeIntersector::intersect(osgUtil::IntersectionVisitor& iv, osg::Drawable* drawable)  

如果想写自己的相交测试算法,也基本上只需重写intersect 函数即可。

你可能感兴趣的:(OSG 中 相交测试 模块 工作流程及原理)