天天看點

凸多邊形碰撞檢測算法——分離坐标軸方法

        直覺來看,如果兩個凸多面體不相交,那麼必定存在一個空間平面,使得這兩個多面體分别位于平面兩側。如果找不到這樣的平面,那麼可以判定其相交。這個情況等價于:如果能找到垂直于某個平面的直線,使得多面體在這條直線上的投影不相交,那麼就可以判定多面體不相交;否則就相交。這條直線,就是分離軸。一般而言,檢驗多面體在直線上的投影,會比檢驗多面體是否位于平面兩側更加友善。

        SAT是一種檢測凸多邊形相交的算法,他的内容是,如果能找到一條軸,使得兩個物體在該軸上的投影互不重疊,那麼這兩個物體就是不相交的。

        原理很容易了解,這個算法的關鍵在于,如何找到這條軸。 在2D的情況下,兩個多邊形每條邊的法向量包含了這條軸的所有可能性。是以我們隻需要枚舉兩個多邊形的每條邊的法向量即可。

        2D向量的法向量非常好求 向量(X,Y)的法向量為(Y,-X)或(-Y,X)(設待求斜率為k,根據垂直的向量斜率之積等于-1,Y/X*k= - 1  =>  k=  - X/Y),這個算法不需要考慮方向,是以任選一種即可。然後分别計算這兩個多邊形的所有點在此向量上的投影,并求出最大最小區域,如果沒有重合,那麼直接确定這兩個多邊形不重合,如果有重疊,那麼繼續判斷下一條邊的法向量。

繼續閱讀