孫崠博,王潤杰
(空軍航空大學(xué)軍事仿真技術(shù)研究所,長春 130022)
隨著圖形渲染技術(shù)的迅速發(fā)展,對(duì)于視景仿真系統(tǒng)來講,物理真實(shí)感的缺乏成為了非常顯著的問題,嚴(yán)重影響了系統(tǒng)的沉浸性和交互性。問題的焦點(diǎn)是如何利用物理的方法為虛擬場景下的物體運(yùn)動(dòng)和物體間的交互進(jìn)行建模,于是本文引入了一種開放源代碼的物理引擎(open dynamics engine,ODE)來解決這個(gè)問題。ODE是一個(gè)模擬關(guān)節(jié)化剛體的工業(yè)級(jí)開源軟件,具有高級(jí)的聯(lián)結(jié)類型和碰撞檢測(cè)整合系統(tǒng),它功能全面、技術(shù)成熟而且平臺(tái)獨(dú)立,易于和C++API配合使用,非常適于對(duì)飛行器、交通工具和虛擬現(xiàn)實(shí)中物體的運(yùn)動(dòng)進(jìn)行模擬[1]。
本文的目的是建立一個(gè)基于PC機(jī)的三維物理引擎,其主要用途是作為虛擬環(huán)境中研究剛體運(yùn)動(dòng)和碰撞的仿真平臺(tái)。這個(gè)引擎既要實(shí)現(xiàn)物體的實(shí)體部分,又要運(yùn)行并用圖像顯示出物體運(yùn)動(dòng)和碰撞的過程。有關(guān)的物理現(xiàn)象如:自由落體、碰撞或物體在某個(gè)表面的滾動(dòng)滑動(dòng)等。
ODE的核心是經(jīng)典力學(xué)的基本原理的算法包,是牛頓力學(xué)的C++程序?qū)崿F(xiàn)。在ODE中,需要用其內(nèi)部定義的對(duì)象來模擬現(xiàn)實(shí)中存在的物體,然后,對(duì)其進(jìn)行控制和模仿來表達(dá)物理世界。ODE的對(duì)象主要包含世界 (dWord)、碰撞空間(dSpace)、剛體 (dBody)、幾何體 (dGeom)、節(jié)點(diǎn) (dJoint)、節(jié)點(diǎn)組(dJoint-Group)以及函數(shù)處理返回對(duì)象 (dWorldID、dBodyID),其中dWorld和dBody用于剛體動(dòng)力學(xué)模擬,而dspace和dGcom用于碰撞檢測(cè)。物理引擎的核心部分是碰撞檢測(cè),與其它許多仿真器采用虛擬彈簧的方式來處理接觸不同,ODE內(nèi)建的碰撞檢測(cè)系統(tǒng)采用硬接觸的方式,當(dāng)2個(gè)剛體相撞時(shí)不會(huì)出現(xiàn)穿透的情況的,大大提高了模擬結(jié)果的真實(shí)感和正確性。
下面簡單介紹ODE的一些概念[2]:
(1)世界是一個(gè)存儲(chǔ)物體對(duì)象的容器。在簡單的系統(tǒng)中,只需要建立一個(gè)世界對(duì)象,不同的世界對(duì)象之間不存在任何關(guān)聯(lián),不能互相影響。
(2)剛體即是在系統(tǒng)中主要操作的對(duì)象。剛體從模擬的角度說具有各種屬性,有些屬性隨時(shí)間而變化,如物體參考點(diǎn)的位置、線速度、朝向和角速度;另一些屬性不隨時(shí)間變化,如物體質(zhì)量、質(zhì)心相對(duì)于參考點(diǎn)的位置和慣量矩陣。
(3)幾何體是碰撞系統(tǒng)中的基本對(duì)象。幾何體可以是獨(dú)立的剛體,幾何體分為可置位和不可置位的??芍梦坏膸缀误w表現(xiàn)為一個(gè)剛體,它可以在更新變化時(shí)被改變。而不可置位的幾何體則用來表達(dá)環(huán)境中靜止不動(dòng)的物體。
(4)整合是按時(shí)間模擬剛體系統(tǒng)的過程。每個(gè)整合步將模擬從當(dāng)前時(shí)間前進(jìn)一個(gè)給定的時(shí)間步長,并計(jì)算新時(shí)刻的物體狀態(tài)。
(5)碰撞空間主要是用來簡化和加快碰撞檢測(cè)的一個(gè)對(duì)象,我們將幾何體插入到碰撞空間中,由碰撞空間執(zhí)行判斷、篩選,然后再調(diào)用碰撞檢測(cè),得出檢測(cè)結(jié)果。
典型的ODE模擬過程[3]:
①創(chuàng)建一個(gè)動(dòng)力學(xué)世界。
②創(chuàng)建動(dòng)力學(xué)世界中的剛體。
③設(shè)置所有剛體的狀態(tài)。
④創(chuàng)建動(dòng)力學(xué)世界中的關(guān)節(jié)。
⑤把關(guān)節(jié)與剛體連接。
⑥設(shè)置關(guān)節(jié)參數(shù)。
⑦創(chuàng)建碰撞世界(空間)和碰撞幾何對(duì)象。
⑧創(chuàng)建關(guān)節(jié)組來容納接觸關(guān)節(jié)。
⑨循環(huán):
a.把力施加于剛體。
b.調(diào)整關(guān)節(jié)參數(shù)。
c.調(diào)用碰撞檢測(cè)。
d.對(duì)于每個(gè)碰撞點(diǎn)創(chuàng)建一個(gè)接觸關(guān)節(jié),并加入接觸關(guān)節(jié)組里。
e.進(jìn)行一步模擬。
f.清除接觸關(guān)節(jié)組里的所有關(guān)節(jié)。
⑩刪除動(dòng)力學(xué)世界和碰撞世界。
整個(gè)系統(tǒng)是在Windows平臺(tái)上用Visual C++2008編譯實(shí)現(xiàn)的,系統(tǒng)的場景及添加的物理實(shí)體在OpenGL中創(chuàng)建,系統(tǒng)中用到的各種SDK均是開源的,具有良好的平臺(tái)移植性。系統(tǒng)測(cè)試生成動(dòng)力學(xué)世界和3種剛體,實(shí)現(xiàn)3種碰撞,如表1。
表1 碰撞檢測(cè)組合
下面是實(shí)驗(yàn)的6幅截圖,第1幅創(chuàng)建的動(dòng)力學(xué)世界和剛體,第2幅圖是包圍盒中的剛體,第3幅到第6幅是剛體之間的碰撞效果。程序能夠安全高效穩(wěn)定的運(yùn)行,圖形顯示正常流暢。物理引擎逼真的實(shí)現(xiàn)了場景渲染,能實(shí)時(shí)生動(dòng)地模擬出箱子、圓柱體等剛體的墜落、滾動(dòng)和碰撞,且碰撞的物體不會(huì)發(fā)生貫穿的現(xiàn)象,增強(qiáng)了視景仿真的真實(shí)感,提高了仿真世界物體之間的交互性,達(dá)到了初設(shè)目標(biāo)。利用包圍盒法進(jìn)行剛體的碰撞檢測(cè),接觸點(diǎn)不太精確,有時(shí)反彈的方向和速度不太合理,有待于進(jìn)一步改進(jìn)和完善。
簡要介紹了ODE基本理論,然后結(jié)合程序代碼分析了物理引擎ODE的結(jié)構(gòu)框架、碰撞檢測(cè)機(jī)制和物理仿真流程,并進(jìn)行了仿真實(shí)驗(yàn),結(jié)果表明在視景仿真中應(yīng)用物理引擎有效增強(qiáng)了虛擬場景中物體的運(yùn)動(dòng)真實(shí)感和交互性。另外,物理引擎的應(yīng)用,降低了視景仿真對(duì)計(jì)算機(jī)硬件的要求,代碼便于移植,并留有擴(kuò)展接口,使整個(gè)仿真系統(tǒng)實(shí)用性強(qiáng)、靈活性好。隨著計(jì)算機(jī)處理速度的提高和虛擬現(xiàn)實(shí)技術(shù)的進(jìn)步,人們對(duì)可視化仿真將提出更高的要求,物理引擎必然成為視景仿真領(lǐng)域的最受關(guān)注的課題而得到廣泛的應(yīng)用。
[1] 高嵩,陳先橋,楊菊.基于OGRE和ODE的駕駛模擬系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].交通與計(jì)算機(jī) 2006(1):101-104.
[2] 楊俊杰,臧淑英,姜美芳.虛擬現(xiàn)實(shí)中的物理引擎ODE與虛擬引擎OSG結(jié)合探討[J].測(cè)繪與空間地理信息,2010(1):66-68.
[3] Brian Beckman.The physics of racing Singapore[J].World Scientific,1997:50 -210.
(責(zé)任編輯周江川)