Math 如何在旋转的一对多边形之间投影碰撞?

Math 如何在旋转的一对多边形之间投影碰撞?,math,collision-detection,game-engine,game-physics,pseudocode,Math,Collision Detection,Game Engine,Game Physics,Pseudocode,我试图创建一个物理上合理的2d物理引擎。我读过很多关于碰撞检测、接触解析、互穿、投影、分离轴定理(SAT)方法等的文献 通过SAT投影似乎是处理重叠(“穿透”)物体的一种物理上可行的方法。这适用于没有旋转的对象,但我不知道如何处理旋转 想象两个旋转的多边形将发生碰撞: 我需要了解如何预测接触点以及发生这种情况的时间 任何帮助都将不胜感激 问题是你假设两个物体同时移动,这将是计算精确碰撞点的巨大痛苦 可以按顺序更新每个实体的位置,并相应地应用碰撞: (我知道在这个例子中物体没有旋转,但我现在

我试图创建一个物理上合理的2d物理引擎。我读过很多关于碰撞检测、接触解析、互穿、投影、分离轴定理(SAT)方法等的文献

通过SAT投影似乎是处理重叠(“穿透”)物体的一种物理上可行的方法。这适用于没有旋转的对象,但我不知道如何处理旋转

想象两个旋转的多边形将发生碰撞:

我需要了解如何预测接触点以及发生这种情况的时间


任何帮助都将不胜感激

问题是你假设两个物体同时移动,这将是计算精确碰撞点的巨大痛苦

可以按顺序更新每个实体的位置,并相应地应用碰撞:

(我知道在这个例子中物体没有旋转,但我现在没有办法画旋转的形状,但同样的想法也适用,对不起)

首先,移动矩形,并检查碰撞。 然后,五角大楼移动,并与矩形碰撞,更新其位置。 最后,还检查三角形位置是否发生碰撞并进行更新

关于如何计算碰撞点,可以应用以下方法:

Position calculateValidPosition(Position start, Position end)
    Position middlePoint = (start + end) /2

    if (middlePoint == start || middlePoint == end)
        return start 

    if( isColliding(middlePont) )
        return calculateValidPosition(start, middlePoint)
    else
        return calculate(middlePoint, end)
注意

Position middlePoint = (start + end) /2
不仅计算身体的中间位置,还应计算身体的中间旋转: 如果在运动开始时旋转为X,在运动结束时旋转为Y,则中间点旋转为(X+Y)/2

注意:该算法为优化留下了很大的空间(如使其非递归)


这个解决方案可能看起来不太准确,但只有当物体的速度远远大于物体的大小时,它才会不正确地工作,只有当一个非常小的物体移动得非常快时才会发生这种情况。在其他场景中,结果对于游戏来说“足够好了”。

交叉发布和。您可以尝试Box2D模块。此外,您是否确实需要投影对象的运动。计算机处理速度足够快,您可以在当前时间检查重叠,然后使它们在几乎没有时间内反弹。我认为您现在应该专注于创建一种重叠的方法,而不必担心将来会发生什么。