天天看点

凸多边形碰撞检测算法——分离坐标轴方法

        直观来看,如果两个凸多面体不相交,那么必定存在一个空间平面,使得这两个多面体分别位于平面两侧。如果找不到这样的平面,那么可以判定其相交。这个情况等价于:如果能找到垂直于某个平面的直线,使得多面体在这条直线上的投影不相交,那么就可以判定多面体不相交;否则就相交。这条直线,就是分离轴。一般而言,检验多面体在直线上的投影,会比检验多面体是否位于平面两侧更加方便。

        SAT是一种检测凸多边形相交的算法,他的内容是,如果能找到一条轴,使得两个物体在该轴上的投影互不重叠,那么这两个物体就是不相交的。

        原理很容易理解,这个算法的关键在于,如何找到这条轴。 在2D的情况下,两个多边形每条边的法向量包含了这条轴的所有可能性。所以我们只需要枚举两个多边形的每条边的法向量即可。

        2D向量的法向量非常好求 向量(X,Y)的法向量为(Y,-X)或(-Y,X)(设待求斜率为k,根据垂直的向量斜率之积等于-1,Y/X*k= - 1  =>  k=  - X/Y),这个算法不需要考虑方向,所以任选一种即可。然后分别计算这两个多边形的所有点在此向量上的投影,并求出最大最小区域,如果没有重合,那么直接确定这两个多边形不重合,如果有重叠,那么继续判断下一条边的法向量。

继续阅读