|
刚刚发现了一个奇怪的问题,对于一个位于(0,0,0)的模型,做一个从(0,0,999)到(0,0,-999)的直线,IntersectVisitor::hits()的返回值为true,表示检测到碰撞点,这很正常。
但是,当我把直线变成(20,20,900)到(20,20,999)——也就是说绝对不可能碰到该模型——IntersectVisitor::hits()的返回值仍然为true。
是哪里发生了错误呢?
代码如下:
osg:: LineSegment* tank2seg = new osg:: LineSegment();
tank2seg->set(osg::Vec3(20.,20.,900.),osg::Vec3(20.,20.,999.));
//垂线从(20,20,999)到(20,20,-999),当前模型位置在(0,0,0),不可能发生碰撞
osgUtil::IntersectVisitor tank2visitor;
tank2visitor.addLineSegment(tank2seg);
m_floor->accept(tank2visitor);
if(tank2visitor.hits())//如果发生碰撞,.hits()在这里似乎永远都是true
{
//奇怪的是以下代码在执行时并不报错,但是不能调试,一调试到下面的语句就程序就死掉了 。至于最后一句修改位置的语句似乎根本不会执行到。
osgUtil::IntersectVisitor::HitList tank2Hits;
tank2Hits = tank2visitor.getHitList(tank2seg);
osgUtil::Hit tank2h;
tank2h = tank2Hits.front();
osg::Vec3 tank2p=tank2h.getWorldIntersectPoint();
pat->setPosition(tank2p);//将模型位置移到碰撞点
} |
|