虛擬汽車(chē)駕駛仿真系統(tǒng)研究
1 引 言
得益于現(xiàn)代計(jì)算機(jī)技術(shù)的高速發(fā)展,3D圖形的應(yīng)用領(lǐng)域日益廣闊。無(wú)論是科學(xué)研究、工程設(shè)計(jì)還是影視娛樂(lè)、模擬仿真,3D技術(shù)都憑借其真實(shí)、直觀、可塑性強(qiáng)等特點(diǎn)展現(xiàn)出強(qiáng)大的優(yōu)越性。虛擬汽車(chē)駕駛是3D技術(shù)在汽車(chē)領(lǐng)域的一個(gè)重要應(yīng)用。他采用圖形仿真手段產(chǎn)生逼真的三維虛擬空間,駕駛員在虛擬環(huán)境中駕駛虛擬汽車(chē),感覺(jué)就像是在操縱實(shí)車(chē)一樣。
目前該技術(shù)最為常見(jiàn)的應(yīng)用就是各類(lèi)賽車(chē)游戲,配合制作精良的賽道環(huán)境,令人感覺(jué)身臨其境。本文采用OpenGL語(yǔ)言構(gòu)建了一個(gè)虛擬汽車(chē)駕駛仿真系統(tǒng),重點(diǎn)研究了在虛擬汽車(chē)行駛過(guò)程中如何進(jìn)行視點(diǎn)切換以及如何實(shí)現(xiàn)車(chē)身因路面的起伏而產(chǎn)生顛簸的效果。
2 算法流程
OpenGL是一個(gè)功能強(qiáng)大的圖形系統(tǒng)軟件接口,他允許程序員創(chuàng)建交互式程序,生成具有真實(shí)感的圖像。圖1是使用OpenGL實(shí)現(xiàn)虛擬汽車(chē)駕駛的流程圖。
程序采用雙緩沖的繪圖方式。在顯示當(dāng)前幀的同時(shí),計(jì)算機(jī)在后臺(tái)計(jì)算汽車(chē)在下一幀中的位移、偏轉(zhuǎn)角、視點(diǎn)的位置、視點(diǎn)的朝向以及由顛簸引起的車(chē)身偏轉(zhuǎn)。計(jì)算好以后將這些參數(shù)傳遞給圖形函數(shù)進(jìn)行渲染,最后將渲染好的幀替換當(dāng)前幀。
3 關(guān)鍵技術(shù)
3.1 速度/方向的控制
本文的汽車(chē)采用的是一個(gè)由3DSMAX制作的吉普車(chē)模型。汽車(chē)的行駛方向由LEFT鍵和RIGHT鍵控制,前進(jìn)和后退由UP鍵和BACK鍵控制。系統(tǒng)坐標(biāo)采用右手坐標(biāo)系。
假設(shè)在ti時(shí)刻,汽車(chē)的速率為vi,在x-z坐標(biāo)系中,汽車(chē)的行駛方向與x軸正向的夾角為φi,汽車(chē)的位移為si={sxi,szi},那么在ti+1時(shí)刻,vi+1,φi+1和si+1可由式(1)得到:
3.2 視點(diǎn)切換
要實(shí)現(xiàn)三維場(chǎng)景中的虛擬駕駛,操作者的視點(diǎn)就必須隨著汽車(chē)的運(yùn)動(dòng)不斷地切換,以便實(shí)時(shí)地掌握汽車(chē)的運(yùn)動(dòng)狀態(tài)以及所處的環(huán)境。OpenGL的GLU函數(shù)庫(kù)提供了一個(gè)允許視點(diǎn)自由移動(dòng)的函數(shù)——gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz),他的功能就如同一臺(tái)攝像機(jī)。
{eyex,eyey,eyez}表示攝像機(jī)的位置,{centerx,cen-tery,centerz}表示鏡頭對(duì)準(zhǔn)的方向,{upx,upy,upz)表示攝像機(jī)頂面的法向量。
由于本文的視點(diǎn)切換是在一個(gè)平面內(nèi)進(jìn)行的,因此{(lán)upx,upy,upz)可設(shè)為常量{0.0,1.0,0.0}。為了讓汽車(chē)始終出現(xiàn)在我們的視野中,攝像機(jī)的位置必須不斷地隨汽車(chē)位置的變化而變化。本文的攝像機(jī)尾隨在汽車(chē)背后,并始終保持一定的距離。
{{分頁(yè)}}
除了實(shí)時(shí)改變視點(diǎn)的位置,還必須實(shí)時(shí)改變視線的方向{centerx,centery,centerz)。當(dāng)汽車(chē)沿直線行駛時(shí),視線方向正對(duì)汽車(chē)的背面,如圖2(a)所示。當(dāng)汽車(chē)轉(zhuǎn)彎時(shí),如果視線方向還是始終正對(duì)著背面,真實(shí)感就會(huì)降低不少。因此在汽車(chē)的轉(zhuǎn)角較大時(shí),讓車(chē)身在視野中產(chǎn)生一定的偏轉(zhuǎn),如圖2(b)所示。轉(zhuǎn)彎結(jié)束后,視線方向與汽車(chē)背面的法向量之間的夾角漸漸縮小,直到完全重合至圖2(a)所示效果。
3.3 顛簸效果
汽車(chē)在高低不平的路面上行駛時(shí)會(huì)產(chǎn)生顛簸。為了模擬這種現(xiàn)象,首先必須繪制一個(gè)起伏的地面,然后再考慮汽車(chē)產(chǎn)生顛簸時(shí)的狀態(tài)方程。
3.3.1 場(chǎng)景的繪制
場(chǎng)景的繪制采用天空盒的方法,地面部分略微有些起伏,以便配合汽車(chē)產(chǎn)生顛簸的效果。起伏地面的繪制采用網(wǎng)格化的方法。首先繪制一個(gè)平面網(wǎng)格,然后對(duì)網(wǎng)格上的各個(gè)交叉點(diǎn)賦予在一定范圍內(nèi)的隨機(jī)高度值,就產(chǎn)生了起伏的效果。
3.3.2 車(chē)輪高度的確定
汽車(chē)在行駛的過(guò)程中,每個(gè)輪子的高度都會(huì)隨著地面的起伏而變化,這是汽車(chē)產(chǎn)生顛簸的原因。假設(shè)某一時(shí)刻t,汽車(chē)的左前輪行駛至點(diǎn)s(sx,sy,sz)。其中sx,sz可以由式(1)得出,而sy則采用雙線性算法來(lái)計(jì)算。圖3為雙線性算法的原理圖。
P1,P2,P3,P4為S點(diǎn)所在網(wǎng)格的4個(gè)頂點(diǎn),其坐標(biāo)分別為(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),(x4,y4,z4)。P5,P6分別在P1,P3和P2,P4的連線上,其坐標(biāo)分別為(x5,y5,z5)和(x6,y6,z6)。由這些點(diǎn)的幾何關(guān)系,即可得到求sy的方程組:
3.3.3 車(chē)身的顛簸
車(chē)身的顛簸是由于車(chē)輪不在同一高度而產(chǎn)生的。在汽車(chē)行駛過(guò)程中,經(jīng)常會(huì)出現(xiàn)4個(gè)車(chē)輪不共面的情況,而導(dǎo)入的3DS汽車(chē)模型的輪子始終處于同一平面??紤]到虛擬場(chǎng)景中地面的高度值是通過(guò)隨機(jī)賦值得到的,無(wú)法保證車(chē)輪時(shí)刻共面,因此當(dāng)4個(gè)輪子不共面時(shí),就只能選取其中的3個(gè)輪子來(lái)確定車(chē)輪所在的平面。本文選取左前輪,左后輪和右后輪。假設(shè)在t時(shí)刻,這3個(gè)輪子的高度分別是Y1,Y2,Y3,如圖4所示。
圖4中,由左后輪指向左前輪的向量記為φ,由左后輪指向右后輪的向量記為ω,向量α為{0.0,1.0,0.0),他們和其余向量之間的關(guān)系是:
φ是向量α和β之間的夾角,且始終非負(fù)。顯然,汽車(chē)圍繞向量γ旋轉(zhuǎn)φ
評(píng)論