一,需求
机器人仿真运动时,将物体放到盒子里,需要对盒子的面 进行检测。
二,效果
三,实现
机器人整体与盒子的五个面求交集,盒子以一个Group 存在与场景中,这样便于移动。碰撞检测时,先获取盒子的包围盒,然后将包围盒裁剪成五个小包围盒 分别于机器人进行检测。
bool RobotWidgget::detectPlane(Model *model,osg::Node* node)
{
bool collision=false;
osg::ComputeBoundsVisitor boundvisitorBox ;
node->accept(boundvisitorBox);
for(int i=1;i<=5;i++){
osg::BoundingBox bb2 = boundvisitorBox.getBoundingBox();
switch (i)
{
case 1:{
bb2.set (bb2.xMin(), bb2.yMax()-2, bb2.zMin(),
bb2.xMax(), bb2.yMax(), bb2.zMax());
break;
}
case 2:{
bb2.set (bb2.xMin(), bb2.yMin(), bb2.zMin(),
bb2.xMax(), bb2.yMin()+2, bb2.zMax());
break;
}
case 3:
{
bb2.set (bb2.xMax()-2, bb2.yMin(), bb2.zMin(),
bb2.xMax(), bb2.yMax(), bb2.zMax());
break;
}
case 4:{
bb2.set (bb2.xMin(), bb2.yMin(), bb2.zMin(),
bb2.xMin()+2, bb2.yMax(), bb2.zMax());
break;
}
case 5:{
bb2.set (bb2.xMin(), bb2.yMin(), bb2.zMin(),
bb2.xMax(), bb2.yMax(), bb2.zMin()+2);
break;
}
default:{
}
}
osg::Polytope poly;
poly.setToBoundingBox(bb2);
osgUtil::PolytopeIntersector* pI =new osgUtil::PolytopeIntersector(poly);
osgUtil::IntersectionVisitor iv(pI);
robotGroup->accept(iv);
if (pI->containsIntersections())
{
model->setCollision(true);
qWarning()<<QStringLiteral("检测到发生碰撞");
collision=true;
break;
}else{
model->setCollision(false);
collision=false;
}
}
return collision;
}