孫 旺,劉 西,南 英
(南京航空航天大學航天學院,江蘇南京 210016)
Vega Prime由Multigen-Paradigm公司開發,當前被CA公司并購。Vega Prime是一款實現高性能三維視景仿真的軟件,它取代了之前版本的Vega,引進了較新的編譯器和新的圖形學相關理念和技術,使得用戶可以更加方便地配置視景仿真,能夠滿足各種背景條件下的實時仿真要求[1]。
MFC是微軟基礎類庫,采用MFC對話框程序可以方便地構建人機交互界面[2],實現對Vega Prime API的充分利用,同時擴展了Vega Prime的交互性,便于人對仿真過程的參數設置,由于MFC的封裝效果,操作人員可以通過改變輸入參數和文件實現在不接觸代碼的情況下改變仿真場景以達到相應的視景仿真效果要求。
Vega Prime在提供高級仿真功能的時候滿足:支持跨平臺性,可以在任意操作系統平臺上開發,且無需更改即可換平臺使用;與C++STL兼容,這也使得MFC框架構建以及運行成為可能;具有多種可擴展模塊以滿足不同的仿真要求;同時支持OpenGL 1.2和Direct3D 8等。
本文在構建視景仿真時使用Vega Prime2.2及配套的開發工具VS2005,主要完成了以下工作:設計開發的基本流程,從兩個方面研究了航空飛行器動態視景仿真:三維數字高程地圖模型中的飛行軌跡展示,海上空投數據的實時刷新,視角動態切換和目標幀的捕獲。
近年來,各種類型航空飛行器已經不僅僅運用于軍事背景下,同時還服務于社會生產生活,在越來越多的任務中驗證飛行過程以及目標完成的可靠性時,需要繁雜且費力的實驗,而通過航空飛行器視景仿真可以減少經費開支,確保安全。
同時在航空數據處理方面,科學技術的發展使得航空數據量包含的信息越來越多,而視景仿真可以將其轉換成直觀的幾何圖像信息,便于綜合分析,解決問題。
因此,航空飛行器的視景仿真在整個任務系統中顯得越來越重要。
Vega Prime的應用主要由應用程序、應用配置文件和模型包等組成。其中,應用程序控制場景等動態模型,如通過VC7創建應用程序,而應用配置文件包含了應用在初始化和運行過程中的一切信息,配置成.ACF文件,模型包則是通過類似Creator創建的幾何模型(.Flt文件或大面積地形文件),三者共同作用即可實現相應任務要求。其配置關系如圖1所示。

圖1 Vega Prime的系統構成
Vega Prime視景仿真的開發可以從應用配置文件開始,在這里配置文件使用Lynx Prime,它可以通過圖形界面簡單地配置仿真的基本構架,大大簡化了開發的過程。通過對Lynx Prime圖形界面的配置滿足基本的框架要求,保存相應的.ACF文件,之后對于更高要求的視景仿真需要根據該.ACF文件生成相應的.cpp文件,直接生成的.cpp文件不能直接運行,需要經過些許改造,同時改正相應的錯誤,包括頭文件中包含的
#include "vpPathWayPointSet-WayPoint.h"
注釋該頭文件,并將涉及的所有該類型改為vpPathWayPointSet::WayPoint類型,在文件路徑presagisVega-Prime-2-2-1-VC8includevegaprime下修改頭文件VppatthFileWriter.h,提取其中名為vpPathSetSelector的部分并新建該名稱的頭文件。
同時對于.cpp中的部分函數:
SetRenderState()
直接生成的cpp文件該函數存在參數錯誤問題,可以通過重新定義的方式:
vpPathRenderState*state-lineyes=new
vpPathRenderState();
state-lineyes->setLineColor(…)
……∥配置渲染狀態
state-lineyes->setLineEnable(true); pPathWay-PathWay->setRenderState(state-lineyes);
以及addWayPointSet()函數的參數可能在自動生成過程中類型有誤。
之后設計需要滿足仿真要求的MFC框架,并將之前生成的.cpp文件改造為類中的靜態成員,根據基本要求相應地改造代碼實現視景仿真,基本流程如圖2所示。

