我实现了SAT算法,它能够检测碰撞并返回最短的“拉出”向量。在下面的截图中,这个向量由黄色(P和Q)决定。如果我把Q向量加到B体的位置上,那么就不会发生碰撞。
然而,我意识到我不能用这个向量来解决碰撞,因为身体可以从完全不同的方向到达。我宁愿用矢量Z的方向拉出B体。
我已经试着用矢量Z确定的轴来计算额外的重叠,但是在这种情况下,我把物体B拉得太远了。
通过继续使用SAT算法,能解决这个问题吗?
发布于 2021-02-22 05:45:08
我想我只使用SAT算法来回答我的问题。当然,我完全忽略了隧道效应。
假设我们有A和B两种形状,B型穿透A型,我们知道B型的旧位置(碰撞前)。我们已经做了一些碰撞测试(SAT),我们知道A和B形状之间的碰撞是存在的。让我们画一个由旧的和新的B形位置决定的轴P。
现在将A和B形状的所有顶点投影在轴P上。
现在,我们可以用公式Z=单位(P)* (Amax )计算的矢量Z来移动B形。
其中单位( P )是轴P的单位向量。
碰撞已经消除,因为现在我们至少有一个分离轴。然而,我们还没有做好准备。B形离A太远了,我们需要在轴上把B形扣成A形。
让我们重复SAT测试,但这一次我们正在寻找差距。
我们在Q轴上发现了一个间隙,可以很容易地计算出这个间隙的长度。我们也知道P和q之间的角度,我们可以计算出snap矢量S。
现在我们可以添加向量Z(初始拉出)和S (snap)。
发布于 2021-02-18 14:59:24
很可能没有你期望的那么优雅,不幸的是。
SAT主要用于两个凸形状之间的碰撞检测,而不是碰撞响应。所以你已经下了点兔子洞了。您可以实现一个扫描测试(在本例中为矩形-矩形-扫描测试),以帮助您确定冲突的最佳响应。即碰撞的点、方向和持续时间。
就像这里显示的一样- http://supertux.lethargik.org/wiki/Sweep_碰撞_算法
我希望我能给你一个更好的答案,尽管如此,使用SAT的荣誉!)
https://gamedev.stackexchange.com/questions/189267
复制相似问题