分离轴定理和Python

Bru*_*btu 4 python math pygame physics

这就是我目前正在做的事情:

创建垂直于2个矩形的4个边的4轴.由于它们是矩形,因此我不需要为每条边生成轴(法线).

然后我循环我的4轴.

因此,对于每个轴:我将矩形的每个角投影到轴上.有两个包含这些投影的列表(数组).每个矩形一个.然后我得到每个投影和轴的点积.这将返回一个标量值,可用于确定最小值和最大值.

现在,2个列表包含标量而不是向量.我对列表进行排序,以便我可以轻松选择最小值和最大值.如果框B的最小值=框A的最大值或框B的最大值<=框A的最小值,则该轴上没有碰撞且对象之间没有碰撞.

此时函数完成并且循环中断.

如果所有轴都没有满足这些条件,那么我们就会发生碰撞

我希望这是正确的做法.

python代码本身可以在这里找到http://pastebin.com/vNFP3mAb

另外:http: //www.gamedev.net/page/reference/index.html/_/reference/programming/game-programming/collision-detection/2d-rotated-rectangle-collision-r2604

我遇到的问题是上面的代码不起作用.即使没有碰撞,它也始终检测到碰撞.我输入的内容正是代码所做的.如果我遗漏任何步骤或者只是不了解SAT如何运作,请告诉我.

har*_*ath 5

一般来说,有必要执行问题中概述的步骤,以确定矩形是否"碰撞"(相交),注意到OP一旦分离轴我们就可以破坏(带有非交叉的结论)找到了.

从为早期出口提供机会的意义上讲,有几种简单的"优化"方法.这些实际价值取决于被检查矩形的分布,但两者都很容易纳入现有框架.

(1)边界圆检查

证明非交叉的一种快速方法是通过显示两个矩形的边界圆不相交.矩形的边界圆共享其中心,即任一对角线的中点,并且其直径等于任一对角线的长度.如果两个圆心之间的距离超过两个圆的半径之和,则圆不相交.因此矩形也不能相交.如果目的是找到分离轴,我们还没有完成.但是,如果我们只想知道矩形是否"碰撞",则可以提前退出.

(2)另一个内部的一个矩形的顶点

在与另一个矩形的边缘平行的轴上投影一个矩形的顶点提供了足够的信息来检测该顶点何时在另一个矩形内.当后一个矩形已经平移并且未旋转到原点(边缘平行于普通轴)时,这种检查特别容易.如果发生一个矩形的顶点在另一个矩形的内部,则矩形明显相交.当然,这是交叉的充分条件,而不是必要条件.但它允许早期退出并得到交叉点的结论(当然,没有找到分离轴,因为没有分离轴).