圖2 開發基本流程
Vega Prime基本工作流程在主函數中可以分為初始化、定義場景、配置場景、設置窗體、幀循環,退出[3]。對于不同的仿真要求,場景的定義存在很大差別[4],同時對于要求更高的仿真可以在幀循環中對場景進行控制,圖2中的最后MFC界面及Vega Prime代碼配置框架具體如圖3所示。

圖3 Vega Prime主函數配置框架
飛行器在山地機動飛行,根據地理高程數據優化得到的飛行軌跡在展示過程中,需要與地形模型相搭配才能體現飛行軌跡優化的效果,地形制作對于視景仿真來說顯得格外重要。
Vega Prime有支持大地形數據庫的模塊vpLADBM,用于管理地形幾何數據,從MetaFlight格式文件讀取相應的信息。該地形制作方法功能強大,可以實現地形、貼圖、文化特征等的配置,但對于在Lynx Prime中的配置和MetaFlight的制作相對復雜。這里,采用OpenFlight格式數據文件實現對飛行場景的構建,功能較少但簡單可靠。
采用Creator軟件[5]制作OpenFlight格式的地形文件,關鍵在于飛機飛行區域跨度大,要求能夠在區域內任意優化出的飛行軌跡都能有對應的地圖場景模型。緯度范圍在25.690 849 753 6°-28.115 0°,經度范圍在99.178 938 259 5°-101.607 2°,經度、緯度的跨度都在數百公里。同時飛機的軌跡優化精度為30 m左右,需要保持地形精度與該精度相近。地形大,精度要求高,在電腦性能(8G內存)相對不足的情況下,采用地圖分塊制作[6-7],加載的方法可以滿足制作要求,在視景仿真過程中通過部分地圖塊加載來減小系統負擔,分塊如圖4所示。

圖4 地圖分塊情況
劃分完畢后,需要通過Global Mapper軟件將數據信息.ASC文件轉化為數字高程模型.DEM,在Creator的Terrain模塊中先由DEM文件生成對應的.DED文件,在新建的各個地圖塊中選擇地圖生成模式和間隔距離,高度差異由顏色深淺區分,可以得到上述36塊地形OpenFlight模型,其中A1模型如圖5所示。

圖5 A1地圖制作情況
地圖數據庫建立完成后,需要構建MFC框架,基本流程參考圖2、圖3,對于MFC的按鈕及相應的入口消息函數分別指定為:地圖數據庫模型文件、飛行器模型文件、飛行器軌跡數據文件、涉及地圖信息文件,運行及關閉按鈕。對于前四種處理函數都是返回一個文件地址或者一個文件夾地址留出接口給用戶自由配置,運行按鈕定義了主線程,同時添加了關閉控制參數用于關閉按鈕,地址返回消息處理函數可參照:
UpdateData(TRUE);∥寫入數據
∥指定文件限制類型
Char szFilters[]="vehicle-on-Earth-Orgn(*.m)|*.m|All Files (*.*)|*.*||";
∥定義路徑選擇對話框對象
CFileDialog objFileDialog(TRUE,NULL,NULL,OFN-HIDEREADONLY,szFilters,this);
int nRet=objFileDialog.DoModal();
if(nRet !=IDOK)
return;
CString strFileName=objFileDialog.GetPathName();
∥文件路徑賦值給CEdit類型控件變量
mfc-guijidatapath=strFileName;
∥賦值給全局變量 LX-global::lx-guijidatapath=mfc-guijidatapath;UpdateData(FALSE);∥顯示數據
構架完成后,已經配置好對外接口,內部數據傳遞通過定義全局函數LX-global將MFC的輸入信息傳遞到Vega Prime的Public-Member類中,同時LX-glob-al可以實現數據存儲,便于其他類的調用,其基本框架如圖6所示。

