我正在尝试在自己制作的2D游戏中实现碰撞系统。分离轴定理(如metanet的碰撞教程所述)似乎是处理碰撞检测的一种有效且健壮的方法,但我不太喜欢它们使用的碰撞响应方法。通过沿最小重叠轴盲目移动,该算法仅忽略了运动对象的先前位置,这意味着它在进入静止物体并随后反弹时不会与静止物体发生太多碰撞。
这是一个很重要的情况的示例:

根据上述SAT方法,该矩形将简单地从垂直于其斜边的三角形中弹出:

但是,实际上,矩形应该停在三角形的右下角,因为如果矩形沿着其位移矢量连续移动,那将是第一个碰撞点:

现在,这在游戏过程中可能实际上并不重要,但是我很想知道是否存在一种以这种方式有效且普遍地获得准确位移的方法。在过去的几天里,我一直在为之绞尽脑汁,我还不想放弃!
(从StackOverflow交叉发布,希望这不违反规则!)
步骤1:对于每个多边形,沿着该多边形在垂直于运动矢量的线上的投影找到两个最远的点。
步骤2:沿连接这些点的直线划分每个多边形。沿运动矢量面向另一个多边形的多边形的一半是“前壳”。这是多边形中可能发生碰撞的唯一部分。
第三步:从每个多边形的“前向船体”上的每个点沿着运动矢量向对角线投影一个矢量,并检查它是否与对向多边形的“前向船体”的每个边缘相交。(可能很慢,但是现在计算机非常快-对吗?)(对倾斜的箭头表示抱歉。所有箭头应平行。)
步骤4:取最短的向量。这是确切的碰撞距离。
步骤5:瞧!
