在 Box2D Lite 中,我不知道 "Box A faces" 和 "Box B faces" 检查的用途

In Box2D Lite, I can't figure out what the "Box A faces" and "Box B faces" checks are for

我正在研究“Box2D Lite" (zip”的代码,以详细了解其实现方式。很明显,collide.cpp 中的 Collide 函数实现了分离轴定理 (SAT) ,但在开始时执行的检查使用智能数学公式在两个框之间没有接触时(早期)得出结论。公式暗示转置旋转矩阵、点积、位置增量,没有太多解释或任何线索。

// Box A faces
const Vec2 faceA = Abs(dA) - hA - absC * hB;
if (faceA.x > 0.0f || faceA.y > 0.0f)
    return 0;

// Box B faces
const Vec2 faceB = Abs(dB) - absCT * hA - hB;
if (faceB.x > 0.0f || faceB.y > 0.0f)
    return 0;

这些 "magic" 公式构成了矩形分离轴定理的本质。

由于 Box2D Lite 只支持盒子,每个物体只需要测试两个轴(cond. [1])。由于矩形形状(cond. [2]),这些轴是主体的 local X 和 Y 轴。简单的方法是将一个物体投影到另一个物体面部的 space 法线上,但上述两种情况都允许我们通过相对于物体进行投影来简化体轴投影,并且不是全局原点,如下:

faceA = Abs(dA) - hA - absC * hB

让我们来看看上面的公式向我们展示了什么。

faceA 是两个物体 相对于 到 A 的分离。faceA.xfaceA.y 包含在法线上的分离分别是横向和纵向面。请注意,所有计算都是相对于 A 完成的(参见 [2])。

dA 是相对于 A 的位置增量向量 relative。我们取绝对值,因为我们只需要 A 和 B 最近的面之间的距离在那个轴上。

hA 包含 A 在相对于 A 的 X 轴和 Y 轴上的范围。

hB 包含 B 在 X 轴和 Y 轴上相对于 B 的范围。我们必须将此向量转换为 A 的 space,这就是我们将 hB 转换为 absC 的原因。

absC 等于 abs(rotAT * rotB)。通常,如果有两个矩阵m1m2和一个向量v(m1 * m2) * v等于m1 * (m2 * v),即乘法矩阵变换以 reverse 它们的乘法顺序完成。请注意 m1 * m2 而不是 等于 m2 * m1。我们再次取绝对值以去除所有负号以检索最近的人脸。

由于 [2],此方法仅适用于直角四边形(矩形)。