遊戲中的碰撞檢測

2021-09-06 01:53:19 字數 2154 閱讀 1901

on 2023年07月21日, in work, by ppzhu

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。

一、地圖格仔劃分檢測

最簡單的一種檢測,就是把地圖(或者稱為場景,總之是指碰撞發生的範圍)劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有800*600px,20*20個畫素為一格。那麼可以劃為40*30個格仔。地圖中參與檢測的物件都儲存著自身所在的格仔座標,判斷碰撞就顯而易見了,例如可以認為兩個物體在相鄰格判為碰撞,或者兩個物體在同一格。採用這種方式有個要求,就是地圖中所有可能參與碰撞的物體都要是20*20畫素左右大小或者是其整數倍,例如房子佔了3*3個格仔,諸如此類。如果不遵守這個規則,有的物體只佔了格仔的一半,那麼在玩家眼裡這種檢測就顯得非常的粗糙。這種檢測就像是把地圖的畫素點放大幾十倍一樣,與逐畫素檢測相比,效率提高了幾十倍甚至上百倍。這種方式可運用於對檢測要求不嚴格的遊戲,例如踩地雷的rpg、推箱子之類的智力遊戲。

二、矩形檢測

當地圖中的物體不能嚴格按照某個塊大小的整數倍來繪製時,那麼就需要另想其他的方法。這種方法適用於地圖中的物體近似為矩形或者雖然不是矩形,但是碰撞精度要求不高的情況下。每個物體記錄乙個能夠將自己框住的最小矩形的左上角座標和矩形長寬。碰撞退化為判斷矩形與矩形之間是否重疊,而這僅需要4次比較即可得出,速度很快。但為了判斷整個場景中的物體,必須取第乙個物體,迭代其他所有物體進行判斷,再取第二個物體,迭代除第一第二個物體外的所有物體進行判斷,以此類推。總計要進行(n-1)!次矩形判斷才能準確得出場景中所有的碰撞可能。

三、圓形檢測

與上一種方法類似,區別在於用乙個能夠包含物體的最小圓代替了矩形。主要是考慮到遊戲中的物體外形以平滑為主,例如人物角色。而判斷兩個圓是否碰撞的計算也很簡單,就是判斷兩個圓心之間的距離是否小於兩個圓的半徑之和。雖然球形檢測在某些情況下提高了精度,但卻損失了速度,因為點距離的計算需要用到平方和開方。具體相比慢多少我就不太清楚了。另外,為了計算整個地圖的所有碰撞可能,也要進行(n-1)!次比較。

四、畫素檢測

精確到畫素級,已經不能比這更精確了,相對的,效率也是最低的。怎樣判斷兩個物體是否碰撞呢?在過去png格式還不盛行的時候,遊戲中用到的中的透明部分是指定用某種顏色來表示的,例如洋紅色。就像電影中的綠幕藍幕,通過處理把這些顏色的畫素點當做透明點處理,而為了判斷檢測,需要準備一張原影象的黑白圖,黑色區域表示透明,這張中的每個畫素值為0或者1,判斷檢測的時候取兩張的黑白圖,進行與運算,結果為1(有白點重疊),則判為碰撞。但是現在有了png和xna,逐畫素檢測就相對簡單一些。首先仍然需要有乙個矩形框包圍物體,通過矩形檢測得到重疊的矩形區域可以大大減少檢測的畫素點數量。然後在這個區域內,取兩個的點逐行逐列迭代,如果遇到某個點兩張均有顏色存在,即判為碰撞。同理,進行(n-1)!次比較後得到全地圖的碰撞可能。

五、四叉樹檢測

有個問題,我怎麼知道哪些物體是跟該物體位於同乙個區呢?那不是還是要迭代一遍所有物體?這時候就是題目發揮的地方的,之所以稱為四叉樹檢測(當然,這名字是我自己取的),就是因為那些區塊是以四叉樹的方式鏈結的,即得到乙個區塊的物件,就可以直接得到其上下左右相鄰的區塊的物件,而物體可以是儲存在所在區的乙個列表中。這樣就不用遍歷所有物體也可以直接取出隔壁區的物體了。當地圖很大的時候,四叉樹的優勢體現得很好。

六、3d中的碰撞檢測

以上是我所掌握碰撞方法,可能還有更多吧。那麼3d中的檢測其實是2d的延伸,例如矩形檢測變為立方體檢測,圓形檢測引申為球形檢測,四叉樹檢測進化為八叉樹檢測。

當然了,凡是有例外。逐畫素檢測方法在3d中沒有相對應的方法,因為3d中的物體的表示最小單元是三角型而非點。其實也可以說逐三角片檢測是逐畫素檢測的3d版,但畢竟是平面碰撞的檢測,需要一定的計算公式,而不是與或一下就ok的。這裡就不贅述了。

總結

我的表達能力不是很ok,另外手打得也有些酸。

選擇哪種方法,要根據你的遊戲需要,例如推箱子遊戲,顯然只要格仔碰撞檢測就足夠了。而一些以球作為主要物體的遊戲例如射擊遊戲則可以考慮圓形碰撞。

同樣的,在有些碰撞精度要求很高的遊戲中,還要對這些方法進行一定的變化,例如格鬥遊戲,作為判斷的單元不是整個人而是四肢、身體等部位,需要更多的包圍盒來表示乙個物體。

遊戲中的碰撞檢測

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。一 地圖格仔劃分檢測 最簡單的一種檢測,就是把地圖 或者稱為場景,總之是指碰撞發生的範圍 劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有...

遊戲中的碰撞檢測

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。一 地圖格仔劃分檢測 最簡單的一種檢測,就是把地圖 或者稱為場景,總之是指碰撞發生的範圍 劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有...

遊戲中的碰撞檢測

遊戲中的碰撞檢測方式有很多,不同的演算法之間主要是在精度和速度之間權衡。以下幾種方式按照速度排序說明。以2d為例,3d不過是增加了一維罷了,演算法理解上沒太大區別。一 地圖格仔劃分檢測 最簡單的一種檢測,就是把地圖 或者稱為場景,總之是指碰撞發生的範圍 劃成乙個個格仔,類似仙劍奇俠傳這樣。假設地圖有...