|
最近学习到碰撞检测,遇到一些问题。
模仿教程写了下面一段代码,主要功能是在移动坦克时,不断检测地形的高度,保证坦克随着地形的高度走。
osg:: LineSegment* tankLocationSegment = new osg:: LineSegment();
tankLocationSegment->set( osg::Vec3(tankXPosition, tankYPosition, 999) ,
osg::Vec3(tankXPosition, tankYPosition, -999) );//画垂线
osgUtil::IntersectVisitor findTankElevationVisitor;
findTankElevationVisitor.addLineSegment(tankLocationSegment);
m_floor->accept(findTankElevationVisitor);
if (findTankElevationVisitor.hits())//当检测到碰撞
{
osgUtil::IntersectVisitor::HitList tankElevationLocatorHits;
tankElevationLocatorHits = findTankElevationVisitor.getHitList(tankLocationSegment);
osgUtil::Hit heightTestResults;
heightTestResults = tankElevationLocatorHits.front();
osg::Vec3d terrainHeight = heightTestResults.getWorldIntersectPoint();
//取得碰撞点
osg::Vec3d terrainSlope = heightTestResults.getWorldIntersectNormal();
osg::Vec3 temp = osg::Vec3(newPos._v[0],newPos._v[1],terrainHeight._v[2]);//更改坦克位置的Z值
m_vPosition = temp;
pat->setPosition(m_vPosition);
}
但是还是有一点不太明白,
1。对node::accept的理解还是不太清楚……
2。我试图在其中再增加另一个模型,但是坦克在经过新模型的时候会自动“飞”到新模型的头上。也就是说它自动检测到了垂线跟新模型的交点?如果我只想得到垂线跟地面的交点应该怎么做呢? |
|