圖6 類關系圖
飛行器飛行軌跡以及地圖塊的配置在定義場景中,具體可以參照圖3中的PublicMember::CTS-Define()函數,在該函數中實現對飛行軌跡及地圖的加載。
輸入接口中包括四個文件,首先讀取涉及地圖信息文件,該文件含括地圖編號,并按照向南飛順序排列,向北飛倒序排列,使得第一項始終為飛行起點位置,同時還包含所有地圖的總量。讀取所有涉及數據信息,并獲得所涉及地圖塊的左下角經緯度坐標。配置過程根據地圖數據塊的數量進行循環配置,將軌跡的起點位置所在的地圖塊作為偏移量為0的地圖塊,這樣可以減小軌跡與地圖模型之間的誤差。同時記錄該地圖塊的經緯度坐標作為基準,偏移函數:
PObject-dixing[j]->setTranslate(0,0,0);
其中,PObject-dixing[]是vpObject定義的對象,j是循環次數變量從0開始,當為0時設置偏移量為0,之后根據該地圖經緯度與起始塊經緯度的差值設置地圖塊加載的偏移量:
Ix=(ll[0]-a[0])*cos(a[1]/180*3.14)*111 000;
Iy=(ll[1]-a[1])*111 000;
PObject-dixing[j]->setTranslate(Ix,Iy,0);
其中,ll是當前地圖塊的經緯信息,a是起始塊的經緯信息,其余配置默認,并將其添加到定義的myScene的子類下。
軌跡的讀取配置有兩種方法:其一通過坐標轉換vpCoordSys模塊,將經緯度坐標直接配置到路徑之中,通過該轉換將坐標投影到以起始經緯度為基準的路徑當中,該方式實現軌跡效果良好,但對姿態不可控。這里采取第二種方法,直接坐標轉換,坐標轉換方式同上,變量名換為mx,my,mz為高度:
Pathway-pointset[i]->setPosition(mx,my,mz);
Pathway-pointset[]為vp::PathwayPointSet::Way Point定義的對象,i為第i個點,同樣可以控制姿態:
Pathway-pointset[i]->setOrientation(h,p,r);
實現了航空飛行器的6D飛行軌跡展示,具體流程參照圖7。

圖7 地圖-軌跡配置流程
剩余文件即飛機模型的配置,對于任意飛行器模型只要確定文件路徑,即可加載到視景仿真系統中。
對于完整的MFC程序框架,須在程序非正常執行時返回到就緒狀態。這就要求在定義場景中,有錯誤檢測,一旦觸發就提示消息,并返回到初始狀態。本程序通過LX-global全局類函數記錄程序運行錯誤信息,并在返回線程主函數時進行消息提示,如圖8所示。

圖8 非正常運行錯誤提示圖
對于起點位置經緯度99.8°,26.4°,終點位置經緯度100.5°,27.5°,正確配置文件后得到仿真結果如圖9所示。

圖9 仿真結果
飛行器海上空投視景仿真的主要目的是完整展現空投的整個過程,對于由不同的初始條件引起的空投結果區別,可以通過視景仿真進行直觀的觀察,從而對不同初始條件下的空投效果進行比較,尤其是對落體在空中的姿態變化和落點位置的變化。
與飛行器山地飛行相同的是開發的基本流程,如圖2、圖3。區別在于:飛行器山地飛行關鍵在于任意飛行軌跡與相應的地形相契合,而飛行器海上空投重點在于仿真背景構建及相應控制功能的實現,因此兩者側重點不同,涵蓋了更多關于航空飛行器視景仿真的要點。
海上空投救援物資的基本背景包括:海洋,飛行器,救援物資模型,遇難船只模型,環境等。由基本流程框架圖2可知,首先在Lynx Prime中基本實現整個視景仿真的框架,該框架是為了之后在MFC中添加控制功能以實現完整的視景仿真,Lynx Prime的基本配置過程如圖10所示。

