分离轴定理 MVT 仅沿一个轴

Separation Axis Theorem MVT along only one axis

我无法计算沿一个轴的 3D 穿透矢量。我已经实施了 SAT 并且它有效。我想计算我需要将第一个盒子与其他盒子偏移多少,以便它始终位于其他盒子之上。有点像用很长的盒子做简单的盒子铸造。

我应该如何着手寻找将一个对象推向指定轴方向的偏移量。

第一部分你应该已经知道了;当您将每个形状投影到每个轴上时,形状 A 应该有一些最小和最大标量值,比方说 AMINAMAX,形状 B 也一样(BMIN / BMAX).

如果对象 显然 在一个轴上碰撞,它们的投影将重叠,这意味着 AMIN < BMIN < AMAX < BMAXBMIN < AMIN < BMAX < AMAX。让我们假设第一个。

AMAX-BMIN 的值是移动任一形状以使其接触所需的距离,被测试的轴为您提供方向。

通常,当一个人遍历所有轴时,一个人跟踪最小值及其对应的轴,并且它成为取消碰撞形状所需的矢量。 (通常称为 'minimum displacement vector' 如果你想 Google 它。)

对于你来说,想要在特定方向上移动它们,你只需存储对应于该特定轴的值,然后它就成为你的位移矢量(然后将其添加到一个形状的位置以将它们分开)。

我强烈推荐谷歌搜索 "minimum displacement vector sat" 并检查前几个链接,特别是这个:http://www.dyn4j.org/2010/01/sat/。它有点密集,但它是我学习 SAT 知识的地方。

编辑还有...我漏掉了一块。这有点粗糙,但是如果你想沿着一个轴(在你的例子中是垂直的)移动形状,基于从另一个轴(底盒长边的法线)获得的位移矢量,你需要将位移矢量投影到所需的(归一化的)轴上(使用点积)以获得适当的距离,然后与所需的轴组合。