假設現在我們需要檢測兩方形物體是否有碰撞
概念如下:
我們先定義出2個方形物體的原點以及高和闊
藍色方形我們稱方形A,左上角為其原點
從原點按照高和闊的延伸,形成方形圖案
紅色方形(我們稱方形B,左上角為其原點
從原點按照高和闊的延伸,形成方形圖案
========================分格線========================
如何檢測兩者是否有碰撞?
首先,我們要了解方形物體碰撞有多少種方式
上圖為沒有碰撞情況
上圖為 紅色方形的右側 與 藍色方形的左側 出現碰撞,第一種碰撞情況
上圖為 紅色方形的左側 與 藍色方形的右側 出現碰撞,第二種碰撞情況
上圖為 紅色方形的下側 與 藍色方形的上側 出現碰撞,第三種碰撞情況
上圖為 紅色方形的上側 與 藍色方形的下側 出現碰撞,第四種碰撞情況
從上述資料,我們可以把方形物體碰撞情況大概分為4種方式
我們先把名稱更新 (為了方便稱呼
這4種方式,就成為程式中4條條件的判斷。
但要小心,這4條的條件判斷不可以分開獨自判斷
if(A_X_UR>B_X_UL){
printf("collision");
}
if(B_X_UR>A_X_UL){
printf("collision");
}
if(B_Y_UL>A_Y_DL){
printf("collision");
}
if(A_Y_UL>B_Y_DL){
printf("collision");
}
因為會出現以下情形
紅色方形的左側 > 藍色方形的右側,所以會判斷為collision(有碰撞)
所以我們必需要同時為上下以及左右作判斷
我們需要更正為
if(A_X_UR>B_X_UL && B_X_UR>A_X_UL && B_Y_UL>A_Y_DL && A_Y_UL>B_Y_DL){
printf("collision");
}
====================心得分享====================
因為筆者是用C語言撰寫,所以沒有圖形輸出
我們也可以把以上的程式封裝成function
這樣當遊戲中需要執行任何碰撞時,也可以呼叫並使用
資料來源:http://davidhsu666.com/315/gamecollisiondetection
但這種檢測方法有個缺點,沒辦法檢測旋轉後的矩形與多邊形,你可能會對我的這篇文章感興趣。
遊戲中的碰撞檢測Collision Detection:
http://davidhsu666.com/315/gamecollisiondetection
原來這篇文章就是閣下所寫的
說真的,我就是看完你這篇,才知道學了一個學年的點積、法向量...的真正用途是什麼;而且也是我的靈感來源
目前仍然在消化6. 編寫程式碼-投影、旋轉與判斷,希望可以從中得到啟示。
因為C語言無法輸出圖像,所以要驗證旋轉圖像碰撞的程式碼,可能要花更多的時間
在這裡先感謝md9830415的文章分享
cool
果然還是要用分離軸定理,不只在遊戲領域,機械領域也常用。