圖10 Lynx Prime配置過程
在窗口下定義不同的通道,以從不同角度分別展示空投救援物資的過程,包括固定視角俯視,其可用于觀察救援物資落點位置與目標位置以及救援物資下落軌跡的偏航情況;固定視角側視,其可用于觀察落體的軌跡在初始速度方向所在的鉛錘面的軌跡。從以上兩個視角可以完整的觀察到軌跡情況,對于最后一個窗口用來觀察救援物資在下落時的姿態變化,而姿態變化的鏡頭配置上先采取vpMotion運動模式,以落體中心為旋轉中心,可以通過鼠標調整角度以及視角相對下落物體的距離。各個窗口占比,姿態觀察窗口占右半窗口,軌跡觀察窗口平分左半窗口。
海洋環境Vega Prime中有兩種方式:1)直接使用自帶的ocean.flt文件;2)使用Vega Prime的海洋模塊vpMarine。ocean.flt文件配置簡單方便,但是效果遠不如海洋模塊。這里配置使用海洋模塊,具體需要設置海洋位置為以觀察者為中心,海浪生成參數等,同時需要將三個通道的觀察者配置到海洋模塊下,防止部分通道缺少海洋景象,或者配置三個海洋模塊分別與相應的通道觀察者結合。除了海洋場景,還有云層、太陽等一些其他的環境因素,同樣配置在各個觀察者中。
配置各個模型在該場景下的運行軌跡,飛機的飛行軌跡設為高度不變且沒有偏航的直線,救援物資的軌跡由軌跡文件給出,小船是為增加場景的完整度,其軌跡盡可能靠近落點目標區域。Lynx Prime中配置軌跡使用vpPath模塊按照相應的順序,在運動對象文件下進行配置,包括導航器、路徑、插值算法、路徑集合選擇器、路徑點集合、路徑點。可以通過手動配置各個數據點,也可以通過.WAY和.NAV文件直接配置,當路徑點數較多又需要在搭建框架時考量路徑時,考慮使用.WAY文件,該文件的格式是XML超文本標記語言,生成該類文件只需通過VC對軌跡數據文件進行相應的讀取,同時對.WAY文件嚴格按照所給格式要求寫入即可,使用時直接import該.WAY文件再配置到正確位置即可。對于還要生成C++文件進行動態配置軌跡的視景仿真來說,可以在二次開發的過程中進行軌跡加載,此時不能通過預運行檢驗基本框架。
仿真過程缺少特效,仿真的逼真程度大打折扣。救援物資落水后會產生相應的水花,實現該效果需要使用vpFx特效模塊和vp模塊中的碰撞檢測[8-10]。由于救援物資的外包裝為長方體,因此使用包圍盒算法,將救援物資視為長方體包圍盒,將碰撞對象海面視為水平面,則判斷救援物資與海面是否碰撞的依據是:長方體的8個頂點中是否有一個點或多個點在海面的下方。具體情況如圖11-圖13所示。圖11中,整個長方體在平面上方,表示救援物資與海面沒有發生碰撞;圖12中,長方體的一個頂點在平面上,其余頂點都在平面上方,表示救援物資與海面沒有發生碰撞;圖13中,長方體的一個頂點在平面下方,表示救援物資與海面發生碰撞。

圖11 未發生碰撞

圖12 臨界情況

圖13 發生碰撞
當長方體包圍盒與平面相接觸時會產生一個信號,產生相應的落水特效,通過vpFx特效模塊可以產生任意形態的水花。相關水特效即濺起水花的形態(角度、高度等),與落水物體的形狀、質量、落水時的姿態與速度等有關,可由流體力學計算得出。本文只作救援物資落水的特效展示,水花的細節并非經過嚴格計算得出。
碰撞對象只能在海洋模塊下添加Ocean.flt模型,小船的模型添加vpFx火焰與煙霧的特效,在海洋模塊中還配置其生成的艦首破浪和艦尾尾浪特效,均使用海洋模塊中的特效。
視點與軌跡距離較遠,無法具體看到落體的實時位置,因此,為觀察完整的軌跡,對落體進行相應的標記,使用vpOverlay模塊中的“LineStrip”,根據各個點的排列順序形成一個“X”形標記,設置標記對象為落體,在仿真過程中即可以看到落體在軌跡上的實時位置。
Lynx Prime配置如圖14所示。

圖14 Lynx Prime配置圖
運行后效果圖如圖15所示。

