轴对齐边界框碰撞:哪些边相互碰撞?

3
我正在尝试制作一个类似打砖块的游戏,现在我遇到了与碰撞有关的问题。通常情况下,砖块是矩形(在我的情况下,是正方形),而球是圆形,因此它们都是基于轴对齐边界框进行碰撞检测。
到目前为止,我已经得到了简单的碰撞检测算法,但我需要知道球撞击每个砖块的哪一面。例如: 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,因此我不知道该如何决定。

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


反向轨迹?这实际上是一个“边缘情况”。你需要决定在这里该怎么做。真的:做你认为合适的事情。 - Sani Huttunen
为什么你需要知道哪个边缘?如果你想要正确地反射球,你应该做一些其他的事情,比如点/胶囊碰撞而不是所有4个边缘。 - Tetrad
1个回答

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 | |  |
|  | |  |
+--| |--+
   +-+
在这里,你没有左侧或右侧碰撞。
(您还可以检查其余的条件语句是否正确。)

有点跑题,你是在GPWiki上用Python写的SAT教程吗? - Skurmedel
顺便提一下,如果球始终比砖块小,那么你的碰撞检查有点冗余--在每种情况下,第一和第三个条件中的一个暗示了另一个。 - joriki
测量渗透深度的想法很好,现在它运作得非常好。你提到的第二种情况是不可能的,因为所有的块都比球大。 - José Tomás Tocino
作为一般算法,它是不必要的,而且可能会破坏其他检测。删除它不会有任何损失,反而会增加功能。很高兴这个想法对你有用。 - GManNickG
@Skurmedel:谢谢。:) 真遗憾我从未完成这个系列的写作,只是因为太忙于其他事情了。 - GManNickG
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接