-1

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

我正在使用SAT 算法来检测碰撞。碰撞发生在字符(AxisAlignedBoundingBox)和一些矩形(带旋转)之间。

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

在此处输入图像描述示例 1中,在第二个场景中,角色应该向上移动(停留在障碍物上)。
它恰好向左移动。
示例 2中,在第二个场景中角色不应该起床。有时会得到。

我知道为什么会这样,因为dxdyMinimum Translation Vector 并不总是想要的

这个问题有几种解决方案,但不是一个很好的解决方案(就解决问题而不是创造其他问题而言!)。我什至愿意从一开始就使用完全不同的算法。

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

4

1 回答 1

0

一张照片胜过许多话。

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

在此处输入图像描述

请注意,当它刚刚接触时,黑框的中心始终位于较暗的红色框上。

您可以通过将一个框的大小增加另一个框的大小来简化任何 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 个边中的任何一个相交。

于 2017-02-14T03:00:25.677 回答