《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > Android手持設(shè)備游戲中的碰撞檢測算法研究
Android手持設(shè)備游戲中的碰撞檢測算法研究
來源:微型機(jī)與應(yīng)用2013年第14期
羅 軍1,, 李紹文2
(1. 桂林電子科技大學(xué) 電子工程與自動(dòng)化學(xué)院, 廣西 桂林 541004; 2. 桂林電子科技大學(xué)
摘要: 針對(duì)Android手持終端中復(fù)雜游戲場景的碰撞檢測需求,,提出了一種基于包圍球和AABB的實(shí)時(shí)碰撞檢測算法,。該算法針對(duì)不同的虛擬對(duì)象構(gòu)建不同的包圍盒,,并將改進(jìn)后的包圍盒投影排序分組方法應(yīng)用其中,。將該算法與使用包圍盒投影排序分組方法的包圍球算法與AABB算法比較,實(shí)驗(yàn)表明,該算法在保持更高精度的前提下仍能滿足復(fù)雜場景中實(shí)時(shí)碰撞檢測的要求。
關(guān)鍵詞: 軟件 Android 碰撞檢測 包圍球 AABB
Abstract:
Key words :

摘 要: 針對(duì)Android手持終端中復(fù)雜游戲場景的碰撞檢測需求,,提出了一種基于包圍球AABB的實(shí)時(shí)碰撞檢測算法,。該算法針對(duì)不同的虛擬對(duì)象構(gòu)建不同的包圍盒,并將改進(jìn)后的包圍盒投影排序分組方法應(yīng)用其中,。將該算法與使用包圍盒投影排序分組方法的包圍球算法與AABB算法比較,實(shí)驗(yàn)表明,該算法在保持更高精度的前提下仍能滿足復(fù)雜場景中實(shí)時(shí)碰撞檢測的要求,。
關(guān)鍵詞: Android ;碰撞檢測,;包圍球,;AABB

    隨著移動(dòng)互聯(lián)網(wǎng)的高速發(fā)展和快速普及,以及以ARM Cortex-A8、Cortex-A9為代表的高端嵌入式芯片的飛速發(fā)展,,智能手機(jī),、平板電腦等手持PDA已經(jīng)進(jìn)入每一個(gè)人的生活,并且其性能越來越強(qiáng)大,?;贏ndroid的高端消費(fèi)類電子產(chǎn)品更是以其開源性和通用性受到廣大消費(fèi)者的青睞。游戲無疑是這些手持設(shè)備的一個(gè)重要應(yīng)用,,而且不是傳統(tǒng)的簡單2D游戲,而是越來越復(fù)雜的3D游戲,,甚至是移植的PC經(jīng)典游戲,,如實(shí)況足球、極品飛車,、CS等,。為了使游戲更加逼真,場景中對(duì)象間的實(shí)時(shí)碰撞檢測[1]是一個(gè)必須要解決的問題,。但是當(dāng)前手持設(shè)備的3D游戲規(guī)模越來越龐大,,場景越來越復(fù)雜,如何快速精確地實(shí)現(xiàn)移動(dòng)手持設(shè)備中復(fù)雜游戲場景的實(shí)時(shí)碰撞檢測已經(jīng)成為當(dāng)前的研究熱點(diǎn)之一,。
    在游戲場景中,一般采用各種包圍盒算法來替代對(duì)象進(jìn)行相交測試,,但假設(shè)游戲場景中有D個(gè)動(dòng)態(tài)對(duì)象和S個(gè)靜態(tài)對(duì)象,如果直接用兩對(duì)象的包圍盒進(jìn)行碰撞檢測,,則必須經(jīng)過CD2+DS次檢測才能最終確定整個(gè)場景的碰撞情況,,當(dāng)D和S都較大時(shí),這將是一個(gè)龐大的計(jì)算量,,從而嚴(yán)重影響游戲場景的實(shí)時(shí)性和真實(shí)性,。基于Lin-Canny[2-4]算法的I-Collide[4-5]算法庫是一種經(jīng)典的實(shí)時(shí)碰撞檢測算法,,它使用一維區(qū)間排序法快速排除不相交的對(duì)象對(duì),,從而大大減少了精確求交的計(jì)算量,。由于游戲場景對(duì)實(shí)時(shí)性的要求比較高,本文在I-Collide算法庫及其改進(jìn)算法的基礎(chǔ)上提出了一種基于包圍球[1]和軸對(duì)稱包圍盒(AABB)[1]的快速碰撞檢測算法。
1 算法描述
1.1 I-Collide算法庫及其改進(jìn)算法概述

     三維空間的包圍盒間相交測試,,常常是把包圍盒投影到坐標(biāo)軸上轉(zhuǎn)化為一維或二維來處理,,即通過降低維度來提高檢測的效率?;贏ABB的經(jīng)典I-Collide算法庫采用的是一維空間排序法,,即將AABB投影到某一坐標(biāo)軸上,如圖1所示,,然后使用插入排序法對(duì)投影列表排序確定包圍盒的交疊情況,,從而將沒有相交的包圍盒快速略去。I-Collide算法庫比以往的其他碰撞檢測算法更加高效,,但它忽略了碰撞檢測的局部性,,將排序后的所有包圍盒兩兩進(jìn)行相交測試。董峰等[2]對(duì)該排序算法進(jìn)行了改進(jìn),,使用二維投影排序的方法,,即將所有物體的包圍盒投影到x-y坐標(biāo)面,然后用矩形排序算法進(jìn)行篩選,,最后驗(yàn)證交迭的矩形對(duì)在z軸上的相交情況,。王曉榮[5]又進(jìn)行了改進(jìn),她不僅把包圍盒投影到二維x-y平面,,而且采用了效率更高的希爾排序法對(duì)投影序列實(shí)時(shí)排序,并將坐標(biāo)軸劃分為一系列包含相同數(shù)目的投影子段(如果投影區(qū)間數(shù)不能被均勻劃分,,讓最后一個(gè)子段的投影區(qū)間數(shù)小于前面每個(gè)子段中的投影區(qū)間數(shù),且前面的每個(gè)投影子段包含的投影區(qū)間數(shù)應(yīng)相同),。

1.2 算法改進(jìn)
     隨著虛擬場景的實(shí)時(shí)更新,,如果每次都用希爾排序法對(duì)所有包圍盒實(shí)時(shí)排序,會(huì)消耗大量的時(shí)間,,從而降低算法的效率,。如圖2所示,本文對(duì)比進(jìn)行了改進(jìn),,使用了排序效率更高的堆排序法對(duì)某一軸上的投影序列排序,,并將初次劃分后投影子段(該文中稱之為“組”)的邊界固定,之后將運(yùn)動(dòng)對(duì)象更新后包圍盒的投影值與之前包圍盒所在組的邊界值進(jìn)行比較,,如果仍在邊界之內(nèi),,則繼續(xù)留在本組內(nèi),否則,,與下一組的邊界值比較,,依次類推,直到找到新的歸屬組,;然后在每組內(nèi)使用堆排序法對(duì)投影值進(jìn)行實(shí)時(shí)排序,,快速排除沒有交疊的對(duì)象對(duì),;最后,對(duì)交疊的對(duì)象對(duì)(其中至少有一個(gè)對(duì)象是動(dòng)態(tài)的)進(jìn)行相交測試,。其實(shí),,在很短的時(shí)間間隔內(nèi)包圍盒的位移量是有限的,因此,,包圍盒分組時(shí)往往只要與本組及相鄰組進(jìn)行比較即可,。這樣隨著場景的實(shí)時(shí)更新,很可能某些組所包含的對(duì)象全部都是靜態(tài)的,,因而整個(gè)組都可以不用進(jìn)行相交測試了,。即:相交測試只在有動(dòng)態(tài)對(duì)象存在的組內(nèi)進(jìn)行,這大大提高了檢測的效率,。

 該算法需要注意以下問題:(1)當(dāng)某一包圍盒的一部分已進(jìn)入新的投影子段,,而另一部分仍然留在原投影子段時(shí)(如圖2中虛線框圖所示),包圍盒在兩個(gè)投影子段所屬組都需參與碰撞檢測,。并且當(dāng)某兩個(gè)相交對(duì)象在坐標(biāo)軸劃分階段都被分為兩個(gè)部分,、當(dāng)對(duì)兩個(gè)對(duì)象左邊部分對(duì)應(yīng)的x軸和y軸子列表進(jìn)行相交測試時(shí),已經(jīng)知道兩對(duì)象重疊,,算法就不再對(duì)兩個(gè)對(duì)象的右邊部分的投影進(jìn)行相交測試,,從而減少了算法的執(zhí)行時(shí)間。(2)如果場景中有體積非常大的物體,,在執(zhí)行碰撞檢測之前必須先將物體分解為體積較小的子塊,,再將各子塊分別進(jìn)行碰撞測試。
1.3 新算法描述
    由于游戲場景中幾何物體的形狀各異,,不同對(duì)象用不同的包圍盒來近似模擬時(shí)會(huì)出現(xiàn)截然不同的效果,不合理使用包圍盒會(huì)使碰撞檢測效率大幅降低,。例如,,一個(gè)球體如果用AABB來模擬,會(huì)出現(xiàn)較大的誤差,;而一個(gè)長條形物體用包圍球模擬,,碰撞檢測的精度也會(huì)很差。一種好的碰撞檢測系統(tǒng)應(yīng)該根據(jù)不同對(duì)象的形狀特征提供不同的解決方案,。因此,,本文用包圍球來模擬近似球狀的對(duì)象,其余的對(duì)象都用AABB代替參與相交測試,并將上述改進(jìn)后的包圍盒投影排序分組算法應(yīng)用在該算法中,,從而快速完成場景的碰撞檢測,。
    整個(gè)算法的執(zhí)行過程是:首先對(duì)包圍球和AABB投影排序并分組,這樣可以迅速排除不可能發(fā)生碰撞的對(duì)象對(duì),;然后,,對(duì)各組中的潛在碰撞檢測集進(jìn)行相交測試,,即最終的碰撞檢測就轉(zhuǎn)化為球與球的相交測試、球與AABB的相交測試以及AABB間的相交測試,。
2 包圍盒間的相交測試
    包圍球之間的相交測試很容易實(shí)現(xiàn),,只需根據(jù)球心之間的距離和兩球的半徑之和的差值就可以判斷相交情況。兩個(gè)AABB相交,,則它們?cè)?個(gè)坐標(biāo)軸上的投影也必然相交,,因此,AABB間的相交測試完全可以轉(zhuǎn)化為坐標(biāo)軸上投影區(qū)間的相交測試,,只要有一個(gè)軸上的投影不相交,,就可以直接判定兩包圍盒不相交,從而結(jié)束相交測試,。
    包圍球與AABB的相交測試,,如果使用常規(guī)的幾何分析方法會(huì)非常復(fù)雜。一類簡單可行的方法是求取包圍球到AABB的最近距離點(diǎn)對(duì),,但如果使用常規(guī)的暴力遍歷算法來求解幾何體之間的最近點(diǎn)對(duì),,效率太低。而Lin- Canny算法求解凸包間的最近點(diǎn)對(duì)是非常高效的,。Lin-Canny算法高效實(shí)現(xiàn)的關(guān)鍵是引入了Voronoi域的思想,通過遍歷AABB的Voronoi特征域獲取球心在某一特征(頂點(diǎn),、邊或面)上的投影點(diǎn),這個(gè)投影點(diǎn)就是AABB到球心的最近點(diǎn),,再求出這個(gè)最近點(diǎn)到球心的距離并與包圍球的半徑(實(shí)際使用平方值)進(jìn)行比較,,如果這個(gè)距離小于半徑,則包圍球與AABB相交,;否則,,不相交。
    如圖3所示,,假設(shè)P為球心位置,,A為AABB,A包圍盒中頂點(diǎn)Q的Voronoi域,、邊MQ的Voronoi域和面S的Voronoi域分別如圖中不同顏色所示,。則A上到P的最近點(diǎn)可以通過下面的方法獲得:在某一軸上將P限定在A的邊界上。存在3種限定P的情況:(1)如果P點(diǎn)位于A的某表面的Voronoi域,,則截取操作將P限定在A的該表面上; (2)如果P點(diǎn)位于A的某頂點(diǎn)的Voronoi域,,則截取操作將視該頂點(diǎn)為所求點(diǎn); (3)如果P點(diǎn)位于A的某邊的Voronoi域,則截取操作為該邊上的正交投影,。其偽代碼實(shí)現(xiàn)如下:

 

 

     /*p為球心,,a為AABB*/
