osgUtil.LineSegmentIntersector
类实现了一个线段与场景图物体相交的算法。它可以用于选择、拾取、碰撞检测等。
LineSegmentIntersector(LineSegment& ls, IntersectionVisitor::ReadCallback* cb = 0);
构造一个 LineSegmentIntersector
对象并传入线段 ls
,可选参数 cb
是一个用户定义的回调函数,在场景图中遍历时提供其他的控制或信息。如果不需要,请传入 0
。
void setEnd(osg::Vec3 end);
设置线段的结束点。如果不设置,将使用初始构造函数中传入的 LineSegment
对象的结束点作为默认值。
void setIntersectionLimit(unsigned int limit);
设置最大可返回的相交结果数。默认情况下为 1。设置为 0 将返回所有相交结果。
bool intersect(osg::Node* node, osgUtil::IntersectionVisitor& iv);
计算线段与场景图 node
的相交情况,并返回一个 bool
值表示是否有相交。
Intersection getFirstIntersection();
获取第一个相交结果。
const Intersection& getIntersection(unsigned int i) const;
获取第 i 个相交结果。
unsigned int getNumIntersections() const;
获取相交结果数量。
osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
// 构造线段
osg::Vec3 start(0.0f, 0.0f, 0.0f);
osg::Vec3 end(10.0f, 10.0f, 10.0f);
osg::ref_ptr<osg::LineSegment> ls = new osg::LineSegment(start, end);
// 构造相交对象
osgUtil::LineSegmentIntersector intersector(ls);
// 构造遍历器
osgUtil::IntersectionVisitor iv(&intersector);
// 开始遍历
node->accept(iv);
// 获取相交结果
if (intersector.getNumIntersections() > 0)
{
osgUtil::Intersection intersection = intersector.getFirstIntersection();
std::cout << "Intersection point: " << intersection.getWorldIntersectPoint() << std::endl;
}
else
{
std::cout << "No intersection!" << std::endl;
}