呂 韻,李佩琳
(中國電子科技集團(tuán)公司第三十八研究所 浮空平臺部,合肥 230088)
可視化可以理解為運(yùn)用圖像處理技術(shù)和計算機(jī)圖形學(xué),將科學(xué)計算中的數(shù)據(jù)轉(zhuǎn)換成圖像數(shù)據(jù),在顯示屏上顯示并可以進(jìn)行交互處理的方法和技術(shù)[1]。隨著計算機(jī)技術(shù)的發(fā)展和算法效率、精度的不斷提高,可視化技術(shù)已經(jīng)廣泛應(yīng)用到產(chǎn)品設(shè)計、醫(yī)學(xué)、地球科學(xué)、建筑等領(lǐng)域。
隨著AI技術(shù)的發(fā)展,三維的可視化技術(shù)已應(yīng)用于多個領(lǐng)域[2-6]。常用的實(shí)現(xiàn)三維可視化技術(shù),主要有[7]:(1)直接在現(xiàn)有三維軟件上進(jìn)行建模;(2)在現(xiàn)有的三維引擎上進(jìn)行開發(fā);(3)源代碼開放的可視化開發(fā)工具VTK(Visualization Toolkit)。VTK基于Open-GL工具包,具有移植性好、開放源代碼等優(yōu)點(diǎn),是目前應(yīng)用廣泛的可視化開發(fā)工具。
系留氣球是系在地面絞車并可控制其在大氣中飄浮高度的一種重要的浮空器,系留氣球一般由主氣囊、尾翼、副氣囊、整流罩等部分組成,氣球可以攜帶設(shè)備升空,并進(jìn)行長時間空中系留,可實(shí)現(xiàn)長時間、遠(yuǎn)距離的監(jiān)控或探測[8-9]。為開發(fā)系留氣球的設(shè)計軟件,進(jìn)一步優(yōu)化系留氣球的設(shè)計流程,本文使用C++語言,以Qt作為界面開發(fā)平臺,結(jié)合VTK可視化庫,構(gòu)建幾何數(shù)據(jù)進(jìn)行軟件開發(fā)的探索,實(shí)現(xiàn)了系留氣球的幾何模型和三維可視化顯示。
如前所述,VTK以其移植性好、源碼開放等優(yōu)點(diǎn)應(yīng)用廣泛。實(shí)際上,VTK的工具包結(jié)構(gòu)能嵌入任何一種開發(fā)工具中,用戶可對開發(fā)的全程進(jìn)行控制,進(jìn)行專業(yè)應(yīng)用的開發(fā)。VTK已經(jīng)在類庫中集成了大量的可視化算法,用戶可直接使用,與此同時,VTK允許開發(fā)人員根據(jù)需要在已有的算法和結(jié)構(gòu)之上加入自己的算法和接口[10-11]。
VTK可視化涉及兩個重要術(shù)語:渲染引擎和可視化管線。其中,渲染引擎主要為數(shù)據(jù)從模型生產(chǎn)圖像的過程;可視化管線為獲取或創(chuàng)建數(shù)據(jù)、處理數(shù)據(jù)以及將數(shù)據(jù)寫入文件或者將數(shù)據(jù)傳遞給渲染引擎進(jìn)行顯示的運(yùn)行結(jié)構(gòu),包括數(shù)據(jù)對象、處理對象和數(shù)據(jù)流方向三個要素[12]。VTK可視化流程如圖1所示。
VTK幾何數(shù)據(jù)表達(dá)由幾何結(jié)構(gòu)和拓?fù)浣Y(jié)構(gòu)組成,幾何結(jié)構(gòu)描述對象的空間位置關(guān)系,拓?fù)浣Y(jié)構(gòu)描述對象的構(gòu)成形式。VTK構(gòu)建單個幾何體可將其分解成多個三角形(或四邊形)單元,分解的單元節(jié)點(diǎn)構(gòu)成數(shù)據(jù)集,連接節(jié)點(diǎn)構(gòu)成數(shù)據(jù)集的拓?fù)浣Y(jié)構(gòu)形成幾何體的表面。這樣所得數(shù)據(jù)集可直在VTK中進(jìn)行處理和可視化。
VTK提供了一些簡單幾何體的生成函數(shù),對于一些復(fù)雜的造型需要開發(fā)者自定義幾何外形數(shù)據(jù)。復(fù)雜的造型其幾何形狀也是由點(diǎn)、線、面構(gòu)成的。系留氣球的設(shè)計軟件開發(fā)也離不開點(diǎn)、線、面的創(chuàng)建與操作。
(1)創(chuàng)建點(diǎn)。點(diǎn)是組成所有幾何模型的基礎(chǔ),且所有數(shù)據(jù)存儲的基礎(chǔ)都是基于點(diǎn)的存儲。首先計算幾何外形表面上點(diǎn)的坐標(biāo),創(chuàng)建點(diǎn)數(shù)據(jù)。在VTK中,用vtkPoints類來存儲點(diǎn),利用InsertNextPoint插入下一個點(diǎn)的坐標(biāo),每個點(diǎn)會按插入順序生成ID值vtkIdType。系留氣球創(chuàng)建點(diǎn)具體實(shí)現(xiàn)代碼如下:
//聲明一個vtkPoints指針
vtkSmartPointer
//插入點(diǎn)坐標(biāo)x,y,z
for(i=0;i points->InsertNextPoint(x,y,z); (2)創(chuàng)建四邊形單元。將四個點(diǎn)的坐標(biāo)按右手螺旋法則外法向量的方向連接起來,即可創(chuàng)建四邊形單元。在VTK中用vtkCellArray存儲單元,利用InsertNextCell插入下一個單元,每個單元中用InsertCellPoint來插入單元中點(diǎn)的連接順序。系留氣球創(chuàng)建四邊形單元具體實(shí)現(xiàn)代碼如下: //聲明一個vtkCellArray指針 vtkSmartPointer //插入一個四邊形單元 cells->InsertNextCell(4); //依次插入需要連接的點(diǎn)的ID cells->InsertCellPoint(ID1); cells->InsertCellPoint(ID2); cells->InsertCellPoint(ID3); cells->InsertCellPoint(ID4); (3)創(chuàng)建多邊形數(shù)據(jù)集。VTK中多邊形數(shù)據(jù)集vtkPolyData是應(yīng)用非常廣泛的一種數(shù)據(jù)類型,是數(shù)據(jù)與算法之間的橋梁。該數(shù)據(jù)集由各種單元構(gòu)成,后續(xù)對幾何體的一些算法(切割、合并等)都要通過vtkPolyData實(shí)現(xiàn)。系留氣球創(chuàng)建多邊形數(shù)據(jù)集具體代碼如下: //生成幾何體的PolyData數(shù)據(jù) vtkSmartPointer data->SetPoints(points); data->SetPolys(cells); 當(dāng)幾何形狀出現(xiàn)相交時,需要對幾何外形進(jìn)行修剪,VTK中常用的是vtkClipPolyData切割類和vtkAppendPolyData合并類。當(dāng)數(shù)據(jù)需要進(jìn)行光滑、三角化時,通常使用過濾器Filter來處理。這些類的輸出為vtkPolyData類型的數(shù)據(jù),將最終處理好的數(shù)據(jù)傳入映射器Mapper就完成了數(shù)據(jù)對象的生成和處理。系留氣球的曲面操作如下: (1)切割。截留氣球的切割代碼如下: vtkSmartPointer vtkSmartPointer clip->SetClipFunction(implicitFunction); clip->SetInputData(data); clip->Update(); (2)數(shù)據(jù)合并。截留氣球的數(shù)據(jù)合并代碼如下: vtkSmartPointer vtkSmartPointer append->AddInputData(clip->GetOutput()); append->AddInputData(data); append->Update(); 經(jīng)過以上的創(chuàng)建與操作處理,就可以把映射器傳遞給渲染引擎進(jìn)行顯示和交互。 根據(jù)圖1所示的可視化流程,數(shù)據(jù)流依次通過vtkActor、vtkRender、vtkRenderWindow。 (1)vtkActor用于在場景中描述一個對象的屬性,包括一個物體的顯示模式、顏色、透明度等。系留氣球的實(shí)現(xiàn)代碼如下: vtkSmartPointer actor->SetMapper(mapper); actor->GetProperty()->SetRepresentationToSurface(); actor->GetProperty()->SetColor(0,0,1); actor->GetProperty()->SetOpacity(0.8); (2)vtkRenderWindow用于創(chuàng)建渲染物體的窗口,vtkRenderer則是渲染窗口的渲染器。渲染窗口可以方便用戶對場景中的圖形進(jìn)行操作和控制,如燈光和觀察物體的視角等。每一個物體最終都會渲染到渲染窗口中[13]。系留氣球的實(shí)現(xiàn)代碼如下: vtkSmartPointer render->AddActor(actor); vtkSmartPointer vtkSmartPointer renwin->AddRenderer(render); vtkRenderWindowInteractor提供用戶對渲染窗口中的物體進(jìn)行拾取、縮放、平移等交互操作。利用Qt的信號槽機(jī)制,可以很方便的用Qt控件實(shí)現(xiàn)對物體的操作。在VTK中也提供了多種簡單交互操作的類,而且可以通過繼承vtkCommand類的方式自定義回調(diào)函數(shù)。 在Qt平臺上,結(jié)合VTK庫使用C++語言開發(fā)系留氣球三維可視化平臺,主界面如圖2所示。通過讀取輸入?yún)?shù),計算系留氣球結(jié)構(gòu)的點(diǎn)數(shù)據(jù)和單元數(shù)據(jù),然后運(yùn)用本文的幾何建模和可視化方法,定義系留氣球外形,最后通過VTK渲染引擎實(shí)現(xiàn)系留氣球的可視化。 利用Qt控件可實(shí)現(xiàn)對系留氣球顯示屬性的控制,隱藏除主、副氣囊之外的其他部分,如圖3所示;更改副氣囊的顏色和主氣囊透明度,如圖4所示。 利用Qt控件和vtkImplicitPlaneWidget類實(shí)現(xiàn)切割交互功能,用戶既可以通過控件設(shè)置平面參數(shù)來定義切割平面,也可以在渲染窗口中直接拖動來確定平面,同時會顯示當(dāng)前平面的參數(shù)。系留氣球的切割交互界面如圖5所示。 根據(jù)VTK功能和可視化機(jī)制,基于VTK幾何構(gòu)建和三維模型可視化方法在Qt平臺上使用C++語言進(jìn)行系留氣球設(shè)計與優(yōu)化軟件的開發(fā)。通過創(chuàng)建點(diǎn)、四邊形單元、多邊形數(shù)據(jù)集和曲面操作進(jìn)行幾何構(gòu)建,并通過三維可視化技術(shù)構(gòu)建系留氣球三維可視化平臺,所建平臺包括顯示控制和截面切割等功能。對系留氣球三維可視化平臺的測試結(jié)果表明,所建平臺滿足系留氣球的三維可視化要求,可進(jìn)一步用于系留氣球的性能分析軟件開發(fā)。2.2 曲面操作
3 三維模型的可視化
3.1 三維模型顯示
3.2 交互顯示模塊
3.3 系留氣球可視化實(shí)例
4 結(jié)論