多邊形碰撞 SAT方法

2022-05-17 15:42:09 字數 2197 閱讀 7672

檢測凸多邊形碰撞的一種簡單的方法是sat(separating axis theorem),即分離軸定理。

原理:將多邊形投影到一條向量上,看這兩個多邊形的投影是否重疊。如果不重疊,則認為這兩個多邊形是分離的,否則找下一條向量來繼續投影。我們不需要比較很多條向量,因為已經在數學上證明,多邊形每條邊的垂直向量就是我們需要的向量。

1.aabb

讓我們首先以aabb開始(aabb是一種兩邊分別平行於x-y軸的矩形)

判斷兩個aabb是否碰撞,我們只需要投影兩次,分別是投影在平行於x軸和y軸的向量上

由上圖可以看見,因為在y軸方向的投影是分離的,因此可以直接得出結論,即這兩個aabb是分離的。

function

aabbvsaabb(aabb1, aabb2)

效果:---點選執行---(點選產生aabb,碰撞的變紅,否則變黃)

2.圓

圓的碰撞檢測也能用sat,就是要把兩個圓投影在兩個圓心連線的向量上。比較半徑和與圓心距離,如果半徑和大於圓心距離則碰撞。

**:注:通常為了優化,都是用平方而不是開方(sqrt好慢的)

function

circlevscircle(c1, c2)

效果:---點選執行---(點選產生圓)

3.多邊形

(1)找出兩個多邊形所有邊的垂直向量;

(2)將兩個多邊形投影到垂直向量上,判斷投影是否相交,如果不相交則兩個多邊形不相交,否則選下一條垂直向量繼續進行投影判斷。

;}效果:---點選執行---(使用方向鍵來移動,碰撞的變紅,否則變黃)

4.圓與多邊形

(1)找出多邊形每條邊的垂直向量,多邊形最接近圓心的點到圓形的直線的垂直向量

(2)將圓和多邊形投影到垂直向量上,再進行判斷。

(其實和多邊形之間的碰撞很像,這裡就不浪費篇幅了) 

總結:sat很簡單,就是投影 + 重疊判斷。

sat只適用於凸體,畢竟凹體中間空缺的部分在投影後資訊就消失了。

一些關於sat的**:

判斷多邊形重疊 多邊形碰撞檢測

在討論多邊形碰撞檢測之前,我們可以先思考一下遊戲物件怎麼判斷2d圖形有碰撞,靠的是判斷2d圖形在遊戲世界中有接觸,或者有重疊區域,大到包含,小到重疊接觸乙個點。那麼我們就需要精確計算2d圖形在某一幀有重疊部分,或者預判到下一幀有重疊部分,那麼就是碰撞到了。先從簡單的模型來討論碰撞。判斷乙個點是否在多...

lua實現cocos多邊形碰撞檢測

定義幾個資料型別和函式 function vec x,y return endv vec shortcut function dot v1,v2 return v1 1 v2 1 v1 2 v2 2 endfunction normalize v local mag math.sqrt v 1 2 ...

求任意多邊形面積(凹多邊形和凸多邊形)

遇到問題 已知多邊形的各個左邊點,要求多邊形的面積 然後我搜尋了下看到這篇文章 這個人說的不多,但是簡單明瞭 首先已知各定點的座標分別為 x1,y1 x2,y2 x3,y3 xn,yn 則該多邊形的面積公式為 s 1 2 x1 y2 x2 y1 x2 y3 x3 y2 xk yk 1 xk 1 yk...