楊曉龍,崔偉寧
( 裝甲兵工程學院 信息工程系,北京 100072)
當前出現大規模全局戰爭的可能性已經非常渺茫,同時基于我國和平崛起的基本路線,發生局部戰爭的可能性也相對較小。在和平發展的時代大背景下如何保持和提高部隊戰斗力,隨時應對突如其來的惡劣情況,成為部隊戰斗準備的重要課題。虛擬現實( virtual reality,VR)是一種新的人機交互方式,利用計算機技術等多項技術生成一個逼真的三維視覺、聽覺、觸覺、嗅覺等虛擬感官世界。而利用虛擬現實技術來實現逼真的虛擬戰場可有效解決以上部隊需求問題。
戰場地理環境是指包括戰場位置、形狀等地理體征,戰場中道路、河流、樹木等地貌體征和日照、煙霧等自然現象在內的所有可見物理特征的總和。可以想象,在作戰模擬過程中地理特征隨時間和戰爭情況的變化十分小,可以認為他們是不變化的。而戰場環境的地貌體征可能受到戰斗破壞而導致狀態變化。因此,在顯示戰場地理環境時,可根據物體狀態是否有變化分為靜態和可變兩部分,分別針對他們進行構建,然后組合起來完成戰場地理環境的三維視圖,可有效提高實現效率。
戰場環境中的光照主要來自太陽光,在模擬戰場中設置一個點光源作為太陽,通過調節代表太陽的點光源的位置和輻射強度,就可以很容易的形成早晨、中午、夜晚的場景。另外大氣現象中存在的霧以及煙塵、污染物等,都會影響視覺效果,可使用OpenGL 中的霧化技術來達到模擬自然現象的效果。
對戰場中作戰實體的模擬主要體現在兩個方面:一是建立實體的幾何模型;二是讓實體在場景中運動起來[1],如飛機、坦克的幾何結構以及它們飛行、運動等各種行為。對于幾何結構,可以利用3D 軟件( 如3DS、AutoCAD 等)進行繪制,存為三維圖形文件( 如3ds 文件),再利用OpenGL 的相關函數處理這些圖形文件,形成作戰模擬場景中的實體。
實體的運動實際上是指在作戰模擬過程中實體特性的改變,包括位置與表面的變化。實體位置變化可通過對實體或其某一部分的移動、旋轉、縮放來實現。實體的表面變化主要是由碰撞引起的,需要計算相互碰撞的兩個實體的相對位置,一般可采用矩形邊界檢測方法進行碰撞計算,該方法雖然犧牲了一定的精確性,但提高了系統的實時性[2]。
特殊視景模型包括雨、雪、爆炸煙火等,這些特殊效果可以通過粒子系統來實現。
所構建的虛擬戰場場景中主要包括:天空體、地形、地物地貌、人造地物、作戰實體等,而漫游控制及時態勢信息也必不可少。其中較為復雜的是地形的建模與顯示、漫游控制及碰撞檢測等技術。
構造可漫游的虛擬戰場場景的一般步驟如下:
1)構造地形;
2)構造天空體;
3)建立人工地物及地貌特征;
4)為虛擬環境增加諸如雨、雪、霧等自然現象;
5)漫游控制的實現;
6)實時態勢信息的標注;
7)系統測試,包括漫游控制的靈活性、信息顯示的準確性、紋理是否會扭曲等。
該虛擬戰場場景是在Visual C++環境下通過調用Open-GL 函數庫編程實現的。OpenGL 函數庫與操作系統無關,使用OpenGL 函數庫以前要對其進行特定的初始化工作,使他與Windows 兼容。OpenGL 有專門的初始化函數可以利用,他的初始化工作包括:設置像素格式,建立繪圖描述表,清除緩存,光照初始化。
地形的模擬可以分為兩類:真實地形與模擬地形。真實地形和模擬地形的主要區別是數據來源,真實地形是現實世界中真實地形的再現,具有非常高的真實度,必須采用真實世界中的具體數據來構造,實現起來比較困難。如果在可視化過程中對地形的生成只是視覺上的要求,而非真實世界的再現,則可以采用模擬地形,即可以采用隨機生成地形高程數據的方法或使用高度圖的方法生產地形,這樣操作和實現起來都較為容易。
不管模擬哪種地形,通常都是采用經緯度線構成的規格化網格體逼近的方法,關鍵在于獲取網格點的有關參數,即經緯度、高程和顏色等數據。真實地形的高程值通常通過航拍圖片或衛星圖片獲取,而模擬地形的高程值則如上面所提到的,可采用隨機生成的方法或讀取高度圖文件得到。如果地形規模較大,一次性實現則需要大量的網格體,因而需要的數據量大,而可通過采用層次細節簡化LOD( level of details)的方法,以多層簡單的網格體復合形成復雜度高的網格體,來達到場景實時繪制的要求。
本文所構造的虛擬戰場場景采用的是模擬地形,而模擬地形又有兩種情況: 一種是比較平坦的地形,可采用平面模擬地形實現,這種辦法實現起來相對簡單,而且對系統資源的消耗較少。另一種是丘陵山地地形,此時要采用三維模擬地形實現,使用較多的是二叉樹地形模型[3]或四叉樹地形模型[4],而且根據視點與地形距離的遠近使用不同精度的格網繪制地形,在不失真的情況下減少資源消耗和復雜度,同時實現了使用LOD 技術對地形繪制的簡化[5],達到虛擬戰場場景的實時繪制和顯示的真實效果。圖1 ( a)是平面模擬地形網格,圖1( b)是二叉樹實現的三維網格地形。
天空體往往能起到增強虛擬場景真實感的效果,使人有更好的沉浸感。構造天空體常用的方法有兩種:一種是立方體盒天空體,它是采用霧化的天藍色背景,將天空紋理貼在立方體盒上。另一種是半球形網格天空體[6]。半球形的天空體有很多優點,但是比較復雜,處理不當會在兩極出現明顯的折皺。立方體盒狀的天空體則相對簡單一些,但是當離立方體盒邊緣近的時候天空會有明顯的變形,解決的方法是采用質量較好的全景貼圖,同時利用OpenGL 的霧化效果,在漫游時可以達到亂真的效果。本文采用的就是第一種方法,圖2 是本文在繪制天空體時使用的5 幅紋理貼圖。

