【问题标题】:Axis aligned bounding boxes collision: what sides are colliding轴对齐边界框碰撞:哪些边发生碰撞
【发布时间】:2011-02-05 00:39:01
【问题描述】:

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

到目前为止,我已经掌握了简单的碰撞检测算法,但我需要知道球击中每块砖的哪一面。例如:

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

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,所以我不知道如何决定。

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

【问题讨论】:

  • 反向轨迹?这是字面上的“边缘情况”。你需要决定在这里做什么。不是真的:做你认为合适的事。
  • 为什么需要知道哪个边?如果您尝试对球进行适当的反射,则应该做其他事情,例如点/胶囊碰撞与所有 4 个边缘。

标签: c++ collision-detection aabb


【解决方案1】:

不要只设置为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| +--| |--+ |男 | | | | | | | +--| |--+ +-+

在这里,您没有左右碰撞。

(您可能还需要检查其余条件的正确性。)

【讨论】:

  • 有点跑题了,你是在 GPWiki 上用 Python 写的那个 SAT tut 吗?
  • 我想你会想要最小值,而不是最大值。在拐角处,您要反射球的一侧比另一侧的穿透深度要小。
  • 顺便说一句,如果球总是比砖块小,那么您的碰撞检查就有点多余了——在每种情况下,第一个和第三个条件中的一个都意味着另一个。
  • @Skurmedel:哈,哇,我忘了。是的,我做到了。 @joriki:是的,刚刚添加了评论。
  • 测量穿透深度的想法很棒,现在效果很好。你提到的第二种情况是不可能的,因为所有的积木都比球大。
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2012-09-05
  • 2013-02-18
  • 2013-04-01
  • 2015-02-01
  • 2014-02-04
相关资源
最近更新 更多