Point  findNearestDistancePoint(Point p,
                         AABBBox a)
{
    Point  q;                                      /*所求點(diǎn)q*/
    for(int i=0;i<3;i++)
    {
        float v=p[i];
        if(v小于a在某一軸上投影的最小值)
            v=這個(gè)最小值;
        if(v大于a在某一軸上投影的最大值)
            v=這個(gè)最大值;
        q[i]=v;
    }
    end for;
    return q;                                            /*返回q點(diǎn)*/
}
3 實(shí)驗(yàn)結(jié)果及分析
    在小米M1手機(jī)上實(shí)現(xiàn)該算法,其系統(tǒng)為Android OS 4.0;CPU為高通驍龍MSM-8260(雙核)1.5 GHz;GPU為Adreno220,;RAM為1 GB,;圖形API接口為OpenGL ES 2.0。首先,,在多個(gè)包含不同對(duì)象個(gè)數(shù)的場景中,,將改進(jìn)算法與參考文獻(xiàn)[5]中的算法(只進(jìn)行包圍盒相交測試,省去了葉子節(jié)點(diǎn)的相交測試)進(jìn)行比較,,結(jié)果如圖4所示,。再將改進(jìn)后的包圍盒投影排序分組方法應(yīng)用到包圍球算法和AABB算法中,并與本文提出的新算法進(jìn)行對(duì)比分析,,結(jié)果如表1所示,。

    由于用堆排序法替代了希爾排序法,并將靜態(tài)包圍盒的分組固定,,只實(shí)時(shí)更新動(dòng)態(tài)包圍盒的組別,,隨著包圍盒數(shù)量的不斷增加,改進(jìn)算法比參考文獻(xiàn)[5]中的算法效率更高。尤其是當(dāng)場景越來越復(fù)雜時(shí),,改進(jìn)算法完成碰撞檢測所需的時(shí)間并沒有明顯地增加,,具有更加優(yōu)越的實(shí)時(shí)性能。 通常游戲場景所需的最低幀率一般為20 f/s~30 f/s,。本文算法在保證了更高精度的前提下仍能與包圍球算法和AABB算法一樣滿足復(fù)雜場景的實(shí)時(shí)性需求,。
    針對(duì)Android手持終端的復(fù)雜游戲場景的需求,本文在I-Collide算法庫及其改進(jìn)算法的基礎(chǔ)上,,提出了一種基于包圍球和AABB層次包圍盒的碰撞檢測算法,。把傳統(tǒng)的基于AABB的投影排序法應(yīng)用在該算法中并進(jìn)行優(yōu)化,從而排除了大量不可能相交的對(duì)象對(duì),,提高了算法的實(shí)時(shí)性,。但該算法沒有對(duì)變形體或旋轉(zhuǎn)體的包圍盒重構(gòu)提出快速的解決方案,有待在以后的研究中解決這些問題,。隨著嵌入式芯片的高速發(fā)展和實(shí)際應(yīng)用的需要,,以后的研究中還應(yīng)該考慮使用OBB[1]或k-DOPs[1]等更加緊密的包圍盒算法或基于GPU的碰撞檢測算法[6]及其他的精確碰撞檢測算法來滿足各種場合的苛刻需求。
