iT邦幫忙

2021 iThome 鐵人賽

DAY 15
1
自我挑戰組

翻車機率極高的2D平台遊戲(2D Platformer)製作系列 第 15

[Day15] 碰撞偵測 - 分離軸原理 SAT

今日目標

  • 實作SAT碰撞偵測

SAT的作法

回顧一下,AABB的作法是不管是甚麼形狀,都把物件包進矩形的碰撞框裡,但很明顯的這會導致碰撞的「不精確」,既使是矩形,只要旋轉,就會看到「異次元碰撞」。

SAT,分離軸原理的作法,從結果上,就是找出兩物體的分離軸,只要找到一條,就代表兩個物體是分開的。下面說明一下SAT的步驟。

  1. 也先從矩形開始思考,兩個矩形,但這次旋轉了45度。我們要先把八個頂點位置都找出來。
  2. 然後,使用向量的減法,算出各自四個邊的向量,這個就會是把我們矩形包起來的邊界。
  3. 接下來,找出垂直於各邊界的向量,也就是法向量(可以使用點積找到)。
// 例如: E = (100, 82),依據點積則 E.N = 0
// 會找到兩個向量,N = (-82, 100) or (82, -100)
  1. 以一條法向量為例,找出來個物體的各自點在該法向量的正投影,只要找到這個物體在該軸上的最大與最小的位置就好。會像下圖中這樣,可以看出來在這一軸上,兩個物體的投影是沒有重疊的,這標示找到分離軸了,沒有碰撞。
    找出正投影
  2. 有兩個矩形,八條邊界,最多會需要迭代八次,找到在各自的投影有沒有重疊。

AABB也是一種SAT?

仔細一下,昨天AABB的做法也是一種SAT,兩個矩形的邊界就是XY兩軸,畢竟兩個物體都「正正方方」的,然後所說的投影就是各自的X軸的min與max,Y軸的min與max。

MISSION FAILED!

實作過程中發現一些問題,在找頂點的時候就發生了問題,於是我直接拿昨天找到的網路文章看發甚麼問題,後來找到是選找的時候,我的參考點是世界座標的原點不是矩形的原點。

接著照上面的步驟,找出邊界,找出法向量,迭代每個法向量找出有沒有「不重疊」的正投影。

然後!出現了「異次元碰撞」,不管有沒有碰撞,都是顯示碰撞的狀態,加上頭有點昏(數學啊~我的天),時間已快到了,今天先休息吧。

參考

一樣上傳了今天的成果,但是結果是錯誤的。明天再戰


上一篇
[Day14] 初見碰撞系統
下一篇
[Day16] 再戰SAT
系列文
翻車機率極高的2D平台遊戲(2D Platformer)製作33

尚未有邦友留言

立即登入留言