osgUtil.RayIntersector
是OpenSceneGraph中的一个实用工具,它用于检测射线与场景中的几何体之间的交点,以实现鼠标拾取等功能。
RayIntersector(osg::PrimitiveSet::Mode mode=UNSPECIFIED, unsigned int index=0);
构造函数中的参数mode
和index
指定了需要检测的几何体类型和索引,若未指定则默认为UNSPECIFIED
和0。
void setPrimitiveIntersector(osgUtil::PrimitiveIntersector* pi);
将需要检测的几何体设置为PrimitiveIntersector
对象。
void setCoordinateFrame(CoordinateFrame cf);
设置该射线与目标几何体进行相交检测时使用的坐标系,可选值有UNSIGNED_MODELVIEW
,MODELVIEW
,PROJECTION
等。
void intersect(osgUtil::IntersectionVisitor& iv, osg::Drawable* drawable);
该方法用来计算指定几何体与射线的交点,结果存储在交点列表中。iv
为计算交点时的访问者对象。
osg::Node* getDrawable(int idx=0);
获取索引值为idx
的几何体的节点对象。
float getRatio() const;
获取该射线与目标几何体的交点位置。
osg::ref_ptr<osgUtil::RayIntersector> intersector =
new osgUtil::RayIntersector(osgUtil::Intersector::WINDOW, mouse_x, mouse_y);
osgUtil::IntersectionVisitor iv(intersector.get());
scene_root->accept(iv);
if (intersector->containsIntersections())
{
osgUtil::RayIntersector::Intersection intersection =
*(intersector->getIntersectionList().begin());
osg::Vec3 intersection_point = intersection.getWorldIntersectPoint();
handlePick(intersection_point);
}
上面是一个简单的射线拾取的实现,首先构造一个RayIntersector
,并指定检测的坐标系为窗口坐标系,然后使用其计算交点,并获取交点的世界坐标位置。最后调用 handlePick()
方法处理选中物体的逻辑。