SAT碰撞检测 - 角落修复

时间:2017-02-11 23:47:28

标签: algorithm collision-detection collision game-physics separating-axis-theorem

我正在构建游戏,而我目前正在研究物理。

我使用 SAT算法来检测冲突。角色(AxisAlignedBoundingBox)与某些矩形(带旋转)之间的碰撞

在特定情况下,一切正常,除了角落附近的碰撞。 (这是一个众所周知的问题,但我没有找到任何好的解决方案。)

enter image description here示例1 上,在第二个场景中角色应该向上移动(留在障碍物上)。
碰巧向左移动。
示例2 上,在第二个场景中,角色不应该起来。有时会得到。

我知道为什么会这样,因为 dx dy 最小翻译矢量并不总是想要的

这个问题有几个解决方案,但不是一个非常好的解决方案(在解决问题而不是创建其他问题方面!)。 我甚至愿意从一开始就使用完全不同的算法。

请给我一个关于比SAT更好的算法的提示,或者一些解决方法 谢谢!

1 个答案:

答案 0 :(得分:0)

一张图片值得多说。

图像有两个框来测试红色和黑色..

enter image description here

请注意黑盒子的中心在刚触碰时总是位于较暗的红色框上。

您可以通过将一个框的大小增加另一个框的大小来简化任何AABB测试。只要你通过他们的中心来控制盒子的位置,一切都很好。

// x,y are box centers
var bBox = { w : 100 , h : 50, x : ?, y ? };  // black
var rBox = { w : 200 , h : 200, x : ?, y ? };  // red

测试bBox是否在rBox内

if(bBox.x > rBox.x - (rBox.w + bBox.w)/2 &&
     bBox.x < rBox.x + (rBox.w + bBox.w)/2 &&
     bBox.y > rBox.y - (rBox.h + bBox.h)/2 &&
     bBox.y < rBox.y + (rBox.h + bBox.h)/2)
    // boxes are touching.
}

如果盒子移动也可以。您只需测试bBox运动的矢量是否与rBox的4个边相交。