今天花了一整天Debug,一直看為甚麼「Not Work」,單純紀錄一下流程。
依照昨天的文章把SAT碰撞偵測分成幾個步驟,開始算(演算法)之前會需要一些資料。
先說結論,其實目標蠻簡單的,圖形也就兩個矩形而已,怎麼花了這麼長的時間Debug
第一點,沒話說,數學基礎差,只能多多接觸跟多算。第二點,除了之前的Log,還標示了座標位置與法向量的「點」,對阿...我怎麼沒想到是標示「線」呢。
最後第三點才是我找出問題的關鍵,昨天有提到「AABB是一種SAT」,他的法向量就是XY兩軸,原本是設定兩個旋轉45度矩形互撞,發現有Bug,印出Log看看頂點、邊、法向量等資料,看不太出來,於是把兩個矩形轉回正的,再印輸出一次Log,發現到法向量不是X或Y軸,結果發現是之前寫的求單位向量的功能,是錯的(因為之前寫完就沒有一一測試呢....ˊ_>ˋ)。
再來是救是SAT的核心演算法了,要求出每個頂點對各個法向量的正投影,如果XY兩軸為可能的分離軸,四個頂點又是沒有旋轉的矩形的四個點,以X軸為例,其正投影就會是該點X軸的分量,用點積算出來也就只會是X純量,結果出來,也是錯的....,到頭來也是之前寫的點積算法錯了.....(ˊ_>ˋ)
最後...終於修好了範例(ˊ_>ˋ),對!只有範例,沒測過其他的情況。
原本預計碰撞之後,可能開始進行物件的移動,以及物理的部分,但最近這幾篇發現原本設計的架構,寫的綁手綁腳的。明明是C,卻以OOP的思維,用了最OOP最令人詬病的部分,刻意把一些數據用類似private
的部分封裝。
加上原本設計DrawRectangle
與DrawTexture
就是想要單純的封裝實作,只要填一些數據就好...
或許是要調整整體設計了。不然之後可能會有更多坑...