圖2 盒狀天空體的紋理貼圖
在虛擬場景中加入諸如樹木、草地等地物地貌特征,可以大大增強虛擬戰場場景的真實感。本文在虛擬戰場場景中加入了300 棵樹木。
目前在三維虛擬環境中構造的樹木多采用以下三種形式:分形樹、仿真樹和Bill-board 樹。分型樹的形式占用系統資源較多,因而不宜在實時性要求較高的漫游場景中采用。仿真樹通過多邊形進行拼裝,形成樹冠及樹干,然后再在相應的部分貼上紋理,這種形式實現比較簡單,但是真實感不強。Bill-board 樹則是將一棵樹的圖片作為紋理貼到矩形面片上,然后對圖片中不是樹結構的部分進行透視處理,并且保證紋理始終正對觀察者,這樣一個面就可以表現為一棵樹,如圖3 所示是采用這種技術處理后的樹,就是本文采用的4 種不同的Bill-board 樹。

圖3 本文采用的4 種Bill-board 樹
除了地形、地物地貌以外,在虛擬戰場環境中還應該存在一些其他的三維實體對象,如表示各種軍事設施的實體以及在較高細節層次時的作戰實體,如坦克、汽車、推土機、飛機等。實體建模有兩種方法,一種是利用OpenGL 中的繪制API 函數,繪制簡單的幾何體,然后通過組合來建立模型,圖4 就是虛擬戰場中利用這種方式建立的雷達實體。另一種方法是通過專業的三維建模軟件,如3DS MAX 建立好模型,然后通過OpenGL 函數加載到虛擬戰場場景中,圖5 就是利用這種方式建立的推土機模型、直升飛機模型。

除了在虛擬戰場中增加以上三維實體模型以增強虛擬戰場真實感外,在虛擬戰場中加入模擬的士兵人物也是必不可少的一項重要內容,利用OpenGL 載入MD2 文件,可以實現栩栩如生的戰斗人員,增強了虛擬戰場的沉浸感。圖6 是虛擬戰場中的士兵人物。

