虛擬汽車駕駛仿真系統研究
1 引 言
得益于現代計算機技術的高速發展,3D圖形的應用領域日益廣闊。無論是科學研究、工程設計還是影視娛樂、模擬仿真,3D技術都憑借其真實、直觀、可塑性強等特點展現出強大的優越性。虛擬汽車駕駛是3D技術在汽車領域的一個重要應用。他采用圖形仿真手段產生逼真的三維虛擬空間,駕駛員在虛擬環境中駕駛虛擬汽車,感覺就像是在操縱實車一樣。
目前該技術最為常見的應用就是各類賽車游戲,配合制作精良的賽道環境,令人感覺身臨其境。本文采用OpenGL語言構建了一個虛擬汽車駕駛仿真系統,重點研究了在虛擬汽車行駛過程中如何進行視點切換以及如何實現車身因路面的起伏而產生顛簸的效果。
2 算法流程
OpenGL是一個功能強大的圖形系統軟件接口,他允許程序員創建交互式程序,生成具有真實感的圖像。圖1是使用OpenGL實現虛擬汽車駕駛的流程圖。
程序采用雙緩沖的繪圖方式。在顯示當前幀的同時,計算機在后臺計算汽車在下一幀中的位移、偏轉角、視點的位置、視點的朝向以及由顛簸引起的車身偏轉。計算好以后將這些參數傳遞給圖形函數進行渲染,最后將渲染好的幀替換當前幀。

3 關鍵技術
3.1 速度/方向的控制
本文的汽車采用的是一個由3DSMAX制作的吉普車模型。汽車的行駛方向由LEFT鍵和RIGHT鍵控制,前進和后退由UP鍵和BACK鍵控制。系統坐標采用右手坐標系。
假設在ti時刻,汽車的速率為vi,在x-z坐標系中,汽車的行駛方向與x軸正向的夾角為φi,汽車的位移為si={sxi,szi},那么在ti+1時刻,vi+1,φi+1和si+1可由式(1)得到:

3.2 視點切換
要實現三維場景中的虛擬駕駛,操作者的視點就必須隨著汽車的運動不斷地切換,以便實時地掌握汽車的運動狀態以及所處的環境。OpenGL的GLU函數庫提供了一個允許視點自由移動的函數——gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz),他的功能就如同一臺攝像機。
{eyex,eyey,eyez}表示攝像機的位置,{centerx,cen-tery,centerz}表示鏡頭對準的方向,{upx,upy,upz)表示攝像機頂面的法向量。
由于本文的視點切換是在一個平面內進行的,因此{upx,upy,upz)可設為常量{0.0,1.0,0.0}。為了讓汽車始終出現在我們的視野中,攝像機的位置必須不斷地隨汽車位置的變化而變化。本文的攝像機尾隨在汽車背后,并始終保持一定的距離。
{{分頁}}
除了實時改變視點的位置,還必須實時改變視線的方向{centerx,centery,centerz)。當汽車沿直線行駛時,視線方向正對汽車的背面,如圖2(a)所示。當汽車轉彎時,如果視線方向還是始終正對著背面,真實感就會降低不少。因此在汽車的轉角較大時,讓車身在視野中產生一定的偏轉,如圖2(b)所示。轉彎結束后,視線方向與汽車背面的法向量之間的夾角漸漸縮小,直到完全重合至圖2(a)所示效果。

3.3 顛簸效果
汽車在高低不平的路面上行駛時會產生顛簸。為了模擬這種現象,首先必須繪制一個起伏的地面,然后再考慮汽車產生顛簸時的狀態方程。
3.3.1 場景的繪制
場景的繪制采用天空盒的方法,地面部分略微有些起伏,以便配合汽車產生顛簸的效果。起伏地面的繪制采用網格化的方法。首先繪制一個平面網格,然后對網格上的各個交叉點賦予在一定范圍內的隨機高度值,就產生了起伏的效果。
3.3.2 車輪高度的確定
汽車在行駛的過程中,每個輪子的高度都會隨著地面的起伏而變化,這是汽車產生顛簸的原因。假設某一時刻t,汽車的左前輪行駛至點s(sx,sy,sz)。其中sx,sz可以由式(1)得出,而sy則采用雙線性算法來計算。圖3為雙線性算法的原理圖。

P1,P2,P3,P4為S點所在網格的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)。由這些點的幾何關系,即可得到求sy的方程組:

3.3.3 車身的顛簸
車身的顛簸是由于車輪不在同一高度而產生的。在汽車行駛過程中,經常會出現4個車輪不共面的情況,而導入的3DS汽車模型的輪子始終處于同一平面。考慮到虛擬場景中地面的高度值是通過隨機賦值得到的,無法保證車輪時刻共面,因此當4個輪子不共面時,就只能選取其中的3個輪子來確定車輪所在的平面。本文選取左前輪,左后輪和右后輪。假設在t時刻,這3個輪子的高度分別是Y1,Y2,Y3,如圖4所示。
圖4中,由左后輪指向左前輪的向量記為φ,由左后輪指向右后輪的向量記為ω,向量α為{0.0,1.0,0.0),他們和其余向量之間的關系是:

φ是向量α和β之間的夾角,且始終非負。顯然,汽車圍繞向量γ旋轉φ
評論