圖15 Lynx Prime預運行示意圖
Lynx Prime搭建完成框架后,輸出為.CPP文件,并構建MFC基本框架,其流程如圖3,而類之間的關系參照圖6。VC實現控制功能具體包括添加多條軌跡、對于不同軌跡設置不同的投放時間,即延時投放或提前投放,同時設置投放倒計時時間,將以上兩項設置為輸入,實時顯示當前速度值,當前時間以及根據設置的投放倒計時顯示當前的倒計時時間,在程序運行時作為輸出顯示;設置視角切換,可以在視景仿真運行時切換視角觀察不同的落體下落情況;設置獲取當前幀,定格當前幀畫面以便分析。
在MFC對話框類中,配置窗口界面的輸入和輸出信息,可參照圖16。

圖16 VC控制功能
定義開始,退出按鈕,其中在開始按鈕的消息響應函數中獲取ID為IDC-grScene的分組框句柄,并賦值給CTS-RunningWindow,以此作為Vega Prime應用程序的運行場所,為控制變量賦值,即允許幀循環并將退出標志置假,最后啟動線程主函數。
定義切換視角按鈕,在消息響應函數中對標志位進行重復的取反賦值操作,實現對兩條不同軌跡觀察視角的來回切換,同理定義獲取當前幀按鈕,實現對當前幀的暫停與繼續。
設計輸入為投放延時時間和設置倒計時時間,投放延遲時間決定兩個救援物資投放時間的差值,以區別兩條下落軌跡,設置倒計時時間,模擬飛行過程中投放時機判斷。在MFC框架中,定義數據顯示按鈕,并在其消息響應函數中通過while循環不斷地對編輯框變量進行賦值,并手動推動消息循環,直到有仿真結束的信號為止。
在PublicMember類中主要針對場景定義函數CTS-Define()以及主線程函數中的幀循環進行配置。
開始按鈕按下后,進入主線程并按照如圖3所示進行相應的配置,在主線程中設有關閉控制變量,由退出按鈕改變該變量繼而控制程序的退出。
在主線程中的CTS-Define()函數下實現對之前由Lynx Prime配置的.ACF輸出的.CPP的修改,包括軌跡點的加載,對照軌跡的設計。倒計時時間決定投放前的飛行時間,延遲時間決定投放物資的時間間隔,通過這兩個輸入值實現對上面函數的改造,具體過程可參照圖17。

圖17 CTS-Define()軌跡點配置
路徑點配置完成后,畫面的配置完成,在幀循環中實現對仿真過程中每一幀的展示,同時還要實現MFC程序中的數據刷新,視角切換和目標幀獲取。
在主線程函數的幀循環中實現對于數據的更新,仿真時間的更新從0開始計數,在幀循環的開始時刻設置仿真時間為0。
vpKernel::instance()->setSimulationTime(0);
在幀循環內部,首先獲取當前的時刻,采用:
vpKernel::instance()->getSimulationTime();
并將該函數的返回值最終賦到mfc類的變量當中,投放倒計時與當前時間相關,幀號,幀率等與時間函數設置類似:
vpKernel::instance()->getActualFrameRate();
對于實時顯示的速度值,可以采用多種方式獲取。一元區間不等距插值,或自帶函數獲取。
由按鈕實現視角的切換,在兩條飛行軌跡中進行視角切換,具體方法包括:1)在定義場景的過程中定義鏡頭的軌跡,并控制策略使能為真,即按照預定義的飛行軌跡點飛行,當設置切換時,更改對應鏡頭的飛行軌跡路徑。該方法實用性好,切換速度快,并且切換后穩定性好,缺點是對于場景定義配置。2)實時獲取鏡頭當前位置,并再次為鏡頭配置切換后視角的位置。該實現方法靈活性較大,適用于變化較多的實時場合,但是切換后的鏡頭穩定性與電腦的處理速度相關。
根據以上的配置來展現海上空投的整個過程,可以實現數據的實時刷新,視角動態切換和目標幀的捕獲,仿真結果如圖18所示。

圖18 海上空投視景仿真
本文詳細介紹了Vega Prime結合MFC應用程序的開發流程。針對視景仿真中大范圍地圖的飛行仿真加載問題,給出了大地圖制作及飛行軌跡生成的詳細過程;針對海上空投過程完整展現的問題,給出了仿真背景的構建及相應控制功能的實現。本文為相關Vega Prime視景仿真的開發提供一定的參考。