專利名稱:一種三維碰撞檢測方法
技術領域:
本發(fā)明涉及計算機數(shù)據(jù)處理領域,尤其涉及一種三維碰撞檢測方法。
背景技術:
碰撞檢測是計算機游戲中需要解決的問題之一,它的核心任務是檢測游戲場景中兩個或多個物體彼此之間是否發(fā)生接觸或進入。當前,三維幾何模型越來越復雜,畫面效果越來越逼真,同時人們對交互的實時性、場景的真實性的期望越來越高,這些都對碰撞檢測方法提出了較高的要求。
近二十多年來,研究人員在碰撞檢測領域中做了相當多有意的工作,提出了一些較成熟的算法,并開發(fā)了相應的軟件。研究人員根據(jù)不同的研究對象,采用了不同的研究方法,由此提出多種多樣的碰撞檢測算法。下面先對碰撞檢測算法從時間和空間的角度對它們做一個劃分(I)基于時間域,可以分為離散和連續(xù)的碰撞檢測算法。離散碰撞檢測算法是指在每一離散的時間點上進行碰撞檢測,其優(yōu)勢在于檢測速度上,但可能會漏測本該發(fā)生的碰撞或者發(fā)生物體互相進入的情形;連續(xù)碰撞檢測算法是指在連續(xù)的時間間隔內(nèi)進行碰撞檢測,它的正確性有保證,但計算開銷過大,容易在速度方面拖后腿,致使實時性得不到很好滿足。(2)基于空間域,可以分為基于物體空間和圖像空間的碰撞檢測算法?;谖矬w空間的碰撞檢測算法又可以進一步劃分為采用一般表示模型的碰撞檢測算法和采用空間結構的碰撞檢測算法,其中采用空間結構的碰撞檢測算法又分空間剖分法(spacedecomposition)和層次包圍體樹法(hierarchical bounding volume trees),這兩類方法都是通過盡可能減少進行精確求交的物體對或基本幾何元素的個數(shù)來提高算法效率的。不同的是,空間剖分法(如BSP樹)采用對整個場景的層次剖分技術來實現(xiàn),而層次包圍體樹法則是對場景中每個物體建構合理的層次包圍體樹來實現(xiàn)。目前現(xiàn)有的專利文獻中關于碰撞檢測方法很多,其中一種在服務器端實現(xiàn)三維游戲碰撞檢測的方法,主要包括以下步驟在三維游戲場景中的物體外面預置一個包圍體,所述包圍體包圍該物體或者物體的主要部分,而且包圍體采用的是球狀包圍體;在游戲玩家的外面預置一個球狀包圍體,所述包圍體包圍玩家或者玩家的主要部分,表示包圍體的面的數(shù)值存儲于游戲地圖文件中;當玩家移動要與物體進行碰撞時,對玩家包圍體的面與物體的包圍體的面進行碰撞檢測。具體參見圖I。針對目前的現(xiàn)有技術,其存在的缺點是采用包圍球來作為物體和玩家的包圍體,適合于長寬高相差不多的物體,而對與長條形的物體,包圍球的緊密型不好,這會讓游戲不逼真,效果很差,這會出現(xiàn)實際沒有碰撞而程序卻檢測到了碰撞的情況。碰撞檢測算法的并行性不足,沒有充分挖掘檢測算法中可以采用流水線技術進行加速處理。
發(fā)明內(nèi)容
本發(fā)明的目的是為了克服現(xiàn)有技術的缺陷,提供一種三維碰撞檢測方法?!N三維碰撞檢測方法,需要先建立場景的一個數(shù)據(jù)表示結構,即場景樹;場景樹是由平衡包圍樹來實現(xiàn),對游戲場景中的所有物體進行自上而下的構建AABB平衡包圍樹;包圍樹中每一個結點是一個包圍盒;其特征在于,a.首先建立模型的包圍盒,作為包圍盒樹的根結點;b.其次按照一定的規(guī)則將模型分成兩個或者多個部分,建立每個部分的包圍盒和相應的結點,將這些新結點作為根結點的子結點;然后按照步驟b的方法分裂與每個子結點對應的模型,遞歸地建立包圍盒樹。優(yōu)選的,本發(fā)明采用分治策略自上而下的方法構建游戲場景的包圍盒樹,進行碰撞檢測,引進流水線技術對檢測進行加速。
在流水線技術中,問題被分成一系列必須是一個接一個完成的任務,每個任務由獨立的進程或處理器執(zhí)行,采用下列3種計算類型,用流水線方法進行加速(I)執(zhí)行整個問題的多個實例;(2)必須處理一系列的數(shù)據(jù)項,而每個數(shù)據(jù)項需要多次操作;(3)進程在完成自己的所有內(nèi)部操作之前能夠把下一個進程啟動所需的信息向前傳送;將上述三種情況分別定義為類型I、類型2、類型3。本發(fā)明采用AABB平衡包圍樹的構建過程如下(I)對每個物體建立其整體的包圍盒,將其作為該物體平衡包圍盒樹的根結點,此結點包含了組成此物體的所有多邊形;(2)由于使用的是AABB包圍盒,采用基于分裂平面的方法將根結點的包圍盒劃分成左右兩個子結點;分裂平面的選擇是使包圍盒樹平衡的關鍵,首先確定分裂軸,使用最長軸方法,SP選擇的方向軸是包圍盒在此方向上最長的;而后確定分裂點,選擇根結點集合中所有基本幾何元素的中心點在分裂軸上的投影,以最小點和最大點為兩個中心點,按距離將所有投影點分為兩組;將距兩中心點等距的點歸入含投影點少的一組。具體的三維碰撞檢測方法的流程如下St印I :輸入物體A和B,分別建立A,B的平衡包圍盒樹,轉(zhuǎn)Step2 ;Step2 :將(a0, b0)加入到任務樹節(jié)點存儲隊列LiveSet中,轉(zhuǎn)Step3 ;St印3 :判斷LiveSet是否為空,若不為空則轉(zhuǎn)St印4,否則轉(zhuǎn)St印11 ;Step4 :從 LiveSet 中彈出(a0, b0),轉(zhuǎn) Step5 ;Step5 :判斷(a0, b0)是否相交,若不相交則轉(zhuǎn)Step3,否則轉(zhuǎn)Step6 ;St印6 :判斷a0,b0的結點狀態(tài),a0,b0均為葉子結點,則轉(zhuǎn)St印7 ;a0,b0均不是葉子結點轉(zhuǎn)Step8 ;a0是葉子結點,b0不是則轉(zhuǎn)Step9 ;a0不是葉子結點b0是則轉(zhuǎn)SteplO ;St印7 :用基本幾何元素對a0,b0進行碰撞檢測,若碰撞則返回True,否則返回False ;Step8 :將(al,bl),(al,b2),(a2,bl),(a2,b2)加入到 LiveSet 中,轉(zhuǎn) Step3 ;Step9 :將(a0,bl),(a0,b2)力口入到 LiveSet 中,轉(zhuǎn) Step3 ;SteplO :將(al,b0),(a2,b0)加入到 LiveSet 中,轉(zhuǎn) Step3 ;Stepll :返回 False,結束。本發(fā)明技術方案帶來的有益效果1)包圍體的選取有很多種,本發(fā)明選用AABB包圍盒作為物體的包圍體具有簡單快速和檢測精確的特點;
2)采用多級并行處理加速技術,不僅在單處理器而且在多處理器機器中都有很好的加速作用,引入多線程節(jié)省資源,并且能夠根據(jù)狀態(tài)智能地調(diào)整線程數(shù)量使得資源利效
率最高。
為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn)有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其它的附圖。圖I是現(xiàn)有技術中碰撞檢測流程圖;圖2是本發(fā)明中碰撞檢測系統(tǒng)流程圖;
圖3是本發(fā)明中流水化進程圖;圖4是本發(fā)明中碰撞檢測過程中簡單任務樹圖;圖5是本發(fā)明碰撞檢測流程圖。
具體實施例方式下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。本發(fā)明的目的提供一種基于AABB(Axis-Aligned Bounding Boxes)包圍體的三維碰撞檢測方法,采用分治策略自上而下的方法構建游戲場景的包圍盒樹,進行碰撞檢測,弓丨進流水線技術對檢測進行加速。假設三維空間中有N個運動模型,它們隨著時間改變位置和狀態(tài),設三維幾何空間為R,用三維幾何坐標系統(tǒng)Fw表示,在Fw中用FA表示模型A所占的集合,顯然FA是Fw的子集。那么Fw隨著時間的變化構成了一個四維空間坐標系統(tǒng)Cw,模型A沿著一定軌跡運動就形成了 Cw的子集,該子集表示為CA。碰撞檢測就是判斷Cl n C2 η ·.. n Cn ^ φ是否成立。三維物體之間的碰撞檢測通常需要先建立場景的一個數(shù)據(jù)表示結構,即場景樹。在本發(fā)明中場景樹是由平衡包圍樹來實現(xiàn),對游戲場景中的所有物體進行自上而下的構建平衡包圍樹。包圍樹中每一個結點是一個包圍盒,采用AABB包圍盒具有簡單快速等優(yōu)點。
對游戲玩家和物體之間的碰撞檢測以及物體與物體之間的碰撞檢測,其本質(zhì)上是對場景中樹的一種遍歷過程。檢測過程中的可重復性使得可以采用流水線技術對檢測過程進行加速處理,系統(tǒng)圖參見圖2 包圍盒樹可以按照自下而上的方式或者自上而下的方式構造,這要取決于包圍盒的種類和算法的意圖。大多數(shù)層次結構都采用自上而下的方式,即首先建立模型的包圍盒,作為包圍盒樹的根結點;其次按照一定的規(guī)則將模型分成兩個或者多個部分,建立每個部分的包圍盒和相應的結點,將這些新結點作為根結點的子結點;然后按照第二步的方法分裂與每個子結點對應的模型,遞歸地建立包圍盒樹。
對于二叉樹而言,當且僅當包圍盒樹中的每一個葉結點對應于S的一個單元素子集,即只包含一個基本幾何元素時則稱一棵包圍盒樹為完全的。由以上描述可知,包圍盒樹最多有2n-l個結點,其中有η個葉結點,并且要求兩個子包圍盒內(nèi)的多邊形個數(shù)大致相等;一棵完全的包圍盒樹的高度至少為Iogn,此時稱為樹是平衡的。分治策略的特點是將一個問題分為與原來的較大問題有相同形式的子問題,進一步分為較小的問題,通常是通過遞歸的方法,直到不需要再分解為止。接著就完成這些簡單的任務并把結果合并,然后按更大的任務繼續(xù)合并,直到獲得最后的結果。分治策略將一個任務在每一步分為Μ(Μ > 2)個部分,稱為M路分治,通常有二叉樹(Μ = 2)和四叉樹(Μ =4)。在流水線技術中,問題被分成一系列必須是一個接一個完成的任務,每個任務由獨立的進程或處理器執(zhí)行,如圖3所示假設一個問題能夠被分解成一系列的順序任務,那么采用下列3種計算類型,可 以用流水線方法進行加速(I)執(zhí)行整個問題的多個實例。(2)必須處理一系列的數(shù)據(jù)項,而每個數(shù)據(jù)項需要多次操作。(3)進程在完成自己的所有內(nèi)部操作之前能夠把下一個進程啟動所需的信息向前傳送。將上述三種情況分別定義為類型I、類型2、類型3。應用上述所介紹的理論提出了一種并行碰撞檢測算法,本算法主要采用分治策略建立平衡包圍盒樹,使用的是兩路分治即二叉樹。其數(shù)據(jù)結構在預處理階段一次性建好。由于建立的包圍盒樹大致平衡,故并行遍歷包圍盒樹可極大提高碰撞檢測的效率。包圍盒樹的遍歷實質(zhì)是一個基于分治或樹搜索的過程,將此過程實行并行化;應用流水線技術將整個環(huán)境中所有物體的碰撞檢測劃分為m個任務,每個任務由P個進程執(zhí)行;每個進程采用多線程進行處理。從而使碰撞檢測得到加速。包圍盒間相交測試的速度直接影響到碰撞檢測的速度。AABB包圍盒間的相交測試是所有包圍盒類型中最簡單、速度最快的一種。由于AABB包圍盒可以由3對與坐標軸正交的平行平面對來定義,故AABB包圍盒間的相交測試可以通過它在X、Y、Z三個坐標軸上的投影區(qū)間之間的重疊測試來完成,如果兩AABB包圍盒在任何一個坐標軸上的投影區(qū)間是不重疊的,則可判定它們不相交;只有當它們在3個坐標軸上的投影區(qū)間都重疊,它們才是相交的。因此,AABB包圍盒間的相交測試最多只需要6次比較運算,所以本發(fā)明使用此包圍盒。平衡包圍樹的構建過程如下(I)對每個物體建立其整體的包圍盒,將其作為該物體平衡包圍盒樹的根結點,此結點包含了組成此物體的所有多邊形。(2)由于使用的是AABB包圍盒,采用基于分裂平面的方法將根結點的包圍盒劃分成左右兩個子結點。分裂平面的選擇是使包圍盒樹平衡的關鍵,首先確定分裂軸,使用最長軸方法,即選擇的方向軸是包圍盒在此方向上最長的;而后確定分裂點,選擇根結點集合中所有基本幾何元素的中心點在分裂軸上的投影,以最小點和最大點為兩個中心點,按距離將所有投影點分為兩組。將距兩中心點等距的點歸入含投影點少的一組。對每個結點采用如上的方法遞歸,建立每個物體的包圍盒樹。適當?shù)倪f歸終止條件采用如下簡單的線性判別函數(shù)p(x)=ATB(I)式中A= (al, a2, , an) ,B= (bl, b2, , bn) ;bl, b2, , bn 為遞歸終止的各種因素,常取為包圍盒樹要求的高度,葉子結點中要求所含基本幾何元素的最多數(shù);al, a2,· · ·, an分別為與bl,b2,· · ·,bn對應的加權值。將遍歷兩個物體的平衡包圍盒樹的過程定義成一棵任務樹的遍歷。簡單地表示如圖4所示,將任務樹的結點采用隊列(LiveSet)存儲。進行碰撞檢測的流程可參見圖5,具體如下Stepl :輸入物體A和B,分別建立A,B的平衡包圍盒樹,轉(zhuǎn)St印2 ;Step2 :將(a0, bO)加入到任務樹節(jié)點存儲隊列LiveSet中,轉(zhuǎn)Step3 ;St印3 :判斷LiveSet是否為空,若不為空則轉(zhuǎn)St印4,否則轉(zhuǎn)St印11 ;Step4 :從 LiveSet 中彈出(a0, bO),轉(zhuǎn) Step5 ;Step5 :判斷(a0, bO)是否相交,若不相交則轉(zhuǎn)Step3,否則轉(zhuǎn)Step6 ;St印6 :判斷a0,b0的結點狀態(tài),a0,bO均為葉子結點,則轉(zhuǎn)St印7 ;a0,b0均不是葉子結點轉(zhuǎn)Step8 ;a0是葉子結點,bO不是則轉(zhuǎn)Step9 ;a0不是葉子結點bO是則轉(zhuǎn)SteplO ;St印7 :用基本幾何元素對a0,bO進行碰撞檢測,若碰撞則返回True,否則返回False ;Step8 :將(al, bl),(al, b2),(a2, bl),(a2, b2)加入到 LiveSet 中,轉(zhuǎn) Step3 ;Step9 :將(aO, bl),(aO, b2)加入到 LiveSet 中,轉(zhuǎn) Step3 ;SteplO :將(al, bO),(a2, bO)加入到 LiveSet 中,轉(zhuǎn) Step3 ;Stepll :返回 False,結束。本發(fā)明中一個重要的并行化處理是在上述的Step4中,將LiveSet中所有的任務結點同時彈出,多個任務結點間進行并行的碰撞檢測。本發(fā)明的另一個并行化加速是利用流水線技術進行加速處理。將采用前面提到的類型1,其流水線可以用時空圖來說明。假設每一個進程完成的時間是相同的。每一個時間段就是一個流水線周期。因此問題的每一個實例都需要經(jīng)歷6個順序進程p0,pl,p2,p3,p4和p5。經(jīng)過起始階段的階梯效果之后,每一個流水線周期就可以完成問題的一個實例。有P個進程構成的流水線完成m個問題的執(zhí)行需要(m+p-1)個流水線周期,執(zhí)行每個問題的平均周期數(shù)為(m+p-l)/m。當m很大時,每個問題實例趨近于一個流水線周期。在任何情況下,流水線過了開始的(P-I)個周期(流水線延遲)后的每個周期將完成問題的一個實例。其加速比為P I。如有η個物體,則形成η*η棵任務樹,由所有物體的平衡包圍盒樹通過兩兩組成多棵任務樹,將每棵任務樹的遍歷看作一個任務,然后將每個任務劃分成P個進程,其中P不宜大于32。進程數(shù)P的確定可以采取以下方法方法采用的流水線技術屬于類型I,每個任務結點的執(zhí)行算法是相同的,所用的時間定為一個流水線周期。
由前面規(guī)定的bl為平衡樹的高度,則每棵任務樹的高度也為bl,所以結點樹為(4bl-l)/3。如果將P的個數(shù)定為任務結點的個數(shù),則總的計算執(zhí)行時間為ttotal ttotal = (tcomp+tconm) (m+p-1)。其中為任務實例數(shù);p為進程數(shù);t_p和分別為計算時間和通信時間。 由于每個進程占用的資源太多,應選擇合適的進程數(shù)P??紤]每個流水線周期處理d 個結點,貝1J進程數(shù) P’ = p/d, tcomp = d,且 ttotal = (d+te_) (m+p’ -I)。所以 d 和 p 的選擇需要找到平衡點才能提高效率。d個結點可以應用線程并行技術。一個進程中可以同時執(zhí)行的線程數(shù)是由處理器的操作系統(tǒng)決定的。提出P以及對應總時間量的計算公式如下
權利要求
1.一種三維碰撞檢測方法,需要先建立場景的一個數(shù)據(jù)表示結構,即場景樹;場景樹是由平衡包圍樹來實現(xiàn),對游戲場景中的所有物體進行自上而下的構建AABB平衡包圍樹;包圍樹中每一個結點是一個包圍盒;其特征在于,a.首先建立模型的包圍盒,作為包圍盒樹的根結點;b.其次按照一定的規(guī)則將模型分成兩個或者多個部分,建立每個部分的包圍盒和相應的結點,將這些新結點作為根結點的子結點;然后按照步驟b的方法分裂與每個子結點對應的模型,遞歸地建立包圍盒樹。
2.如權利要求I所述的方法,其特征在于,采用分治策略自上而下的方法構建游戲場景的包圍盒樹,進行碰撞檢測,引進流水線技術對檢測進行加速。
3.如權利要求I或2所述的方法,其特征在于,在流水線技術中,問題被分成一系列必須是一個接一個完成的任務,每個任務由獨立的進程或處理器執(zhí)行,采用下列3種計算類型,用流水線方法進行加速 (1)執(zhí)行整個問題的多個實例; (2)必須處理一系列的數(shù)據(jù)項,而每個數(shù)據(jù)項需要多次操作; (3)進程在完成自己的所有內(nèi)部操作之前能夠把下一個進程啟動所需的信息向前傳送; 將上述三種情況分別定義為類型I、類型2、類型3。
4.如權利要求I所述的方法,其特征在于,AABB平衡包圍樹的構建過程如下 (1)對每個物體建立其整體的包圍盒,將其作為該物體平衡包圍盒樹的根結點,此結點包含了組成此物體的所有多邊形; (2)由于使用的是AABB包圍盒,采用基于分裂平面的方法將根結點的包圍盒劃分成左右兩個子結點; 分裂平面的選擇是使包圍盒樹平衡的關鍵,首先確定分裂軸,使用最長軸方法,即選擇的方向軸是包圍盒在此方向上最長的;而后確定分裂點,選擇根結點集合中所有基本幾何元素的中心點在分裂軸上的投影,以最小點和最大點為兩個中心點,按距離將所有投影點分為兩組;將距兩中心點等距的點歸入含投影點少的一組。
5.如權利要求I所述的方法,其特征在于,具體的三維碰撞檢測方法的流程如下Stepl :輸入物體A和B,分別建立A,B的平衡包圍盒樹,轉(zhuǎn)St印2 ; Step2 :將(aO, bO)加入到任務樹節(jié)點存儲隊列LiveSet中,轉(zhuǎn)Step3 ; St印3 :判斷LiveSet是否為空,若不為空則轉(zhuǎn)St印4,否則轉(zhuǎn)St印11 ;Step4 :從 LiveSet 中彈出(aO, bO),轉(zhuǎn) Step5 ; Step5 :判斷(aO, bO)是否相交,若不相交則轉(zhuǎn)Step3,否則轉(zhuǎn)Step6 ; St印6 :判斷aO,bO的結點狀態(tài),aO,bO均為葉子結點,則轉(zhuǎn)St印7 ;a0, bO均不是葉子結點轉(zhuǎn)Step8 ;a0是葉子結點,bO不是則轉(zhuǎn)Step9 ;a0不是葉子結點bO是則轉(zhuǎn)SteplO ;Step7 :用基本幾何兀素對aO, bO進行碰撞檢測,若碰撞則返回True,否則返回False ;St印8 :將(al, bl),(al, b2),(a2, bl),(a2, b2)加入到 LiveSet 中,轉(zhuǎn) Step3 ; Step9 :將(aO, bl),(aO, b2)加入到 LiveSet 中,轉(zhuǎn) Step3 ;SteplO :將(al, bO),(a2, bO)加入到 LiveSet 中,轉(zhuǎn) Step3 ; Stepll :返回 False,結束。
全文摘要
本發(fā)明公開了一種三維碰撞檢測方法。采用分治策略自上而下的方法構建游戲場景的包圍盒樹,進行碰撞檢測,引進流水線技術對檢測進行加速。采用分治策略建立平衡包圍盒樹,使用的是兩路分治即二叉樹。其數(shù)據(jù)結構在預處理階段一次性建好。由于建立的包圍盒樹大致平衡,故并行遍歷包圍盒樹可極大提高碰撞檢測的效率。采用多級并行處理加速技術,不僅在單處理器而且在多處理器機器中都有很好的加速作用,引入多線程節(jié)省資源,并且能夠根據(jù)狀態(tài)智能地調(diào)整線程數(shù)量使得資源利效率最高。
文檔編號G06F9/38GK102663825SQ201210049318
公開日2012年9月12日 申請日期2012年2月29日 優(yōu)先權日2012年2月29日
發(fā)明者曾金龍, 李俊, 林謀廣 申請人:中山大學