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