轴对齐边界框碰撞:哪些边碰撞

时间:2011-02-05 00:39:02

标签: c++ collision-detection aabb

我正在尝试制作类似arkanoid的游戏,现在我遇到了碰撞问题。像往常一样,砖是矩形(在我的例子中是正方形),球是圆形,所以它都是关于轴对齐的边界框。

到目前为止,我已经得到了琐碎的碰撞检测算法,但我需要知道球击中每块砖的哪一侧。例如: Collision cases

到目前为止,我有一个算法可以检查每一方是否都被击中:

up = left = right = down = 0;

if(mouse.left < brick.left && brick.left < mouse.right && mouse.right < brick.right){   
    left = 1;
}

if(brick.left < mouse.left && mouse.left < brick.right && brick.right < mouse.right){
    right = 1;
}

if(mouse.top < brick.top && brick.top < mouse.bottom && mouse.bottom < brick.bottom){
    up = 1;
}

if(brick .top < mouse.top && mouse.top < brick.bottom && brick.bottom < mouse.bottom){
    down = 1;
}

但是在靠近角落的碰撞中,就像图像中的第三个碰撞一样,两个标志(例如左下)被设置为1,所以我不知道如何决定。

在这些情况下通常会做什么?

1 个答案:

答案 0 :(得分:2)

不要只将其设置为1,将其设置为穿透深度:

// why is it named mouse?
if(mouse.left < brick.left && brick.left < mouse.right &&
    mouse.right < brick.right)
{
    left = mouse.right - brick.left;
}

// and so on...

然后,当你完成后,你可以选择最低限度为主要方面。


顺便说一下,我认为你不想要第三个条件。想象一下这样的案例:

   +-+
   |B|
+--| |--+
|M | |  |
|  | |  |
+--| |--+
   +-+

在这里,你没有左碰撞或右碰撞。

(您可能还想查看剩余的条件是否正确。)