孫艷麗,王玲玲,陳佳琪
(1.海軍航空工程學(xué)院 基礎(chǔ)實驗部,山東煙臺264001;2.海軍航空工程學(xué)院 控制工程系,山東煙臺264001)
近年來本科學(xué)員、在職培訓(xùn)及預(yù)選士官等教學(xué)任務(wù)逐年增大,但新參訓(xùn)人員直接操作容易因誤操作導(dǎo)致?lián)p壞設(shè)備,增大維修成本,而且有限設(shè)備無法同時供應(yīng)大量人員使用,使得耗時較長,通過仿真軟件開發(fā)虛擬儀器儀表是提高效率,解決院校實驗教學(xué)、裝備培訓(xùn)、部隊操練的重要途徑。
GL Studio是一個面向?qū)ο?,用于?chuàng)建實時的二維或三維、照片級交互式的圖形界面開發(fā)軟件。紋理工具可以導(dǎo)入數(shù)字照片,完成儀表仿真。GL Studio有內(nèi)建代碼生成器,把圖形設(shè)計器創(chuàng)建的文件生成可移植的VC代碼??蛇M(jìn)行人機互動,實時顯示儀表之間的動態(tài)關(guān)聯(lián),效果直觀逼真[1-2]。GL Studio開發(fā)流程主要包括創(chuàng)建紋理、圖形界面設(shè)計、軟件設(shè)計、系統(tǒng)實現(xiàn)四大方面[3]。
紋理創(chuàng)建的好壞直接關(guān)系所創(chuàng)建虛擬儀表真實程度,紋理圖片的獲取是創(chuàng)建紋理的第一步,獲取紋理通常有兩種方法:① 用數(shù)碼相機直接拍攝真實的儀表,將所拍攝的照片經(jīng)過處理后作為紋理;② 用圖形編輯工具創(chuàng)建紋理[4]。目前,采用第一種方法獲得紋理比較常用。得到高質(zhì)量的實物照片后,去除照片中的背景,將所有能動部件(如儀表盤上指針、動態(tài)數(shù)字、開關(guān)、旋鈕、按鈕等)從主儀表板上逐個移除,并拷貝到新圖層中,最后保存紋理圖片。本文中根據(jù)不同需求電源柜的界面是由數(shù)碼照片處理而成,示波器的仿真則為了增強立體效果采用3dmax創(chuàng)建紋理。
制作的第一步就是要直接使用相機拍攝到其實物照片,并且在拍攝照片時一定要注意保持照相機的垂直,防止因拍攝角度的原因造成照片的傾斜,以至于最后影響到所制作的電源柜的真實度。其中需要一張電源控制柜的整體照片來作為背景。當(dāng)紋理圖片的像素太大時,GL Studio軟件使用對象屬性窗口進(jìn)行添加紋理圖片時是無法顯示的??墒侨绻档蛨D片的像素,清晰度將會受到影響,本文中采取將圖片進(jìn)行分割的方法,這樣既保證了單張圖片像素不會太高,又兼顧了清晰度的問題。
將面板圖片上所有能動的部件給摳出來,并將所有狀態(tài)都拍攝下來,在拍攝完照片后使用Photoshop對電源柜的面板照片進(jìn)行處理,消除掉因為人為因素所造成的照片傾斜、亮度不均勻等種種會影響到其真實度的問題。將所有摳下的各種小部件紋理圖片綜合放置于同一張紋理圖上,以避免各個部件的紋理圖片的比例不同,從而導(dǎo)致在后續(xù)的工作中需要頻繁地調(diào)整其大小。
在3ds max軟件界面中,畫出示波器圖片中線的截面,設(shè)置其路徑,使用放樣法制作線的三維模型。使用擠出法在3ds max中制作示波器上凸出的按鈕等。對于示波器上的金屬接口,設(shè)置其材質(zhì)為金屬。對于示波器的屏幕采用先分割平面再擠出的方法來制作,最后設(shè)置其紋理使其更接近于真實物體。取得用3ds max制作的示波器的立體模型的圖片,用Photoshop調(diào)整其大小使其能夠被GL Studio軟件使用的示波器虛擬儀器背景的紋理圖片,如果紋理圖片的像素過大的話則在GL Studio中是顯示不出來的。再將示波器上所有的按鈕以及旋鈕用Photoshop逐個將其摳下來,并將其拷貝到新的圖層上,獲得紋理圖片。
首先用 VC6.0 在 GL Studio 3.0 Standalone AppWizard中建立設(shè)計器,完成初始化,當(dāng) GL Studio初始化完畢后,GL Studio已經(jīng)生成了大量的代碼,包括三個文件,兩個源文件和一個頭文件。一個源文件是win_main.cpp,在該文件中有int WINAPI WinMain函數(shù),這是程序的入口函數(shù),該函數(shù)調(diào)用了另一個源文件里的int main(int argc,char*argv[])函數(shù),這個源文件的名字是根據(jù)用戶定義的工程的名字來定義[5]。同時 GL Studio又定義了一個指針全局變量,名字也是工程的名字,該指針指向的類是glsDisplayFrame類的派生類,在 int main(int argc,char*argv[])中在堆上創(chuàng)建glsDisplayFrame類的派生類對象。在該類的構(gòu)造函數(shù)中做了一些初始化工作,然后調(diào)用Create();函數(shù),該函數(shù)用來產(chǎn)生程序窗口,具體如下:
void testClass::Create(void)
{
theWindow=new OpenGLWindow(0,0,_width,_height,Name(),this);
theWindow->end();
theWindow->resizable(theWindow);
BackgroundColor(255,255,255,255);
FrameInterval(33333);
theWindow->resize(0,0,_width,_height);
theWindow->show();
theWindow->make_current();
}
之后即可在GL Studio編輯器的設(shè)計窗口中利用工具欄中的創(chuàng)建工具和“所見即所得”的設(shè)計環(huán)境創(chuàng)建一個和電源柜背景圖像相似的圖形對象[6]。將經(jīng)過處理的控制柜的背景紋理圖片通過對象屬性窗口中的Texture窗口添加到當(dāng)前的圖形對象之中,并將其設(shè)置為當(dāng)前紋理。通過設(shè)計窗口上工具欄中的模式工具對紋理進(jìn)行調(diào)整,使其正好鋪滿圖形,在主控制窗口中給創(chuàng)建好的圖形對象命以恰當(dāng)?shù)拿郑员阌诟玫毓芾?、編輯對象。除了設(shè)計畫布外,GL Studio設(shè)計器包含了分層視圖,在視圖中顯示所有設(shè)計中對象列表,以樹狀結(jié)構(gòu)顯示,如圖1所示。
圖1 狀態(tài)設(shè)置圖Fig.1 State diagram
根據(jù)背景紋理上各個所摳下的部件的形狀,再分別創(chuàng)建出與它們各自相近的圖形對象,依照對電源柜背景紋理的處理方法分別對其進(jìn)行處理,最后得到所要設(shè)計的圖形界面。
在畫面中用到不少文本框,要實現(xiàn)文本框的數(shù)據(jù)、文本的改變,首先要把文本格式化到一個緩存里。設(shè)文本框指針名為firsttextgrid,要把數(shù)值100顯示在文本框里,可以首先創(chuàng)建一個屬性成員函數(shù),通過在CODE主窗口點右鍵添加即可實現(xiàn),此時會得到一個成員變量,只需要選定SET方法,然后輸入:
int index=100;
char buffer[10];
sprintf(buffer,"%d",index);
firsttextgrid->string(buffer);
因為電源柜是單層畫面,只有一個Calculate()函數(shù),只要選擇classmenthods在Calculate()函數(shù)中調(diào)用剛才的SET方法,然后保存,生成代碼,編譯連接運行,就可以在文本框中看到修改了的數(shù)據(jù)。
產(chǎn)生窗口以后繪制的畫面,由函數(shù)CreateObjects()生成[7]。在該函數(shù)里,首先在堆上生成對象,該對象代表每個畫面中的控件,名字是用戶繪制畫面時候,在主控制面板中生成的名字。GL Studio根據(jù)繪制的對象不同,會生成從不同類中派生的對象,指針的定義已經(jīng)在頭文件中定義好,在CreateObjects()中,生成對象后調(diào)用該類成員函數(shù),產(chǎn)生畫面。該類成員函數(shù)的具體定義已經(jīng)封裝在GL Studio的動態(tài)庫中,GL Studio會根據(jù)用戶繪制的畫面,把畫面的必要信息,如頂點顏色、頂點位置、名字、紋理大小等以參數(shù)的方式傳過去。GL Studio將根據(jù)這些參數(shù),自動生成與用戶在畫布繪制的一樣的圖像。這就是GL Studio的所見機所得的工作機制。圖片繪制完畢后,進(jìn)入do-while語句,這個循環(huán)將不斷調(diào)用一個虛函數(shù)Calculate(),實現(xiàn)所有畫面的刷新,如圖2所示。
圖2 各功能模塊的調(diào)用關(guān)系Fig.2 Call relationship of each function module
在設(shè)計好圖形界面之后,依據(jù)實際面板的操作需要將各個控制部件創(chuàng)建成合適的裝置,工作方式開關(guān)創(chuàng)建成旋鈕,選中工作方式圖形對象,點擊工具欄中轉(zhuǎn)化工具的旋鈕裝置,如圖3所示。打開旋鈕裝置的對象屬性窗口,在Knob標(biāo)簽下,選擇General標(biāo)簽頂部的Angle Range,即角度范圍。設(shè)置旋鈕旋轉(zhuǎn)角度為0°~70°,即旋鈕旋轉(zhuǎn)的起始位置和終點位置,如圖4所示。
圖3 轉(zhuǎn)化為旋鈕裝置Fig.3 Device into a knob
圖4 設(shè)置旋轉(zhuǎn)范圍Fig.4 Set the rotation range
之后設(shè)置起點和終點間的擋位,在Detents標(biāo)簽下的Number of Detents輸入框中填入數(shù)字“3”,即共有3個擋位,分別為“0”、“平時”、“忙時”?;瑒覦etent Positions的滑塊使每一擋位對應(yīng)合適的角度。在主控制窗口的代碼窗口中添加新變量。變量類型為float,名字設(shè)為_newRoll,初始值設(shè)為0.0f。最后在對象屬性窗口的Object Code欄的Initialization Code中輸入如下代碼:
Self->DetentVal(1);∥旋鈕初始擋位為1
在Event callback Code即事件回調(diào)代碼中寫入以下代碼:
bool rval=false;
if(ObjectEventIs(ev,"DetentVal"))
{switch(rollGlsKnob-> DetentVal())
{case1:
_newRoll=0.0f;∥0°時為擋位 1
break;
case2:
_newRoll=50.0f;∥50°時為擋位 2
break;
case3:
_newRoll=70.0f;∥70°時為擋位 3
break;
}
Rval=true;
}
Return rval;
剩余的部件創(chuàng)建成按鈕裝置,在所有創(chuàng)建的GlsPushButton(按鈕裝置)對象的對象屬性窗口的Object Code窗口的Event callback Code即事件回調(diào)代碼中寫入以下代碼:
chekonggui_click_value=self->State();
return 0;
其中 chekonggui處填寫每個對象各自的名字。
在主控制窗口的代碼窗口的類變量中點擊Add將所有的GlsPushButton對象逐個添加進(jìn)去,在設(shè)定其類型為int,初始值為0。編寫行為代碼。
為了達(dá)到實現(xiàn)虛擬電源柜功能的目的,需要對圖形界面中的開關(guān)、旋鈕、按鈕、指示燈、屏幕以及指針等動態(tài)的部件進(jìn)行控制,而這就需要在主控制窗口中的代碼窗口類方法的Calculate區(qū)域內(nèi)進(jìn)行編程來實現(xiàn)各部件的動作,如圖5所示。
圖5 軟件編程圖Fig.5 Software program
編程完成即可進(jìn)行電源柜的仿真,測試其是否滿足可正常工作,滿足設(shè)計要求。首先需要生成.h 和.cpp 文件,之后打開.dsp 文件,在 C++環(huán)境下對電源柜進(jìn)行測設(shè)。在.dsp文件中對電源柜進(jìn)行運行,即可生成.exe可執(zhí)行文件。在.exe可執(zhí)行文件上按編寫的行為程序點擊按鈕,測試其功能是否正常,如圖6所示。
圖6 示波器的測試Fig.6 Test of oscilloscope
經(jīng)過測試發(fā)現(xiàn)電源柜和示波器均能按照所編寫的行為程序動作,能夠?qū)崿F(xiàn)使用虛擬儀器進(jìn)行院校裝備訓(xùn)練,實現(xiàn)提高效率、節(jié)省損耗的效果。
[1] 于輝,趙經(jīng)成,付戰(zhàn)平.Gl Studio虛擬儀表技術(shù)應(yīng)用與系統(tǒng)開發(fā)[M].北京:國防工業(yè)出版社,2010.YU Hui,ZHAO Jingcheng,F(xiàn)U Zhanping.Gl Studio virtual instrument technology application and system development[M].Beijing:National Defence Industry Press,2010.
[2] 張文,朱元昌,樊世友.Gl Studio及其在雷達(dá)面板仿真中的應(yīng)用[J].測控技術(shù),2012,21(12):50-53.ZHANG Wen,ZHU Yuanchang,F(xiàn)AN Shiyou.GL Studio and its application in the simulation of radar’s panels[J].Measurement& Control Technology,2012,21(12):50-53.
[3] 崔小鵬,邵英,李萬.基于Gl Studio的電力監(jiān)控系統(tǒng)設(shè)計[J].船海工程,2011,40(2):122-124.CUI Xiaopeng,SHAO Ying,LI Wang.Design of power monitoring system based on GL studio[J].Ship & Ocean Engineering,2011,40(2):122-124.
[4] Distributed Simulation Technology Inc.Gl Studio user’s guide,Version 1.04[R].[s.l.]:Distributed Simulation Technology Inc,2000.
[5] 孫艷麗,李建海,王玲玲.基于GL的某型電源系統(tǒng)仿真設(shè)計[J].電子測量技術(shù),2014,37(2):1-3.SUN Yanli,LI Jianhai,WANG Lingling.Simulation of a certain type of power system based on GL Studio[J].Electronic Measurement Technology,2014,37(2):1-3.
[6] 喬林,費廣正.Visual C++高級編程技術(shù)——Open GL篇[M].北京:中國鐵道出版社,2000.QIAO Lin,F(xiàn)EI Guangzheng.Visual C++advanced programming technology——Open GL[M].Beijing:China Railway Publishing House,2000.
[7] 沙俊名,劉澤乾,龐帥.基于Gl Studio的指揮儀模擬訓(xùn)練系統(tǒng)設(shè)計與實現(xiàn)[J].科學(xué)技術(shù)與工程,2011,11(12):2819-2823.SHA Junming,LIU Zeqian,PANG Shuai.The design and implementation of a director simulated training system based-on GL Studio[J].Science Technology and Engineering,2011,11(12):2819-2823.