|
本帖最后由 zhangjijiang121 于 2011-11-22 09:31 编辑
在论坛和群里请教了几位高手,他们告诉我用osgUtil:: PolytopeIntersector。我也参照了osg源代码中的Example osgkeyboardmouse 中关于PolytopeIntersector的使用。我是这样实现的。鼠标滑动得到一个起始点sPos和终止点ePos,代码如下- void TestPolytopeIntersector:: GetNodePathByPolytope(osg::Vec2 sPos, osg::Vec2 ePos)
- {
- double mx = std::min(sPos[0],ePos[0]);
- double my = std::min(sPos[1],ePos[1]);
- double mxx = std::max(sPos[0],ePos[0]);
- double myy = std::max(sPos[1],ePos[1]);
- picker = new osgUtil:: PolytopeIntersector( osgUtil::Intersector:: PROJECTION, mx, my, mxx, myy );
-
- osgUtil::IntersectionVisitor iv(picker);
- GetCamera()->GetOSGCamera()->accept(iv);
-
- if (picker->containsIntersections())
- {
- osgUtil:: PolytopeIntersector:: Intersection intersection = picker->getFirstIntersection();
-
- nodePath = intersection.nodePath;
- }
- cout<<"---------------------------"<<endl;
- osg::Node* node;
- osg::NodePath::iterator nIter=nodePath.begin();
- osg::NodePath::iterator nEndIter=nodePath.end();
- for (int i=0;nIter!=nEndIter;++i,++nIter)
- {
- node=(*nIter);
- cout<<"className="<<node->className();
- cout<<" nameMask="<<node->getNodeMask();
- cout<<" name="<<node->getName()<<endl;
- }
- }
复制代码 问题:后来我发现这样框选,选中的好像只是鼠标划过屏幕的斜线切到的场景节点对象,并不是框内的对象。难道我用错了方法吗?
picker = new osgUtil:: PolytopeIntersector( osgUtil::Intersector:: PROJECTION, mx, my, mxx, myy );这一句是否是框选实现方法呢?请大家指点。
|
|