田麗虹,劉文濤
(中國(guó)船舶重工集團(tuán)公司 第七一〇研究所,湖北 宜昌 443003)
在海洋水產(chǎn)拖網(wǎng)作業(yè)中,若能使網(wǎng)具瞄準(zhǔn)魚(yú)群捕撈,就可以大大提高捕撈的經(jīng)濟(jì)效益,減少人力、物力的盲目消耗。而解決這一問(wèn)題的關(guān)鍵是如何實(shí)時(shí)、準(zhǔn)確地獲知網(wǎng)具在水下所處的水層深度以及網(wǎng)口的高度,網(wǎng)位儀作為電子助漁設(shè)備的重要組成之一,能夠?qū)崿F(xiàn)這一功能。目前,網(wǎng)位儀主要用于監(jiān)視拖網(wǎng)在水下的位置、狀態(tài)和網(wǎng)口魚(yú)群信息,為操作人員調(diào)整網(wǎng)具提供依據(jù),以有效地提高捕魚(yú)效率。為了滿足我國(guó)海洋漁業(yè)發(fā)展的需求,迫切需要研制成功具有自主知識(shí)產(chǎn)權(quán)的網(wǎng)位儀探測(cè)設(shè)備。網(wǎng)位儀的顯示需要實(shí)時(shí)顯示,所以本文采用DirectX設(shè)計(jì)了網(wǎng)位儀數(shù)據(jù)實(shí)時(shí)顯控軟件。
由于網(wǎng)位儀顯控軟件的實(shí)時(shí)性要求很高,就需要有很好的繪圖接口來(lái)實(shí)現(xiàn)。通常,在Windows系統(tǒng)下對(duì)圖像處理的方法主要有GDI和DirectX提供的API函數(shù)。應(yīng)用程序與Direct3D(DirectX的重要組成部分)、Windows圖形設(shè)備接口(GDI)、HAL和顯示硬件之間的關(guān)系如圖1所示。
圖1 應(yīng)用程序、Direct3D、GDI和 HAL之間的關(guān)系
若使用GDI技術(shù)來(lái)開(kāi)發(fā)該顯控系統(tǒng),由于GDI屬于硬件和系統(tǒng)之間的抽象層,當(dāng)程序員間接調(diào)用gdi32.dll中的接口進(jìn)行窗口的繪制時(shí),數(shù)據(jù)從顯存到內(nèi)存之間的一系列數(shù)據(jù)交換將使得效率下降。而DirectX是微軟開(kāi)發(fā)的多媒體編程套件,做到了GDI的設(shè)備無(wú)關(guān)性,繪圖效率比GDI高了很多,既可以直接操作顯存,同時(shí)還提供程序員抽象的編程模型,故本設(shè)計(jì)采用了DirectX進(jìn)行數(shù)據(jù)實(shí)時(shí)顯控軟件的開(kāi)發(fā)。
DirectX主要由以下7個(gè)部分組成:Directlnput,Direct3D,DirectSound,DirectSetup,DirectX Media Objects,XInput,XACT。
本文主要對(duì)Direct3D組件進(jìn)行研究。Direct3D是基于微軟的通用對(duì)象模式COM的3D圖形API。Direct3D有兩種顯示模式:①全屏模式,是指畫(huà)面全部被Direct3D所占據(jù),不會(huì)再顯示其他的視窗畫(huà)面,該軟件設(shè)計(jì)就是采用此模式;②視窗模式,是指可以有多個(gè)視窗同時(shí)出現(xiàn)在屏幕上。
整個(gè)顯控軟件有3個(gè)功能:①發(fā)送所需控制參數(shù)給水下聲探頭;②接收水下聲探頭處理的各聲換能器波束掃描數(shù)據(jù)和各傳感器數(shù)據(jù),并對(duì)數(shù)據(jù)進(jìn)行優(yōu)化和差值處理;③在屏幕上實(shí)時(shí)顯示網(wǎng)口的形狀、周圍魚(yú)群信息、各傳感器的數(shù)據(jù)、網(wǎng)板位置,并完成相關(guān)的操作。該顯控軟件人機(jī)界面友好,操作簡(jiǎn)單,實(shí)時(shí)性很高,圖2為網(wǎng)位儀顯挖軟件界面。
3.1.1 模型的轉(zhuǎn)換
通過(guò)3DMAX三維建模軟件制作的模型通常不能直接在Direct3D程序中使用,這就需要利用一些工具、插件將制作好的模型文件轉(zhuǎn)換成在Direct3D開(kāi)發(fā)接口中可以直接使用的格式,Direct3D支持的模型文件格式為*.X。*.X文件是Direct3D提供的模型和動(dòng)畫(huà)數(shù)據(jù)的存儲(chǔ)格式,通常存儲(chǔ)了三維模型的頂點(diǎn)坐標(biāo)、顏色、法向量、紋理坐標(biāo)以及動(dòng)畫(huà)幀等信息。
圖2 網(wǎng)位儀顯控軟件界面
3.1.2 模型的調(diào)入實(shí)現(xiàn)過(guò)程
(1)首先使用Direct3D提供的模型接口定義一個(gè)模型的指針:
LPD3DXBUFFER pD3DXMtrlBuffer;//存儲(chǔ)網(wǎng)格模型材質(zhì)的緩沖區(qū)對(duì)象
(2)初始化場(chǎng)景。從*.X文件中讀入模型并提取材質(zhì)屬性和紋理文件名。
(3)場(chǎng)景動(dòng)態(tài)重建。在動(dòng)態(tài)顯示時(shí),根據(jù)接收數(shù)據(jù)的不同調(diào)整模型的姿態(tài),場(chǎng)景動(dòng)態(tài)重建還要進(jìn)行消隱處理。
(4)渲染并實(shí)時(shí)顯示場(chǎng)景。在*.X文件中讀入模型,實(shí)時(shí)處理材質(zhì)、光源、貼圖以達(dá)到場(chǎng)景的動(dòng)態(tài)變化效果,部分代碼如下:
調(diào)入的網(wǎng)位儀模型如圖3所示。
圖3 網(wǎng)位儀模型
3.2.1 創(chuàng)建、初始化設(shè)備對(duì)象以及靜態(tài)頂點(diǎn)緩存
創(chuàng)建DirectX對(duì)象,創(chuàng)建窗口對(duì)象,完成顯示窗口的創(chuàng)建,將該窗口作為用戶與虛擬世界交互的主要窗口,部分代碼如下:
下列為初始化頂點(diǎn)緩存,包括每個(gè)成員的x,y,z坐標(biāo),紋理及顏色等數(shù)據(jù)信息。利用極坐標(biāo)與直角坐標(biāo)之間的轉(zhuǎn)換關(guān)系(ρ2=x2+y2;tanθ=y(tǒng)/x;x=ρcosθ;y=ρsinθ)將接收來(lái)的數(shù)據(jù)進(jìn)行處理,用極坐標(biāo)在屏幕上顯示出網(wǎng)口和魚(yú)群的位置,部分代碼如下:
在寫表面時(shí)要先鎖定表面資源,g_pRoundS->lock();在寫表面后要解鎖表面資源,g_pRoundS->Unlock()。
3.2.2 渲染并實(shí)時(shí)顯示網(wǎng)口位置
進(jìn)行渲染,將表面對(duì)應(yīng)的x,y位置的點(diǎn)用直線連接起來(lái),繪制網(wǎng)口的形狀,部分代碼如下:
本文主要介紹了基于Direct3D技術(shù)實(shí)現(xiàn)網(wǎng)位儀數(shù)據(jù)實(shí)時(shí)顯示的方法,該方法提高了圖像的實(shí)時(shí)處理效率,獲得了滿意的實(shí)時(shí)處理效果。該軟件具有直觀性、實(shí)時(shí)性等特點(diǎn),給漁業(yè)作業(yè)帶來(lái)了極大的便利。
[1] 王德才,楊關(guān)勝,孫玉萍.DirectX 3D圖形與動(dòng)畫(huà)程序設(shè)計(jì)[M].北京:人民郵電出版社,2007.
[2] Andre LaMothe.Windows游戲編程大師技巧[M].第2版.沙鷹,譯.北京:人民郵電出版社,2012.
[3] Frank D Luna.DirectX 9.0 3D游戲開(kāi)發(fā)編程基礎(chǔ)[M].段菲,譯.北京:清華大學(xué)出版社,2007.
[4] 陳鏘,孫赫雄,陳楠.Visual C++2005從入門到精通[M].北京:電子工業(yè)出版社,2007.
[5] 胡峪,劉靜.VC++高級(jí)編程技巧與示例[M].西安:西安電子科技大學(xué)出版社,2001.