查看: 1238|回复: 3

关于碰撞检测

[复制链接]

该用户从未签到

发表于 2010-5-29 15:33:58 | 显示全部楼层 |阅读模式
最近学习到碰撞检测,遇到一些问题。

模仿教程写了下面一段代码,主要功能是在移动坦克时,不断检测地形的高度,保证坦克随着地形的高度走。

  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。我试图在其中再增加另一个模型,但是坦克在经过新模型的时候会自动“飞”到新模型的头上。也就是说它自动检测到了垂线跟新模型的交点?如果我只想得到垂线跟地面的交点应该怎么做呢?

该用户从未签到

发表于 2010-5-29 16:08:24 | 显示全部楼层
调用accept就是对节点启用访问器~~~不清楚您是怎么加的,,你只对地形模型进行碰撞检测应该不会出现这种情况的~~~~·

该用户从未签到

 楼主| 发表于 2010-5-29 17:11:06 | 显示全部楼层
调用accept就是对节点启用访问器~~~不清楚您是怎么加的,,你只对地形模型进行碰撞检测应该不会出现这种情况的~~~~·
FlySky 发表于 2010-5-29 16:08


m_floor->accept(findTankElevationVisitor);
这句话的的意思是不是只针对m_floor节点启用访问器?是不是就是所谓的“初始化IntersectVisitor实例,使其从场景图形中适当的节点开始遍历。”?——那这样的话它岂不也会遍历到其他的节点并且检测到碰撞?

该用户从未签到

发表于 2010-5-30 00:41:28 | 显示全部楼层
遍历器就是这样启用的~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表