王志樂,董軍宇
(1.海軍航空大學(xué)青島校區(qū),山東 青島 266041; 2.中國(guó)海洋大學(xué)信息科學(xué)與工程學(xué)院,山東 青島 266100)
隨著現(xiàn)代飛機(jī)綜合顯示信息量越來越大[1],國(guó)內(nèi)外對(duì)綜合航電顯示系統(tǒng)的開發(fā)應(yīng)用,開始借助國(guó)外的一些專業(yè)儀表工具軟件如GL Studio[2]、IData[3]等。這些軟件工具提供了文本框控件,實(shí)現(xiàn)了可視化編輯多功能顯示器(MFD)的顯示菜單和文本信息,然而由于漢字無(wú)法根據(jù)輸入直接顯示在MFD的畫面上,因此所有的做法只能是對(duì)于漢字采用紋理貼圖進(jìn)行顯示?;贕L Studio開發(fā)的機(jī)載儀表顯示軟件,如MFD、HUD等普遍采用此方法[4],但開發(fā)時(shí)無(wú)法預(yù)見需要顯示多少漢字,再加上漢字詞組的可變性,每次開發(fā)都需要重新準(zhǔn)備貼圖、詞組和顯示菜單的開發(fā),所以此方法非常繁瑣,且擴(kuò)展性不好[5]。開發(fā)人員一直期待GL Studio能夠支持漢字顯示,但是從2.0版本到現(xiàn)在的6.0版本一直都無(wú)法很好地支持,對(duì)此有必要進(jìn)行專門的研究。本文提出利用GB2312編碼建立一級(jí)漢字字庫(kù),基于GL Studio環(huán)境建立字庫(kù)表和基本的漢字顯示單元、MFD接收輸入的漢字編碼解析出每個(gè)漢字的國(guó)標(biāo)編碼,以基本漢字顯示單元為基礎(chǔ)建立漢字動(dòng)態(tài)顯示控制模型,經(jīng)過實(shí)驗(yàn)表明,該方法快速有效,擴(kuò)展性和重構(gòu)性好[6],既可以用于實(shí)裝開發(fā)也可以用于仿真模擬器的開發(fā)。
GL Studio是DISTI公司推出的一款獨(dú)立平臺(tái)的快速原型開發(fā)工具,用來創(chuàng)建實(shí)時(shí)的、照片級(jí)的、可交互的圖形顯示軟件,既可用于仿真,又可用于實(shí)際裝備[7]。GL Studio生成的C++和OpenGL代碼可以獨(dú)立運(yùn)行,也可以嵌入到其他應(yīng)用中[8],避免了底層OpenGL開發(fā)的細(xì)節(jié)[9-10]。利用GL Studio進(jìn)行MFD開發(fā)的流程如圖1所示。
圖1 GL Studio的MFD開發(fā)流程
利用GB2312編碼建立一級(jí)漢字字庫(kù),需要按照漢字編碼順序建立紋理字庫(kù),機(jī)載MFD顯示的漢字字符基本顏色是綠色,字體是黑體,字號(hào)是18號(hào),因此貼圖按此機(jī)載基本信息建立,為便于GL Studio的開發(fā)利用,漢字貼圖采用1024×1024的像素尺寸。在GL Studio中需要根據(jù)GB2312漢字編碼順序,建立漢字字庫(kù)表,該表用于查找需要顯示的漢字,將該漢字編碼輸入給漢化顯示控制模型[11-12]。
首先,建立漢字字庫(kù)表的抽象結(jié)構(gòu)如下:
struct WORDS_TABLE_TYPE
{//漢字表的結(jié)構(gòu)
unsigned short code; //漢字國(guó)標(biāo)編碼
float pos_x; //漢字存放的行
float pos_y; //漢字存放的列
};
WORDS_TABLE_TYPE gt_wordsTableA[3000];
實(shí)際一級(jí)字庫(kù)大概3000多漢字,按照此結(jié)構(gòu)和數(shù)量建立字庫(kù)表gt_wordsTableA,該表以數(shù)組形式存儲(chǔ)。
漢字在計(jì)算機(jī)中的存儲(chǔ)占2 Byte,是用4位16進(jìn)制數(shù)表示其編碼,例如“啊”的國(guó)標(biāo)編碼是B0A1,在GL Studio環(huán)境下直接將漢字字符輸入后自動(dòng)轉(zhuǎn)換成16進(jìn)制的國(guó)標(biāo)編碼是A1B0,因此建立字庫(kù)表需要對(duì)輸入的漢字進(jìn)行高低字節(jié)調(diào)換,同時(shí)需要存儲(chǔ)每個(gè)漢字在貼圖中的坐標(biāo)位置。因此建立字庫(kù)表初始化函數(shù)CHWordsADrawString(unsigned short *str, unsigned short length);其中str存放貼圖中的每一行漢字,length表示每行漢字?jǐn)?shù)。
實(shí)例使用如下:CHWordsADrawString((unsigned short*)"啊阿埃挨哎……",50);實(shí)例的字庫(kù)表N-S表示如圖2所示。
圖2 字庫(kù)表N-S圖
在開發(fā)或者仿真階段對(duì)MFD中需要顯示的漢字、詞組具有不確定性[13],需要建立一個(gè)動(dòng)態(tài)控制和顯示的模型。要求既能夠滿足MFD字符顯示的實(shí)時(shí)性,又能比較節(jié)約系統(tǒng)的資源[14],提高GL Studio中顯示單元管理的效率。
MFD顯控漢化框架采用GL Studio環(huán)境,主要包括:漢字字庫(kù)表初始化、漢字輸入、增加漢字處理、漢字顯示處理。漢字字庫(kù)表初始化在軟件初始化階段調(diào)用字庫(kù)表初始函數(shù)CHWordsADrawString完成一級(jí)字庫(kù)所有漢字國(guó)標(biāo)編碼的存儲(chǔ);漢字輸入,需要根據(jù)輸入給MFD的漢字的編碼識(shí)別出漢字;增加漢字處理,確定輸入的編碼是漢字,則調(diào)用AddOneCHWord函數(shù),將輸入的漢字信息存儲(chǔ)到漢字結(jié)構(gòu)體容器中;在漢字顯示處理階段,利用GLPolygon[15]初始創(chuàng)建的幾何對(duì)象GL_CHWords_A_U復(fù)制新的對(duì)象,在新復(fù)制的幾何對(duì)象內(nèi)加載漢字表貼圖,然后根據(jù)存儲(chǔ)漢字信息的容器查找需要顯示的漢字和該漢字在貼圖中顯示的位置,移動(dòng)貼圖使該漢字顯示在新復(fù)制的幾何對(duì)象內(nèi),最后根據(jù)漢字在MFD上顯示的屏幕坐標(biāo)位置,將新復(fù)制的GLPolygon對(duì)象移動(dòng)到正確的屏幕坐標(biāo)位置。
在MFD屏幕上新增加一個(gè)漢字時(shí),將進(jìn)入增加漢字處理模塊,在該模塊中需要將漢字的信息存儲(chǔ)在Vector定義的漢字結(jié)構(gòu)體對(duì)象中[16],因此需要對(duì)漢字處理信息進(jìn)行抽象定義。表1和表2是基本信息,表3是漢字顯示信息的處理結(jié)構(gòu)。
表1 字符間距結(jié)構(gòu)體
結(jié)構(gòu)體類型類型變量名說明FONT_STboolfonts字符類型shortchwordStep中文字符間距shortenwordStep英文字符間距
表2 字符特征結(jié)構(gòu)體
結(jié)構(gòu)體類型類型變量名說明TRAIT_STshortcolor顏色類型shortpat線型shortblink閃爍shortrot旋轉(zhuǎn)FONT_STfonts間距結(jié)構(gòu)
表3 漢字顯示信息存儲(chǔ)結(jié)構(gòu)
結(jié)構(gòu)體類型類型變量名說明DISP_CH_STfloatgrapPosXfloatgrapPosYfloatglPosXfloatglPosYTRAIT_STtrait漢字在字庫(kù)表中的坐標(biāo)漢字在MFD中的坐標(biāo)字符特征
DISP_CH_ST抽象模型存放了輸入漢字字符在字庫(kù)表中的坐標(biāo)位置和用于顯示漢字的GLPolygon對(duì)象在MFD中的顯示坐標(biāo)。
漢字顯示控制模型完成輸入漢字的查找、特征處理、顯示信息處理和實(shí)時(shí)顯示[17],所有的過程是動(dòng)態(tài)實(shí)時(shí)完成,因此建立漢字的動(dòng)態(tài)控制模型和動(dòng)態(tài)顯示模型是關(guān)鍵。
3.3.1 控制模型
利用GLPolygon預(yù)先創(chuàng)建好一個(gè)對(duì)象,如GL_CHWords_A_U,在該對(duì)象的屬性Texture Chooser里選擇一級(jí)字庫(kù)貼圖,如圖3所示。通過Texture Placement工具模式移動(dòng)貼圖,使GL_CHWords_A_U初始顯示第一行、第一列漢字“啊”。將該對(duì)象生成Group,如GL_CHWords_UGroup,漢字顯示基本對(duì)象及組如圖4所示。MFD顯示軟件運(yùn)行時(shí)首先完成清屏,接收到后臺(tái)發(fā)送的漢字字符指令時(shí)[18-19],完成指令解析后查找字庫(kù)表gt_wordsTableA,找到對(duì)應(yīng)的漢字字符后再完成漢字顯示信息的處理,將處理結(jié)果存儲(chǔ)在m_chwordAPosition對(duì)象中,該對(duì)象定義如下:std::vector
為了節(jié)省創(chuàng)建GLPolygon對(duì)象的資源,選擇將新創(chuàng)建的對(duì)象加入GL_CHWords_UGroup組,每個(gè)周期清屏?xí)r將GL_CHWords_UGroup組內(nèi)所有對(duì)象不可見,如果新接收的后臺(tái)漢字字符的數(shù)目大于GL_CHWords_UGroup組內(nèi)GLPolygon對(duì)象,則再創(chuàng)建新的GLPolygon,否則利用GL_CHWords_UGroup組內(nèi)已有對(duì)象即可。
圖3 添加一級(jí)字庫(kù)紋理
圖4 漢字顯示基本對(duì)象及組
漢字處理控制模型的流程圖如圖5所示。
圖5 漢字處理控制模型
3.3.2 顯示模型
顯示模型主要完成漢字在MFD屏幕坐標(biāo)的顯示[20]。顯示模型主要包括2個(gè)方面:1)需要根據(jù)MFD屏幕尺寸,建立屏幕坐標(biāo)系,根據(jù)漢字輸入的相對(duì)坐標(biāo)信息計(jì)算屏幕顯示坐標(biāo)信息;2)根據(jù)控制模型在字庫(kù)表中查找的漢字,記錄下漢字在字庫(kù)表中的坐標(biāo),即行號(hào)和列號(hào),這也是漢字在貼圖中的行號(hào)與列號(hào),最后需要根據(jù)行號(hào)和列號(hào)移動(dòng)貼圖,使每一個(gè)GLPolygon對(duì)象正確地顯示輸入的漢字。
以某型飛機(jī)多功能顯示器(MFD)為例,屏幕有效分辨率為575×575,符號(hào)顯示以像素點(diǎn)為單位。在屏幕左下方和右上方分別創(chuàng)建GLPolygon對(duì)象,該對(duì)象盡可能小,以該對(duì)象的幾何中心作為屏幕的左下坐標(biāo)和右上坐標(biāo)[21],如圖6所示,將這2個(gè)對(duì)象作為坐標(biāo)系的基準(zhǔn)點(diǎn),對(duì)象名為GL_Position_LeftBottom_U、GL_Position_RightTop_U,其中以GL_Position_LeftBottom_U為坐標(biāo)系原點(diǎn),坐標(biāo)基準(zhǔn)對(duì)象定義如圖7所示。設(shè)屏幕寬度為rWidth,輸入的橫坐標(biāo)為rx、縱坐標(biāo)為ry,返回的GL Studio環(huán)境下絕對(duì)坐標(biāo)為resX、resY。resX的計(jì)算方法如下:
TopPointX=m_posRightTopPoint.x
BottomPointX=m_postLeftBottomPoint.x
rWidth=TopPointX-BottomPointX
resX=BottomPointX+rx×rWidth/575.0
同樣的方法可計(jì)算出縱坐標(biāo)resY。
圖6 建立MFD屏幕坐標(biāo)系
圖7 坐標(biāo)基準(zhǔn)對(duì)象定義
為便于對(duì)新建字符對(duì)象的管理,定義了存放新建漢字對(duì)象GLPolygon類型的容器std::vector
int numPoly=m_veChGroup.size();
int numDisp=m_chwordAPosition.size();
ChangeHTexture(m_veChGroup.at(li_i),0.02f,0.0f,50.0f,m_chwordAPosition.at(li_i).grapPosX,0);
ChangeVTexture(m_veChGroup.at(li_i),0.02f,0.0f,50.0f,m_chwordAPosition.at(li_i).grapPosY,0.0f);
漢字顯示處理模型如圖8所示。
圖8 漢字顯示處理模型
該仿真方法基于GL Studio 4.0以上版本開發(fā)的MFD和HUD已成功應(yīng)用于某型飛機(jī)模擬器,運(yùn)行該軟件的機(jī)器采用PowerPC、內(nèi)存1 GB、顯卡為NVIDIA GeForce9300的硬件條件下,漢化顯示和位置準(zhǔn)確無(wú)誤,后臺(tái)可以根據(jù)需要修改顯示的內(nèi)容,并且控制實(shí)時(shí)性好。圖9和圖10是該型模擬器顯控運(yùn)行部分效果圖,主菜單、JIDS和慣導(dǎo)測(cè)試指令的形式如表4所示。
表4 指令輸入格式
MFD指令編碼幀Byte主菜單20100000c002ffffc0030000c006…2010642JIDS2010…b01700030032000b0056002f…828慣導(dǎo)2010…b01700010225005b844db017…1489
MFD接收后臺(tái)的指令編碼,指令編碼都是16進(jìn)制,0x2010表示指令幀開始,0x2000表示幀結(jié)束,中間每4位表示一個(gè)漢字的國(guó)標(biāo)編碼或者是自定義符號(hào)編碼,測(cè)試過層每個(gè)畫面所有漢字和符號(hào)占用字節(jié)不超過2048 Byte,數(shù)據(jù)量適合基本的網(wǎng)絡(luò)通信和共享內(nèi)存,可以方便地和后臺(tái)系統(tǒng)通信。
圖9 漢化顯示主菜單
圖10 漢化顯示慣導(dǎo)
本文基于GB2321編碼建立漢字字庫(kù),在GL Studio環(huán)境下進(jìn)行機(jī)載綜合航電顯示控制系統(tǒng)的開發(fā),可以很快地實(shí)現(xiàn)顯示字符的漢化,而且不需要專門預(yù)先搜集MFD可能顯示的漢字及詞組,避免了傳統(tǒng)方法不能靈活修改顯示詞組的缺點(diǎn),解決了根據(jù)需求顯示漢化字符信息的難點(diǎn),也解決了DISTI公司推出的GL Studio平臺(tái)長(zhǎng)期不能支持漢字顯示的問題,為該平臺(tái)用于國(guó)產(chǎn)機(jī)載MFD和模擬器開發(fā)提供了技術(shù)手段。該模型適用于任何機(jī)型MFD的開發(fā),而且可以推廣到基于OpenGL環(huán)境或IDATA平臺(tái)進(jìn)行MFD的開發(fā)。