曹朋飛 邸彥強(qiáng) 馮少?zèng)_ 崔浩浩 陳志佳
(陸軍工程大學(xué)石家莊校區(qū) 河北省石家莊市 050000)
虛擬仿真是指真實(shí)人員操縱仿真系統(tǒng),通過(guò)電機(jī)控制、決策、通信等技巧實(shí)現(xiàn)人在回路的虛擬仿真系統(tǒng),其中三維模擬訓(xùn)練系統(tǒng)是虛擬仿真中的一種重要仿真形式。在武器裝備訓(xùn)練領(lǐng)域,裝備的操作往往需要多名操作手協(xié)同工作來(lái)完成特定任務(wù),因此在設(shè)計(jì)裝備的三維模擬訓(xùn)練系統(tǒng)時(shí)需要考慮多人協(xié)同作業(yè)的功能需求,以提高訓(xùn)練效果。目前多人協(xié)同的三維模擬訓(xùn)練系統(tǒng)均采用網(wǎng)絡(luò)互聯(lián)的方式實(shí)現(xiàn)協(xié)同功能,如采用基于C/S架構(gòu)的Socket通信或者采用基于分布式的架構(gòu)通過(guò)網(wǎng)絡(luò)中間件進(jìn)行通信。該方式對(duì)于多種裝備的大型模擬訓(xùn)練系統(tǒng)效果較好,但是在平臺(tái)級(jí)的單裝三維模擬訓(xùn)練系統(tǒng)中,采用網(wǎng)絡(luò)互聯(lián)方式實(shí)現(xiàn)多人協(xié)同效果較差,主要原因有兩點(diǎn):一是需要解決多個(gè)節(jié)點(diǎn)間的系統(tǒng)狀態(tài)同步問(wèn)題;二是該單裝模擬訓(xùn)練系統(tǒng)在與其他仿真系統(tǒng)進(jìn)行聯(lián)動(dòng)訓(xùn)練時(shí),由于自身拓?fù)浣Y(jié)構(gòu)復(fù)雜,不易集成。因此,針對(duì)平臺(tái)級(jí)單裝三維模擬訓(xùn)練系統(tǒng)提出一種新的多人協(xié)同作業(yè)技術(shù),即單機(jī)多人協(xié)同技術(shù)(Single-machine Multi-user Collaboration Technology,SMCT)。
SMCT在一臺(tái)計(jì)算機(jī)中連接多個(gè)顯示設(shè)備和多套輸入設(shè)備,通過(guò)對(duì)多套輸入設(shè)備的數(shù)據(jù)處理與驅(qū)動(dòng)實(shí)現(xiàn)多個(gè)操作手協(xié)同作業(yè)功能,避免了多用戶網(wǎng)絡(luò)互聯(lián)問(wèn)題,有效簡(jiǎn)化了系統(tǒng)結(jié)構(gòu)。同時(shí),使用一臺(tái)計(jì)算機(jī)即可實(shí)現(xiàn)模擬訓(xùn)練的多人協(xié)同功能,有效減少了成本。此外,在與其他仿真系統(tǒng)進(jìn)行互聯(lián)時(shí),采用單機(jī)形式的三維模擬訓(xùn)練系統(tǒng)與采用多機(jī)聯(lián)網(wǎng)形式的模擬訓(xùn)練系統(tǒng)相比,更易于集成。
在三維模擬訓(xùn)練系統(tǒng)中,為單臺(tái)計(jì)算機(jī)連接多個(gè)顯示設(shè)備和多套輸入設(shè)備,如鼠標(biāo)、鍵盤、觸控屏等,SMCT為每個(gè)用戶分配一個(gè)顯示設(shè)備和一套輸入設(shè)備,同時(shí)為每個(gè)用戶生成一套虛擬的輸入設(shè)備圖標(biāo),如虛擬鼠標(biāo)指針等,其示意圖如圖 1所示。目前計(jì)算機(jī)中單個(gè)顯卡可以支持多路視頻輸出,通過(guò)特定設(shè)備可以進(jìn)一步增加顯示設(shè)備的數(shù)量,能夠滿足平臺(tái)級(jí)裝備模擬訓(xùn)練系統(tǒng)的需求。對(duì)于由多套輸入設(shè)備產(chǎn)生的計(jì)算機(jī)USB接口不足等問(wèn)題,可采用USB-HUB等設(shè)備對(duì)計(jì)算機(jī)USB接口數(shù)量進(jìn)行擴(kuò)展。
圖1:SMCT示意圖
SMCT通過(guò)操作系統(tǒng)提供的RawInput相關(guān)接口采集各用戶輸入設(shè)備的原始輸入信息,然后對(duì)采集的輸入數(shù)據(jù)進(jìn)行解析與封裝,形成可供三維模擬訓(xùn)練系統(tǒng)識(shí)別的數(shù)據(jù)結(jié)構(gòu),采用多線程異步處理算法處理封裝后的數(shù)據(jù)結(jié)構(gòu),根據(jù)各用戶的輸入信息生成三維模擬訓(xùn)練系統(tǒng)中的操作事件,最后通過(guò)委托機(jī)制將該操作事件分發(fā)給系統(tǒng)中所需要驅(qū)動(dòng)的三維模型,以完成相應(yīng)的訓(xùn)練操作,其結(jié)構(gòu)框架如圖 2所示。
圖2:SMCT結(jié)構(gòu)框架
SMCT框架可分為數(shù)據(jù)層和應(yīng)用層,數(shù)據(jù)層通過(guò)操作系統(tǒng)提供的應(yīng)用程序接口(Application Programming Interface,API)采集各輸入設(shè)備的輸入數(shù)據(jù)、設(shè)備身份標(biāo)識(shí)等信息,通過(guò)對(duì)輸入設(shè)備數(shù)據(jù)的解析處理形成三維模擬訓(xùn)練系統(tǒng)中的輸入事件供應(yīng)用層使用。應(yīng)用層根據(jù)采集的輸入設(shè)備信息將各輸入設(shè)備虛擬化,為每個(gè)用戶生成相應(yīng)的虛擬輸入設(shè)備圖標(biāo)。通過(guò)用戶標(biāo)定模塊將虛擬輸入設(shè)備分配給各用戶,通過(guò)使用數(shù)據(jù)層產(chǎn)生的輸入事件對(duì)相應(yīng)的三維模型進(jìn)行操作。
SMCT通過(guò)操作系統(tǒng)提供的API采集輸入設(shè)備信息,其具體步驟如下所述。
2.2.1 獲取輸入設(shè)備信息
通過(guò)操作系統(tǒng)提供的API獲取計(jì)算機(jī)中接入的所有輸入設(shè)備的信息并記錄在列表中,其中包含設(shè)備類型、設(shè)備名稱以及設(shè)備句柄等信息。
2.2.2 注冊(cè)輸入設(shè)備
對(duì)需要采集的輸入設(shè)備類型進(jìn)行注冊(cè),注冊(cè)后操作系統(tǒng)會(huì)產(chǎn)生這些輸入設(shè)備的原始輸入信息,其中常用輸入設(shè)備類型編碼參數(shù)如表 1所示。
表 1:輸入設(shè)備類型參數(shù)
2.2.3 輸入設(shè)備數(shù)據(jù)采集
采用Hook方法截獲操作系統(tǒng)中的WM_INPUT消息,使用RAWINPUT數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)輸入設(shè)備數(shù)據(jù)信息,根據(jù)輸入數(shù)據(jù)中的設(shè)備類型分別針對(duì)各種設(shè)備數(shù)據(jù)進(jìn)行處理。在采集到輸入設(shè)備的數(shù)據(jù)之后可根據(jù)具體的三維模擬訓(xùn)練系統(tǒng)需求對(duì)數(shù)據(jù)進(jìn)行解析封裝,最終形成設(shè)備事件驅(qū)動(dòng)上層應(yīng)用,其示意圖如圖 3所示。
圖3:數(shù)據(jù)采集、解析、驅(qū)動(dòng)原理示意圖
以鼠標(biāo)設(shè)備為例,鼠標(biāo)設(shè)備輸入數(shù)據(jù)信息中包含鼠標(biāo)指針在屏幕中的坐標(biāo)信息、鼠標(biāo)的按鍵狀態(tài)信息,如鼠標(biāo)左鍵按下和抬起狀態(tài)、鼠標(biāo)中鍵按下和抬起狀態(tài)以及鼠標(biāo)右鍵按下和抬起狀態(tài)。根據(jù)鼠標(biāo)按鍵狀態(tài)的變化可生成鼠標(biāo)動(dòng)作事件,如鼠標(biāo)單擊事件、鼠標(biāo)雙擊事件以及鼠標(biāo)拖動(dòng)事件等。
SMCT采用多線程異步處理算法結(jié)合委托機(jī)制共同完成多設(shè)備的協(xié)同。在SMCT中,每種類型的輸入設(shè)備維護(hù)一個(gè)設(shè)備數(shù)據(jù)列表,該數(shù)據(jù)列表以設(shè)備句柄作為其列表索引,在設(shè)備初始化時(shí)即可確定該列表的結(jié)構(gòu)與長(zhǎng)度。多線程異步處理算法通過(guò)對(duì)設(shè)備數(shù)據(jù)列表的異步讀寫初步完成了設(shè)備輸入與響應(yīng)的分離,使得多設(shè)備可同時(shí)操作。該算法包含輸入設(shè)備數(shù)據(jù)采集線程和數(shù)據(jù)處理線程,其中輸入設(shè)備數(shù)據(jù)采集線程監(jiān)控所有已注冊(cè)設(shè)備的輸入消息,當(dāng)有輸入消息時(shí)對(duì)輸入數(shù)據(jù)進(jìn)行采集,針對(duì)不同類型的設(shè)備數(shù)據(jù),將其存入對(duì)應(yīng)設(shè)備的設(shè)備數(shù)據(jù)列表中,同時(shí)根據(jù)數(shù)據(jù)中的設(shè)備句柄更新設(shè)備列表中對(duì)應(yīng)的設(shè)備數(shù)據(jù)。數(shù)據(jù)處理線程定時(shí)訪問(wèn)設(shè)備數(shù)據(jù)列表,對(duì)列表中各設(shè)備數(shù)據(jù)進(jìn)行解析處理生成設(shè)備輸入事件,其原理流程圖如圖 4所示。
圖4:多線程異步處理算法原理流程圖
SMCT通過(guò)委托機(jī)制將生成的設(shè)備輸入事件分發(fā)給三維模擬訓(xùn)練系統(tǒng)中的三維模型,系統(tǒng)中三維模型根據(jù)具體的輸入事件做出相應(yīng)的動(dòng)作響應(yīng)完成訓(xùn)練任務(wù),其具體步驟如下所示:
(1)針對(duì)設(shè)備類型,定義該設(shè)備的輸入事件;
(2)在三維模擬訓(xùn)練系統(tǒng)中的各模型對(duì)其需要的設(shè)備輸入事件進(jìn)行注冊(cè),同時(shí)綁定事件處理函數(shù);
(3)當(dāng)產(chǎn)生設(shè)備輸入事件時(shí),將該事件通過(guò)委托機(jī)制分發(fā)給三維模擬訓(xùn)練系統(tǒng)中的各個(gè)模型部件;
(4)系統(tǒng)中各模型部件收到事件時(shí),觸發(fā)相應(yīng)的事件處理函數(shù),對(duì)系統(tǒng)中的三維模型進(jìn)行響應(yīng)操作,如移動(dòng)、旋轉(zhuǎn)等。
通過(guò)上述操作實(shí)現(xiàn)了多設(shè)備協(xié)同驅(qū)動(dòng)三維模擬訓(xùn)練系統(tǒng)中的作業(yè)任務(wù)。
在應(yīng)用層SMCT主要完成輸入設(shè)備的虛擬化和用戶標(biāo)定功能,為多人協(xié)同作業(yè)提供支撐。
設(shè)備虛擬化是指在三維模擬訓(xùn)練系統(tǒng)中為接入系統(tǒng)的多套輸入設(shè)備構(gòu)建相應(yīng)的虛擬設(shè)備,如為每個(gè)鼠標(biāo)設(shè)備構(gòu)建一個(gè)鼠標(biāo)指針圖標(biāo),為每個(gè)鍵盤設(shè)備構(gòu)建一個(gè)光標(biāo)等,然后通過(guò)標(biāo)定功能將該虛擬設(shè)備與用戶進(jìn)行綁定。設(shè)備虛擬化的具體實(shí)現(xiàn)如下所述:
(1)在三維模擬訓(xùn)練系統(tǒng)初始化時(shí),獲取接入操作系統(tǒng)的所有輸入設(shè)備信息;
(2)根據(jù)設(shè)備類型過(guò)濾出三維模擬訓(xùn)練系統(tǒng)需要的設(shè)備并存入設(shè)備列表;
(3)對(duì)設(shè)備列表進(jìn)行遍歷,根據(jù)設(shè)備類型與數(shù)量在三維模擬訓(xùn)練系統(tǒng)中繪制相應(yīng)的虛擬設(shè)備圖標(biāo);
(4)三維模擬訓(xùn)練系統(tǒng)實(shí)時(shí)接收輸入設(shè)備信息,更新對(duì)應(yīng)的虛擬設(shè)備圖標(biāo)位置和狀態(tài)。
SMCT在硬件結(jié)構(gòu)上采用一機(jī)多屏的形式,即一臺(tái)計(jì)算機(jī)連接多臺(tái)顯示設(shè)備,每臺(tái)顯示設(shè)備作為一個(gè)用戶的工作區(qū)。在操作系統(tǒng)中多臺(tái)顯示設(shè)備采用擴(kuò)展模式進(jìn)行排列,在三維模擬訓(xùn)練系統(tǒng)中SMCT根據(jù)顯示設(shè)備的屏幕分辨率通過(guò)設(shè)置仿真引擎中的攝像機(jī)數(shù)量與顯示比例將三維模擬訓(xùn)練系統(tǒng)工作區(qū)均勻分割。對(duì)于每個(gè)用戶工作區(qū)的邊界坐標(biāo)可根據(jù)工作區(qū)排列方式進(jìn)行計(jì)算,如圖 5所示,在仿真引擎中設(shè)整個(gè)系統(tǒng)的工作區(qū)坐標(biāo)由(x,y,w,h)表示,其中x和y表示工作區(qū)左下角相對(duì)屏幕坐標(biāo)的位置,w和h表示工作區(qū)占系統(tǒng)顯示的寬和高的比例,則整個(gè)系統(tǒng)的坐標(biāo)可表示為(0,0,1,1),如圖中工作區(qū)1坐標(biāo)表示為(0.5,0.5,0.5,0.5)。
圖5:用戶工作區(qū)分割示意圖
設(shè)三維模擬訓(xùn)練系統(tǒng)中工作區(qū)以X×Y方式進(jìn)行排列,即橫排為X個(gè)工作區(qū),縱排有Y個(gè)工作區(qū),其中第i個(gè)工作區(qū)(i從0開始)的邊界(Vx,Vy,Vw,Vh)計(jì)算公式如式 1所示。
其中Vx,Vy,Vw,Vh組成工作區(qū)的矩形邊界,Vx為工作區(qū)左下角x坐標(biāo),Vy為工作區(qū)左下角y坐標(biāo),Vw為工作區(qū)寬度占比,Vh為工作區(qū)高度占比。
在使用三維模擬訓(xùn)練系統(tǒng)之前需要通過(guò)用戶標(biāo)定模塊為每個(gè)用戶分配工作區(qū),該過(guò)程為用戶標(biāo)定過(guò)程。用戶標(biāo)定建立了三維模擬訓(xùn)練系統(tǒng)中工作區(qū)與虛擬輸入設(shè)備以及用戶之間的映射關(guān)系,其中使用不同的顏色對(duì)多套虛擬設(shè)備進(jìn)行區(qū)分。標(biāo)定原理如圖 6所示,SMCT為每個(gè)工作區(qū)分配一個(gè)ID,通過(guò)標(biāo)定過(guò)程將輸入設(shè)備句柄與工作區(qū)ID進(jìn)行綁定,采用配置文件對(duì)其映射關(guān)系進(jìn)行記錄,在三維模擬訓(xùn)練系統(tǒng)運(yùn)行過(guò)程中,根據(jù)設(shè)備與工作區(qū)的映射關(guān)系,各用戶分別在其選擇的工作區(qū)進(jìn)行協(xié)同作業(yè)。
圖6:用戶標(biāo)定原理
以一機(jī)兩屏為例,標(biāo)定過(guò)程如圖 7所示,SMCT將三維模擬訓(xùn)練系統(tǒng)分割為兩個(gè)工作區(qū),接入兩套輸入設(shè)備,支持兩個(gè)用戶協(xié)同工作。依據(jù)工作區(qū)排列順序依次顯示系統(tǒng)標(biāo)定界面,其余工作區(qū)為黑屏狀態(tài),用戶選擇一套輸入設(shè)備激活標(biāo)定按鈕,將該設(shè)備分配給當(dāng)前工作區(qū),完成用戶與工作區(qū)的綁定。
圖7:用戶標(biāo)定過(guò)程示意圖
Unity3D是丹麥Unity Technology公司開發(fā)的跨平臺(tái)綜合型游戲開發(fā)引擎,它以優(yōu)質(zhì)的3D渲染效果和支持跨平臺(tái)的特點(diǎn)在虛擬仿真領(lǐng)域得到廣泛應(yīng)用。目前,該引擎已經(jīng)是虛擬仿真領(lǐng)域中三維模擬訓(xùn)練系統(tǒng)的主要開發(fā)引擎之一。SMCT在基于Unity3D引擎的三維模擬訓(xùn)練系統(tǒng)中將操作系統(tǒng)外接輸入設(shè)備的信號(hào)轉(zhuǎn)換為Unity3D引擎中的操作事件,驅(qū)動(dòng)場(chǎng)景中對(duì)應(yīng)的虛擬輸入設(shè)備產(chǎn)生動(dòng)作。Unity3D引擎在其場(chǎng)景中虛擬設(shè)備所處的當(dāng)前位置發(fā)射一條射線,該射線在場(chǎng)景中進(jìn)行碰撞檢測(cè),第一次碰撞檢測(cè)到的模型為該虛擬設(shè)備拾取的對(duì)象模型。當(dāng)多個(gè)用戶進(jìn)行協(xié)同訓(xùn)練時(shí),每個(gè)用戶所對(duì)應(yīng)的虛擬輸入設(shè)備所產(chǎn)生的不同動(dòng)作會(huì)映射到該虛擬設(shè)備所拾取到的不同的對(duì)象模型上,使場(chǎng)景中的多個(gè)模型同時(shí)產(chǎn)生相應(yīng)的操作,達(dá)到多用戶協(xié)同訓(xùn)練的目的。
目前該技術(shù)已成功應(yīng)用于多套三維模擬訓(xùn)練系統(tǒng)中,達(dá)到了很好的效果。如圖 8所示,在某裝備模擬訓(xùn)練系統(tǒng)中基于SMCT實(shí)現(xiàn)了對(duì)裝備的多人協(xié)同操作訓(xùn)練,該系統(tǒng)運(yùn)行于一臺(tái)計(jì)算機(jī)中,采用三個(gè)顯示器以擴(kuò)展模式進(jìn)行連接,在計(jì)算機(jī)中接入三套鼠標(biāo)設(shè)備,通過(guò)標(biāo)定過(guò)程分別為每個(gè)用戶綁定一個(gè)顯示器區(qū)域和一個(gè)虛擬鼠標(biāo)指針。該系統(tǒng)中三位用戶分別使用綠色、黃色和紅色的虛擬鼠標(biāo)通過(guò)點(diǎn)擊、拖動(dòng)等動(dòng)作同時(shí)對(duì)同一輛裝備進(jìn)行訓(xùn)練操作,協(xié)同完成裝備模擬訓(xùn)練的過(guò)程。
圖8:某裝備模擬訓(xùn)練系統(tǒng)多人協(xié)同訓(xùn)練效果圖
本文依據(jù)裝備三維模擬訓(xùn)練中的實(shí)際需求,設(shè)計(jì)了一種多人協(xié)同技術(shù)框架,對(duì)其中功能模塊的設(shè)計(jì)與實(shí)現(xiàn)進(jìn)行了論述,實(shí)現(xiàn)了在平臺(tái)級(jí)裝備三維模擬訓(xùn)練中多人協(xié)同作業(yè)的目的。該技術(shù)采用單機(jī)多顯示設(shè)備結(jié)合多輸入設(shè)備的硬件架構(gòu),實(shí)現(xiàn)了外接硬件輸入數(shù)據(jù)的采集、解析、封裝與驅(qū)動(dòng),采用多線程異步處理算法結(jié)合委托機(jī)制實(shí)現(xiàn)了多設(shè)備的協(xié)同,同時(shí)設(shè)計(jì)了一種用戶工作區(qū)的分割與標(biāo)定方法,支撐了該技術(shù)的應(yīng)用。該技術(shù)規(guī)避了多節(jié)點(diǎn)網(wǎng)絡(luò)之間的復(fù)雜關(guān)系,簡(jiǎn)化了系統(tǒng)結(jié)構(gòu),降低了成本。并且,易于與其他異構(gòu)系統(tǒng)進(jìn)行分布式互聯(lián)集成。該技術(shù)適用于少量用戶的多人協(xié)同作業(yè),對(duì)于大規(guī)模的系統(tǒng)可通過(guò)該技術(shù)與網(wǎng)絡(luò)相結(jié)合的方法進(jìn)行實(shí)現(xiàn)。