iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
0

假設現在我們需要檢測兩方形物體是否有碰撞

概念如下:
我們先定義出2個方形物體的原點以及
https://ithelp.ithome.com.tw/upload/images/20180106/20107818MKcsYpXb5U.png

藍色方形我們稱方形A,左上角為其原點
原點按照的延伸,形成方形圖案

紅色方形(我們稱方形B,左上角為其原點
原點按照的延伸,形成方形圖案
========================分格線========================

如何檢測兩者是否有碰撞?
首先,我們要了解方形物體碰撞有多少種方式

https://ithelp.ithome.com.tw/upload/images/20180106/201078189XLI8ACnqW.png
上圖為沒有碰撞情況

https://ithelp.ithome.com.tw/upload/images/20180106/20107818G1RPStaHnz.png
上圖為 紅色方形的右側藍色方形的左側 出現碰撞,第一種碰撞情況

https://ithelp.ithome.com.tw/upload/images/20180106/20107818cmUgfINRoU.png
上圖為 紅色方形的左側藍色方形的右側 出現碰撞,第二種碰撞情況

https://ithelp.ithome.com.tw/upload/images/20180106/20107818aI7A1IHaiJ.png
上圖為 紅色方形的下側藍色方形的上側 出現碰撞,第三種碰撞情況

https://ithelp.ithome.com.tw/upload/images/20180106/20107818JAOpWeQs76.png
上圖為 紅色方形的上側藍色方形的下側 出現碰撞,第四種碰撞情況

從上述資料,我們可以把方形物體碰撞情況大概分為4種方式

我們先把名稱更新 (為了方便稱呼
https://ithelp.ithome.com.tw/upload/images/20180106/20107818ksOLPqjOzi.png

這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");
}

因為會出現以下情形
https://ithelp.ithome.com.tw/upload/images/20180106/20107818CdVJdT9CAf.png
紅色方形的左側 > 藍色方形的右側,所以會判斷為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


上一篇
從零開始:流程圖[1]
下一篇
[影像處理系列] 當模糊遇上細線化[2]結果分析
系列文
提神?看程式比喝咖啡更有效。30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
md9830415
iT邦新手 5 級 ‧ 2018-01-13 06:11:14

但這種檢測方法有個缺點,沒辦法檢測旋轉後的矩形與多邊形,你可能會對我的這篇文章感興趣。

遊戲中的碰撞檢測Collision Detection:
http://davidhsu666.com/315/gamecollisiondetection

看更多先前的回應...收起先前的回應...

原來這篇文章就是閣下所寫的/images/emoticon/emoticon32.gif
說真的,我就是看完你這篇,才知道學了一個學年的點積、法向量...的真正用途是什麼;而且也是我的靈感來源

目前仍然在消化6. 編寫程式碼-投影、旋轉與判斷,希望可以從中得到啟示。

因為C語言無法輸出圖像,所以要驗證旋轉圖像碰撞的程式碼,可能要花更多的時間

在這裡先感謝md9830415的文章分享

md9830415 iT邦新手 5 級 ‧ 2018-01-13 17:45:28 檢舉

原來如此,加油!!!

感覺這種程式還是要有圖形才好比對,不然Debug很痛苦阿,要慢慢比對數值...,也許你可以試試JavaScript,繪製圖形比C簡易一些,有現成方法。

不過我文章中圓形對多邊形、多物體的檢測優化那邊都還沒完成,加上完成後還有質心、角動量、彈性碰種各種物理效果....,有機會可以一起討論。

SAT碰撞檢測的應用:物體碰撞後的最小位移量,兩物體重疊後最小穿透量,將兩個重疊的物體用最短距離分離他們。

效果大概是這樣:Here
Github : MTV-show的版本Here

微中子 iT邦新手 4 級 ‧ 2018-01-14 00:41:50 檢舉

cool

QQBoxy iT邦研究生 5 級 ‧ 2018-01-15 00:31:41 檢舉

果然還是要用分離軸定理,不只在遊戲領域,機械領域也常用。

我要留言

立即登入留言