參考文獻(xiàn)
[1] 鄒益勝,,丁國富,許明恒,,等.實(shí)時(shí)碰撞檢測算法綜述[J].計(jì)算機(jī)應(yīng)用研究,,2008,25(1):8-12.
[2] 董峰,王同洋.虛擬環(huán)境中的快速碰撞檢測算法[J].計(jì)算機(jī)工程與應(yīng)用,,2003,39(8):66-67.
[3] Lin Ming, CANNY J. A fast altorithm for incremental distance calculation[C].Proceedings of the 1991 IEEE International Conference on Robotics and Automation,,1991:1008-1014.
[4] COHEN J D, LIN M C,, MANOCHAL D. I-CoLLIDE: an  interactive and exact collision detection system for largescale environments[C]. Proceedings of ACM Interactive 3D Graphics Conference,,1995:189-196.
[5] 王曉榮,,王萌,李春貴.基于AABB包圍盒的碰撞檢測算法[J].計(jì)算機(jī)工程與科學(xué),,2010,,32(4):59-61.
[6] Tang Min,MANOCHA D,,Jiang Lin,,et al. Collisionstreams:fast GPU-based collision detection for deformable models[M].ACM SIGGRAPH Symposium on Interactive 3D Graphics  and  Games (I3D),2011:63-70.

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載,。