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