返回

浅析碰撞检测:Separating Axis Theorem

前端

SAT 的基本原理

SAT 的核心思想是找到将两个多边形分开的轴。如果沿着该轴的投影不重叠,则这两个多边形不会发生碰撞。对于两个多边形,我们可以找到很多条分开的轴。这些轴可以是多边形的边,也可以是多边形的对角线。

为了找到将两个多边形分开的轴,我们可以使用以下步骤:

  1. 找到两个多边形的所有边和对角线。
  2. 计算每个边或对角线的方向向量。
  3. 将两个多边形的所有方向向量放入一个集合中。
  4. 遍历集合中的每个方向向量,并计算两个多边形沿着该方向的投影。
  5. 如果两个多边形的投影不重叠,则该方向向量就是将两个多边形分开的轴。

SAT 的工作原理

为了更好地理解 SAT 的工作原理,我们来看一个简单的例子。如图 1 所示,有两个多边形 A 和 B。我们要判断这两个多边形是否发生碰撞。

图 1:两个多边形 A 和 B

首先,我们需要找到两个多边形的所有边和对角线。如图 2 所示,多边形 A 有 4 条边和 2 条对角线,多边形 B 有 3 条边和 1 条对角线。

图 2:两个多边形 A 和 B 的边和对角线

接下来,我们需要计算每个边或对角线的方向向量。如图 3 所示,我们可以用箭头表示每个边或对角线的方向向量。

图 3:两个多边形 A 和 B 的边和对角线的方向向量

然后,我们将两个多边形的所有方向向量放入一个集合中。在这个例子中,集合中有 10 个方向向量。

最后,我们需要遍历集合中的每个方向向量,并计算两个多边形沿着该方向的投影。如图 4 所示,我们可以用线段表示两个多边形沿着每个方向向量的投影。

图 4:两个多边形 A 和 B 沿着每个方向向量的投影

从图 4 中我们可以看到,有两个方向向量将两个多边形分开了。这两个方向向量分别是方向向量 1 和方向向量 3。这意味着,如果两个多边形沿着方向向量 1 或方向向量 3 移动,它们就不会发生碰撞。

SAT 的优缺点

SAT 是一种检测两个多边形是否发生碰撞的有效方法。它快速且易于实现。但是,SAT 也有以下缺点:

  • SAT 只能检测多边形的碰撞,不能检测其他形状的碰撞。
  • SAT 不能检测非凸多边形的碰撞。
  • SAT 不能检测旋转多边形的碰撞。

结论

SAT 是一种检测两个多边形是否发生碰撞的有效方法。它快速且易于实现。但是,SAT 也有以下缺点:

  • SAT 只能检测多边形的碰撞,不能检测其他形状的碰撞。
  • SAT 不能检测非凸多边形的碰撞。
  • SAT 不能检测旋转多边形的碰撞。

尽管如此,SAT 仍然是 2D 游戏中碰撞检测的常用方法。