圖6 戰場中的虛擬士兵
虛擬戰場場景中分布地域很廣,并有很多戰斗實體和地物地貌,視點就象攝像機的鏡頭,他的位置、方向和角度以及變焦鏡頭的變化,都將影響觀察者所看到的虛擬戰場的場景。視點變換的模式有很多種,如絕對模式、跟蹤模式、級聯模式、羅盤模式等[7-8]。
在絕對模式下,視點的位置和旋轉均由手工操作改變或程序預先設定;跟蹤模式中視點旋轉角度由被附著的實體決定,而位置可以進行人為的調整; 級聯模式中視點位置由被附著的實體決定,當確定了視點相對實體的位置后,視點就隨著實體運動[9];羅盤模式中視點的位置和指向都由被附著的實體決定,視點隨著實體的運動而運動,二者的相對距離可以事先確定。由此看以看出,這4 種視點變換模式的主要區別在于視點的位置和旋轉是由誰控制的問題,絕對模式下完全由操作人員決定,而羅盤模式下完全由實體決定,其他兩種由操作人員和附著實體共同決定。
關于場景的漫游,OpenGL 函數庫中有一個專門的函數,本文利用了這個函數gluLookAt( eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz)來實現漫游功能。
碰撞檢測問題是基于這樣一個事實:兩個不可穿透的對象不能共享相同的空間區域,其目的是發現碰撞并報告,即檢查兩個物體是否發生干涉[10]。
碰撞檢測算法大致可分為兩類:空間分割法和層次包圍盒方法。這兩種方法的目的都是為了盡可能減少需要進行相交測試的對象對或基本幾何元素對的數目[11]。空間分割法的基本原理是將整個虛擬空間劃分成等體積的小的單元格,然后只對占據了同一單元格或相鄰單元格的幾何對象進行相交測試,這樣大大減少了需要相交測試的對象數目。空間分割法比較適用于類似物體在障礙物之間飛行這樣的虛擬場合。
層次包圍盒方法的基本思想是用體積稍大且特性簡單的幾何體( 稱為包圍盒)來近似地代替復雜的幾何對象,并通過構造樹狀層次結構逐漸逼近對象的幾何特性。進行重疊測試時只需對包圍盒重疊的部分進行進一步的相交測試,從而可以大大減少參與相交測試的包圍盒的數目,提高碰撞檢測的效率。到目前為止,用于碰撞檢測的包圍盒主要有包圍球、坐標軸的軸向包圍盒( AABB)、帶方向包圍盒( OBB)、散方向多面體k-DOP、固定方向凸包FDH 等。
在實際應用中我們可以結合空間分割法和層次包圍盒方法同時使用,對于大的空間或區間首先用空間分割法進行劃分,排除不可能相交的測試對,對于在同一單元格內或相鄰的幾何對象進行測試時使用再使用層次包圍盒方法,進一步減少測試對,從而提高膨脹檢測的效率,尤其在實時性要求比較高的虛擬戰場環境中,這種途徑的優點更加突出。
在本文中碰撞檢測主要針對兩種碰撞情況。一是主觀點( 漫游者)與樹木、3D 模型實體的碰撞繞行;二是子彈在飛行過程中擊中目標產生的爆炸的過程。
碰撞繞行算法:zhangai( )的入口參數是上一步視點的位置,進入zhangai( )后,用當前視點位置( X,Y)和所有對象的位置( X,Y)進行比較,即障礙檢測。如果兩者的位置差小于給定值就認為有碰撞發生,有碰撞時再分別看是在哪個分量上發生的碰撞,對發生碰撞的分量取上一步的值。這樣就實現了碰撞的繞行。
子彈擊中目標的算法很很多種,最簡單的是直接以瞄準點為爆炸點,這種算法以屏幕定位為基準,無需碰撞檢測,但是這樣只能實現爆炸效果,不能模擬虛擬戰場中戰斗的真實效果,如擊中目標后出現的狀態變化,因此,此方法有一定的局限性。本文是基于運動物體碰撞檢測的原理,子彈發射后,在飛行過程中隨時檢測是否與其他物體發生碰撞。當檢測到子彈與其他任何物體發生碰撞時,子彈就會爆炸,這樣更加真實,同時檢測到與子彈發生碰撞的實體發生狀態的變化,如士兵被子彈擊中后應由活躍狀態變為死亡狀態,即有自由活動的實體變為固定狀態的實體。子彈碰撞檢測函數Hitexamina( float x,float y,float z),射擊函數fire( )調用此函數,判斷是否命中目標以決定子彈的爆炸。


虛擬現實技術是綜合性極強的高新技術,被認為是仿真技術最熱門的發展方向。利用虛擬現實技術建立虛擬戰場仿真系統是部隊未來訓練、演習等的重要研究課題,它將軍官戰術訓練拓展到模擬實戰新的訓練領域,較好地解決常規訓練方法中存在的問題,能充分調動各級軍官戰術訓練的積極性和深入研究戰術思想的主動性。本文的研究對于部隊深入開展未來虛擬作戰仿真系統有一定借鑒意義。
[1]徐明亮,盧紅星,王琬.OpenGL 游戲編程[M].北京:機械工業出版社,2008.
[2]Robert Short,Pamela Kiley,Rodney Ritter.2D Polygon Detection[R].Simulation Interoperability Workshop,2009.
[3]林繼承,萬旺根,周俊瑋.等.基于三角形二叉樹的實時大規模地形渲染算法[J].計算機工程,2009,35(2):268-270.
[4]李穎,陳業斌.基于四叉樹的三維地形繪制算法[J].安徽工業大學學報:自然科學版,2008,25(1):80-82.
[5]彭海.三維地形可視化技術的研究與實現[D].武漢: 武漢理工大學,2010.
[6]David W.Seidel.Generating Terrain Based on Bitmap File[R].Simulation Interoperability Workshop,2010.
[7]M Pauline Baker,Robert J. Stein. BATTLEVIEW: TOURING A VIRTUAL BATTLEFIELD[D]. Illinois: University of Illinois,2009.
[8]馬峰.基于OpenGL 的虛擬戰場環境構建[D].大連:大連理工大學,2006.
[9]Judith Dahmann,Marnie Salisbury,Lashon Booker,et al.An Extension of DIS Virtual Simulation[R]. Standardsfortheinteroperation of Defense Simulations:22102,2004.
[10]邊美玲,任建平.包圍盒碰撞檢測技術的研究[J].機械管理開發,2008,24(2):27-31.
[11]劉曉東,姚蘭,邵付東,等.一種基于混合層次包圍盒的快速碰撞檢測算法[J]. 西安交通大學學報,2007,41(2):141-145.