首页 > 代码库 > OSG 中 相交測试 模块 工作流程及原理
OSG 中 相交測试 模块 工作流程及原理
主要涉及三个类:
1. osgUtil::PolytopeIntersector // 详细不同算法实现类
2. osgUtil::IntersectionVisitor //用来遍历节点树的每一个节点
3.osg::Node * mNode; // 你要做相交測试的根节点
先看使用方法:
osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector(osgUtil::Intersector::WINDOW, xMin, yMin, xMax, yMax); intersector->setIntersectionLimit(osgUtil::Intersector::LIMIT_ONE_PER_DRAWABLE); osgUtil::IntersectionVisitor iv( intersector.get() ); mRootNode->accept(iv);
关系
osgUtil::IntersectionVisitor 中含有一个osgUtil::PolytopeIntersector的实例化对象。功能是主要负责遍历每一个节点,然后把每一个节点的信息传入到 osgUtil::PolytopeIntersector 中
(含有一系列的apply方法)如:
void IntersectionVisitor::apply(osg::Group& group) { if (!enter(group)) return; traverse(group); leave(); } void IntersectionVisitor::apply(osg::Geode& geode) { // OSG_NOTICE<<"apply(Geode&)"<<std::endl; if (!enter(geode)) return; // OSG_NOTICE<<"inside apply(Geode&)"<<std::endl; for(unsigned int i=0; i<geode.getNumDrawables(); ++i) { intersect( geode.getDrawable(i) ); } leave(); }
当中enter、leave 、intersect 函数中又会反过来调用 osgUtil::PolytopeIntersector 中对应的方法,如:
inline bool enter(const osg::Node& node) { return _intersectorStack.empty() ? false : _intersectorStack.back()->enter(node); } inline void leave() { _intersectorStack.back()->leave(); } inline void intersect(osg::Drawable* drawable) { _intersectorStack.back()->intersect(*this, drawable); } inline void push_clone() { _intersectorStack.push_back ( _intersectorStack.front()->clone(*this) ); } inline void pop_clone() { if (_intersectorStack.size()>=2) _intersectorStack.pop_back(); }
这样差点儿全部的算法都集中到了 osgUtil::PolytopeIntersector 中 intersect 方法中
void PolytopeIntersector::intersect(osgUtil::IntersectionVisitor& iv, osg::Drawable* drawable)
假设想写自己的相交測试算法,也基本上仅仅需重写intersect 函数就可以。
OSG 中 相交測试 模块 工作流程及原理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。