周守東
摘要:虛擬仿真滅火培訓系統(tǒng)的設計實現(xiàn)基于虛擬現(xiàn)實技術(shù),而碰撞檢測是虛擬現(xiàn)實得以實現(xiàn)的關(guān)鍵技術(shù)之一。模擬系統(tǒng)設計對AABB包圍盒碰撞檢測算法進行改進,提出基于Virtools網(wǎng)格的包圍盒算法。實驗表明,改進后的包圍盒算法減少了碰撞檢測的誤差,提高了模擬系統(tǒng)人機交互的沉浸感。
關(guān)鍵詞:虛擬仿真系
;Virtools;碰撞檢測;虛擬現(xiàn)實技術(shù)
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2017)14-0174-03
1概述
虛擬現(xiàn)實技術(shù)是一門富有挑戰(zhàn)性的交叉技術(shù)前沿學科和研究領(lǐng)域。是它多種技術(shù)集合,包括計算機圖形學、實時三維技術(shù)、廣角立體顯示技術(shù)、動作捕捉技術(shù),以及力反饋、網(wǎng)絡技術(shù)、語音技術(shù)等。使用者通過各種設備與計算機生成的虛擬空間完成各種交互行為,從而實現(xiàn)仿真交互。虛擬仿真模擬滅火系統(tǒng)是典型的虛擬現(xiàn)實系統(tǒng),基于虛擬現(xiàn)實技術(shù)模擬滅火培訓全過程;模擬火災場景,構(gòu)建真實感強的虛擬場景。在虛擬現(xiàn)實場景漫游中經(jīng)常要觸發(fā)的一個動作就是要進行碰撞檢測,碰撞檢測對增強虛擬場景漫游的臨場感起到了至關(guān)重要的作用。碰撞檢測是虛擬現(xiàn)實領(lǐng)域重要的研究課題。碰撞檢測做得好了不易被人注意到,但是做得差了卻很容易讓人發(fā)現(xiàn),人物經(jīng)常被卡住不能前進或者人物穿越了障礙。很多研究人員對此開展了系統(tǒng)研究,獲得了不少比較成熟的算法,如層次包圍盒算法中的AABB算法,OBB算法,還有k-DOP算法等。這些算法的主要關(guān)鍵點就是用形狀簡單的盒子圍住待測對像,以包圍盒與其他圖形的相交性來檢測。這些算法雖然方便快捷,但針對復雜圖形的物體誤差較大。隨著虛擬現(xiàn)實技術(shù)的普及和推廣,體驗者對虛擬仿真的要求也從新奇逐步升級為注重仿真度的體驗。用戶需求對虛擬仿真的模擬技術(shù)提出了舒適度及真實度的更高要求,虛擬仿真技術(shù)中采用的碰撞檢測算法對于虛擬仿真產(chǎn)品的體驗感有相當重要的影響,本文主要針對仿真模型采用的碰撞檢測算法是在傳統(tǒng)AABB包圍盒算法的基礎(chǔ)上進行優(yōu)化,對其不足進行改進。
2碰撞事件處理算法分析
2.1基于球形包圍檢測法的碰撞檢測
在虛擬場景中,為需要檢測的物體用一個不可見的球體進行包圍,即用球體來替代不規(guī)則物體進行碰撞檢測。當檢測到有包圍器發(fā)生碰撞時,采取相應措施,以避免碰撞。其實現(xiàn)思路如圖1所示。
包圍球碰撞檢測算法是虛擬仿真碰撞檢測最常用的一種基礎(chǔ)算法。算法使用球體作為基礎(chǔ)包容體,將碰撞檢測體進行包圍,以包圍球的碰撞檢測替代三維模型的碰撞檢測。包圍球碰撞檢測算法極大減少了碰撞檢測的復雜度,以最小的系統(tǒng)資源滿足了實時碰撞的響應速度,但對應的缺點是碰撞檢測精度不夠精確,誤差冗余較大,經(jīng)常會導致用戶的誤操作,用戶體驗度較差。
為了提高基礎(chǔ)包圍球算法的精度,在基礎(chǔ)包圍球算法的基礎(chǔ)上進行優(yōu)化,提出了球體樹解決方案。球體樹算法實際上是依據(jù)三維物體層次結(jié)構(gòu)構(gòu)造一個由基礎(chǔ)包圍球構(gòu)成的集合。具體實現(xiàn)方法為:首先分析三維模型的層次結(jié)構(gòu),根據(jù)其層次結(jié)構(gòu)對模型進行拆分;其次對拆分出的三維模型逐個進行碰撞檢測球體的包圍和綁定;最后依據(jù)包圍球數(shù)組的碰撞檢測結(jié)果,判斷是否發(fā)生碰撞檢測及碰撞部位。
球體樹算法解決了包圍球算法的碰撞檢測精度問題,缺點是對三維模型的分析和拆分較為復雜,球體樹內(nèi)部碰撞檢測判斷設定繁瑣,不利于技術(shù)的普及和推廣。
2.2基于AABB檢測法的碰撞檢測
包圍球雖然簡單,但用球體來包容一個三維物體,通過上述分析我們可以發(fā)現(xiàn)其中存在很多問題。盒子包圍法即是對作為碰撞檢測對象的球改成長方體,降低了碰撞檢測的計算維度,同時也會在布局上緊湊很多。
目前,盒子包圍碰撞檢測的算法主要有兩種,分別是AABB(axis-aligned bounding box)盒包圍算法和OBB(Orient Bounding Biox)盒包圍算法。
AABB(axis-aligned bounding box)盒子,即軸對齊包圍盒,主要用于比較規(guī)則的物體進行碰撞檢測。算法利用長方體對三維模型進行包圍,立方體的每一條邊都平行于一個坐標平面且與坐標系的軸垂直,如圖2所示。
與包圍球相同,針對復雜的三維模型,同樣可以構(gòu)建由包圍盒組成的AABB盒子樹。由于AABB盒子是一種降低維度的檢測計算,所以與包圍球檢測算法不同的是,AABB盒子樹之間的碰撞檢測更為優(yōu)化。對于兩個AABB盒子的碰撞檢測,我們僅需要在兩個維度上對坐標投影進行檢測便可以判斷兩者之間是否有碰撞發(fā)生,如果投影重疊表示有碰撞發(fā)生,反之則沒有發(fā)生碰撞,如圖3所示。
AABB盒子雖然簡單,但是當物體傾斜時,檢測盒就會隨之變大,一方面增加了系統(tǒng)檢測消耗,同時碰撞檢測精度也隨之下降;當物體發(fā)生旋轉(zhuǎn)時,對AABB盒子要進行重新的計算賦值,這時候就必須對物體的整個檢測系統(tǒng)重新進行定義,增加了系統(tǒng)負擔。
OBB(Oriem Bounding Box)盒子,即是帶有方向的包圍盒,它是在AABB盒子的基礎(chǔ)上增加了方向,使包圍盒能有解決任意方向的碰撞檢測,主要是對AABB盒子在檢測旋轉(zhuǎn)后的模型與其他模型之間的缺點進行強化。
3系統(tǒng)中的碰撞檢測設計
3.1設計模型及其包圍盒
決定碰撞檢測效率及質(zhì)量的因素,除算法外,還有一個很重要的因素就是場景管理。碰撞檢測對系統(tǒng)資源的需求,主要取決于場景中需要監(jiān)聽并解算碰撞的包圍盒的數(shù)量,即參與碰撞檢測的三維模型的數(shù)量。高效的場景管理,可以極大的減少當前運行場景中三維模型的數(shù)量,從而很大程度上提高系統(tǒng)運行速度及效率。
在場景管理條件相同的情況下,如場景中參與碰撞檢測的盒體數(shù)量為n,最原始的算法則是需要每幀對每個監(jiān)聽盒體進行逐個比較,即n(n-1)/2次,效率很低。針對碰撞檢測再加上時間就更麻煩,于是采取算法簡化策略,優(yōu)化監(jiān)聽對比效率,優(yōu)化簡略代碼如下:
3.2基于網(wǎng)格檢測的優(yōu)化
基于包圍盒的碰撞檢測技術(shù)在虛擬世界中應用的很廣泛,在Virtools里還提供了另外一種獨特的碰撞檢測的方法:通過Grid實現(xiàn)基于網(wǎng)格的碰撞檢測。在本項目中最終采用AABB碰撞檢測來完成常規(guī)碰撞檢測,利用網(wǎng)格碰撞檢測控制整個場景的大范圍,防止角色漫游出邊界導致系統(tǒng)運行出現(xiàn)錯誤。
具體實現(xiàn):場景中從俯視圖將場景投射到一個二維區(qū)域,將這個二維區(qū)域用網(wǎng)格加以細分和定義,使其作為一個不可見的三維體,賦予碰撞檢測屬性。這種碰撞檢測方法一般采用滑動的方法將角色控制在二維區(qū)域范圍內(nèi)。這種方法的優(yōu)點是比較簡單,但碰撞檢測的精度不高,而且對高度不同的地形,要根據(jù)地形的高度同步進行調(diào)整。
在投射的二維區(qū)域表面創(chuàng)建Virtools檢測網(wǎng)格,通過顏色來定義整個場景的邊界和碰撞檢測范圍,通過腳本和LayerSlider BB行為交互模塊完成對角色漫游范圍的控制。在VT中首先將地面賦予Floor屬性,然后通過Character Keep On Floor BB來實現(xiàn)角色跟隨地面高度的變化。
3.3仿真結(jié)果分析
建立測試場景,對優(yōu)化后的算法進行效率及成果驗證。為便于分析,在測試場景中制作AB兩組三維模型對象,A組模型對象適配于包圍盒,B組模型對象為AABB碰撞檢測存在缺點的狹長體。實驗設定一個用于碰撞檢測的剛體小球在測試框內(nèi)隨機出現(xiàn),分別記錄單位時間段系統(tǒng)檢測到的交叉碰撞次數(shù)。具體實驗中,單位時間段分別取值8s、10s及15s。實驗結(jié)果如表1所示。其中上面三行為AABB碰撞檢測算法成果數(shù)據(jù),下面三行為優(yōu)化后的Grid+AABB動態(tài)檢測算法。
通過分析可以得出:三維模型對象在采用Grid分割后濾除了對象誤差區(qū)域的碰撞,提高了碰撞檢測的正確率。通過實驗發(fā)現(xiàn),尤其是針對原始AABB誤差率較高的狹長形三維模型對象有著較大的優(yōu)勢。
4結(jié)束語
碰撞檢測技術(shù)是計算機虛擬仿真技術(shù)中的核心技術(shù)之一。碰撞檢測的精度很大程度上決定了虛擬仿真最終產(chǎn)品的數(shù)據(jù)真實性及用戶體驗滿意度。本文針對仿真滅火系統(tǒng)中設計到的碰撞檢測算法問題,以成熟的AABB包圍盒碰撞檢測算法為基礎(chǔ),針對AABB碰撞檢測算法在虛擬滅火碰撞檢測中存在的問題進行優(yōu)化設計。提出了在Virtools中基于Grid的AABB碰撞檢測算法改進方案,經(jīng)過實際案例測試,表明該方案不僅提高了系統(tǒng)運行效率,同時對軟件的碰撞檢測也有了較大的提高。