程乃偉+李想+蔣波沱+董宇佳+黃輝
摘 要:采用基于Vega Prime的三維仿真技術(shù),結(jié)合MFC在單文檔程序框架下利用定時器的方式,通過實(shí)例模擬火災(zāi)現(xiàn)場,實(shí)現(xiàn)多視角的相互切換,并可應(yīng)用于進(jìn)一步的仿真模擬中,達(dá)到全方位觀測事故現(xiàn)場的目的。
關(guān)鍵詞:Vega Prime;視角切換;文檔視圖;應(yīng)急救援
DOI:10.16640/j.cnki.37-1222/t.2015.24.026
1 引言
隨著虛擬現(xiàn)實(shí)技術(shù)的發(fā)展,視景仿真模擬技術(shù)正與越來越多的技術(shù)領(lǐng)域相結(jié)合?;赩ega Prime的仿真模擬技術(shù)可實(shí)現(xiàn)對火災(zāi)現(xiàn)場應(yīng)急救援工作的再現(xiàn),有助于查明事故發(fā)生原因,找到事故的因果關(guān)系。本文利用Vega Prime仿真模擬技術(shù)在MFC單文檔框架下,實(shí)現(xiàn)界面上的多視角仿真的同步切換,再現(xiàn)火災(zāi)事故現(xiàn)場為事故調(diào)查分析提供清晰的畫面感。
2 火災(zāi)應(yīng)急救援場景模擬及視角切換的實(shí)現(xiàn)
2.1 MFC客戶區(qū)的視圖分割
用戶界面作為系統(tǒng)與用戶之間直接交互手段,可應(yīng)用MFC實(shí)現(xiàn)可視化界面。窗口視圖分割可以使程序的功能分區(qū)更加明確,在MFC中提供了CSplitterWnd類,可以方便地實(shí)現(xiàn)窗口分割。其有兩種使用方法,一是調(diào)用Create成員函數(shù)可創(chuàng)建動態(tài)分割窗口,另一種是調(diào)用CreateStatic成員函數(shù)進(jìn)行創(chuàng)建靜態(tài)的分割窗口。
由于本例中只需創(chuàng)建靜態(tài)分割窗口即可,所以需要調(diào)用CreateView類為靜態(tài)分割的窗口創(chuàng)建視圖,并在參數(shù)中指明新視圖的行列序號,類名稱,新視圖的起始大小以及創(chuàng)建視圖的上下文指針。
在分割視圖前需對整個程序界面進(jìn)行初步設(shè)計,分為VP場景顯示區(qū)、信息顯示區(qū)、功能按鍵區(qū)。其具體過程為:(1)在CMainFrame中定義CSplitterWnd對象(2)重載框架類虛函數(shù)OnCreateClient(3)在OnCreateClient中用CSplitterWnd對象調(diào)用CreatStatic將窗口分割為2行1列,再調(diào)用CreatView創(chuàng)建CMyVPView類和CMyEditView類分別用于顯示場景和文字狀態(tài)顯示。(4)創(chuàng)建一個對話框資源,設(shè)置其風(fēng)格為Child,無邊框,為其添加新類,選擇基類為CDialogBar,并在CMainFrame中添加變量,調(diào)用Create函數(shù),這樣就已將對話框以工具條的形式鑲嵌在框架上。
2.2 視圖窗口中顯示Vega Prime的場景
Vega Prime 應(yīng)用程序的基本運(yùn)行流程是:初始化VP,定義ACF,配置ACF, 運(yùn)行幀循環(huán)以及最后退出幀循環(huán)?;贛FC的Vega Prime程序在對話框和單文檔內(nèi)均可實(shí)現(xiàn),其運(yùn)行方式即可基于線程,也可基于定時器。
本例中采用基于定時器的單文檔程序運(yùn)行Vega Prime。其過程為:(1)在CMyVPView類WM_CREATE消息響應(yīng)函數(shù)中對VP進(jìn)行初始化、設(shè)置ACF文件、加載ACF文件、設(shè)置父窗口、調(diào)用beginFrame/endFrame 打開Vega Prime 窗口、設(shè)置定時器用來更新場景。(2)在WM_TIMER消息響應(yīng)函數(shù)中運(yùn)行幀循環(huán),按設(shè)置的好的幀數(shù)更新VP場景。(3)在WM_SIZE響應(yīng)函數(shù)設(shè)置窗口大小,可動態(tài)調(diào)整。(4)重載虛函數(shù)OnActivateView設(shè)置VP窗口為輸入焦點(diǎn)(5)最后在CMyVPView類的析構(gòu)函數(shù)中關(guān)閉VP,退出幀循環(huán)。
2.3 場景的視角切換
Vega Prime中各類實(shí)例之間有著清晰的層次關(guān)系,根據(jù)實(shí)例樹圖可知其順序?yàn)椋汗艿纕pPipeline→窗口vpWindow→通道vpChannel→觀察者vpObserver→場景vpScene→對象vpObject→轉(zhuǎn)換vpTransform等。
在視角切換的過程中,關(guān)鍵環(huán)節(jié)為觀察者的設(shè)置,由于場景的通道配置與觀察者關(guān)系通常固定不變,對象與轉(zhuǎn)換間的關(guān)系也相對固定,因此,將動態(tài)配置觀察者的觀察目標(biāo)與觀察點(diǎn)成為了問題的關(guān)鍵。作為觀察者vpObserver目標(biāo)的不僅有對象vpObject,也可以是對象的轉(zhuǎn)換vpTransform,這就便于在觀察者以更佳的角度進(jìn)行觀測目標(biāo),對于個別對象將觀察者觀察點(diǎn)設(shè)置為其轉(zhuǎn)換坐標(biāo)既可以觀察其自身的狀態(tài)、動作,又可以觀察其對場景中其他對象、環(huán)境的影響。
本例設(shè)計一個通道為主觀察通道,三個副觀察通道,可隨時隨意將三個副觀察通道的場景載入到主觀察通道中,所以首先為VP的窗口分配了四個通道,分別為ambulanceChannel(AC)、towerChannel(TC)、firetruckChannel(FC)、mainChannel(MC)。其中AC作為救護(hù)車視角專用通道,TC作為塔高視角專用通道,F(xiàn)C作為消防車視角專用通道,MC作為切換視角的預(yù)留通道,可設(shè)置其默認(rèn)通道為TC。
然后為四個通道分別配置觀察者:ambulanceObserver(AO)、towerObserver(TO)、firetruckObserver(FO)、mainObserver(MO)。為實(shí)現(xiàn)通道顯示不同的場景只需對其觀察者進(jìn)行動態(tài)配置,由于AO、TO、FO在程序運(yùn)行中不做變化,所以只對MO進(jìn)行動態(tài)配置即可。在MO配置頁面中,可設(shè)置Look At Target和Look From Target來設(shè)置觀察者的目標(biāo)觀察物和觀察點(diǎn),同理在MFC程序可通過Button控件的響應(yīng)函數(shù)來動態(tài)設(shè)置MO的目標(biāo)觀察物和觀察點(diǎn)。
其過程如下:(1)對觀察者目標(biāo)指針、相關(guān)觀察物與觀察點(diǎn)進(jìn)行靜態(tài)化改造;(2)在相應(yīng)的控件響應(yīng)函數(shù)中,用觀察者指針調(diào)用setLookAt和setLookFrom并根據(jù)需求設(shè)置參數(shù);(3)用內(nèi)核實(shí)例調(diào)用beginFrame和endFrame對場景進(jìn)行刷新;(4)格式化相應(yīng)文本信息字符串,調(diào)用SetWindowText顯示文本信息。
3 總結(jié)
Vega Prime視角切換方法,可運(yùn)用于火災(zāi)現(xiàn)場應(yīng)急救援的模擬過程及各種視景仿真開發(fā)的基礎(chǔ)功能。基于MFC的Vega Prime程序的操作更加靈活,一定程度上簡化了用戶的操作,本文范例程序具有良好通用性、實(shí)用性和可擴(kuò)展性,為后續(xù)開發(fā)提供支持。
作者簡介:程乃偉(1960-),男,遼寧沈陽人,碩士,教授,碩士生導(dǎo)師,研究方向:信息化安全技術(shù)。endprint