我在沿一个轴计算 3D 穿透向量时遇到问题。我已经实现了 SAT 并且它有效。我想计算我需要将第一个框与其他框偏移多少,以便它始终位于其他框之上。用很长的盒子做简单的盒子。
我应该如何继续查找将一个对象推向指定轴方向的偏移量。
最佳答案
第一部分你应该已经知道了;当您将每个形状投影到每个轴上时,形状 A 应该有一些最小和最大标量值,比如说 AMIN
和 AMAX
,形状 B ( BMIN
/BMAX
)也是如此。
如果对象显然在轴上碰撞,则它们的投影将重叠,这意味着 AMIN < BMIN < AMAX < BMAX
或 BMIN < AMIN < BMAX < AMAX
。让我们假设第一个。AMAX-BMIN
的值是移动任一形状以使其接触所需的距离,被测试的轴为您提供方向。
通常,当遍历所有轴时,会跟踪最小值及其对应的轴,这将成为消除形状碰撞所需的向量。 (如果你想用谷歌搜索它,通常称为“最小位移向量”。)
对您来说,想要在特定方向上移动它们,您只需存储与该特定轴对应的值,这将成为您的位移向量(然后将其添加到一个形状的位置以将它们分开)。
我强烈建议谷歌搜索“最小位移向量 sat”并查看前几个链接,特别是这个: http://www.dyn4j.org/2010/01/sat/ 。它有点密集,但它是我学习关于 SAT 的所有知识的地方。
编辑而且......我错过了一块。这有点粗糙,但是如果您想基于从另一个轴(底部框长边的法线)获得的位移矢量沿一个轴(在您的示例中为垂直)移动形状,您需要将位移向量投影到所需的(归一化)轴(使用点积)以获得适当的距离,然后与所需的轴结合。