高階碰撞檢測(二) 居於格仔的大量單位的檢測方法

2021-06-27 18:20:11 字數 1105 閱讀 8337

對於大多數引擎來說,大量物件之間的移動和碰撞會引發很多的問題,乙個不留意就會把渲染速度給降下來,所以對大量物件的碰撞檢測有很多的**餘地,當然這也要結合專案的具體情況來實現。

如果只有6個相互作用的物件進行兩兩檢測時,假設給定物件為a、b、c、d、e、f,那麼它們需要進行以下15次檢測:

ab、ac、ad、ae、af

bc、bd、be、bf

cd、cd、cf

de、df

ef那麼可以得到這種檢測方法的次數是(n*n - n)/2,可以看到,檢查的次數會隨著物件的數量而飛速增長,100個單位單獨檢查的話,需要完成4950次,相信基本哪個引擎都經不起這樣的折騰的,如果是應用上一節的hittest方法,那能撐到50個就已經很了不起了。那麼,居於格仔的碰撞檢測方法就可以有很好的施展空間了,具體以下進行講解。

所謂居於格仔檢測方法,就是將地圖分成乙個個格仔來考慮,一般我們習慣用乙個二維陣列訪問每乙個格仔的資料,注意,單元格至少要和最大的物件一樣大,然後根據物件中心所在的位置將各個物件分配到該網格的某個單元格中。如果一切正常,給定單元格中的物件只可能與其周圍的8個單元格中的物件發生碰撞,如圖:

當然,在實際檢測中這還可以繼續優化,如果是一次性判斷全部的碰撞,那麼,不是邊緣情況,只需檢測如圖這些區域就可以全部都檢測碰撞完,邊緣的話把超過的去掉就行,如圖所示:

物件a只需檢測標有灰色的格仔上的單位,依次類推,那麼每個單位都能檢測周圍的8個格仔,可以在紙上模擬一下,很容易發現規律的。

對於每個格仔上的單位檢測的時候,我們最多要處理5個單元格:所檢查的主單元格,右邊單元格,以及下面的單元格,a比較結束之後,再檢測a的下乙個單元格,順序是從左往右,從上往下依次進行,那麼100個物件之間實際發生的碰撞檢測的平均次數在100次至200次之間,比所有物件相互比較的4950次節約了4800次左右,從這可以看出它的優勢所在了。實現**效果如下:

QGraphicsScene的碰撞檢測

實現效果如下 圖1 移動的item碰撞顯示 圖2 碰撞的item都顯示 使用scene的碰撞檢測函式 qlist qgraphicsitem collidingitems const qgraphicsitem item,qt itemselectionmode mode qt intersects...

Ogre中的碰撞檢測

基於射線查詢的方式,實現攝像機和地形的碰撞檢測,防止攝像機穿透地面,這也是ogre demo中terrian例子中的方法。首先定義 rayscenequery rayscenequery 0 在createscene時候,建立場景查詢 framerenderingqueued事件中,進行射線查詢,設...

xna畫素的碰撞檢測

畫素碰撞檢測要點在於檢測兩個交叉影象畫素點的的透明度alpha。這樣可以提公升碰撞檢測的精確度。一般的我們選取人物,怪物遊戲素材影象,都不可能佔滿整個影象 如果我們以整張定義乙個矩形方框來檢測碰撞顯然不夠精確 但其實已經夠用 我們的主角可能沒碰到這顆樹就發生了碰撞檢測 掛掉了 我們希望的是主角真正的...