譚顯峰,董超,黃斌(四川大學(xué)計(jì)算機(jī)學(xué)院,成都 610065)
基于VTK和MFC的管道建模及可視化實(shí)現(xiàn)
譚顯峰,董超,黃斌
(四川大學(xué)計(jì)算機(jī)學(xué)院,成都610065)
目前,自來(lái)水、石油、天然氣等物質(zhì)的運(yùn)輸離不開管道,管道的合理敷設(shè)至關(guān)重要。由于受到地理位置和環(huán)境因素的影響,管道敷設(shè)通常是任何一個(gè)大型項(xiàng)目中最費(fèi)時(shí)的工作,也是產(chǎn)生問(wèn)題最多的部分。管道建模及可視化可以提高設(shè)計(jì)質(zhì)量,嚴(yán)格控制材料,高效率、高精度地構(gòu)造出管道網(wǎng)絡(luò),并且最大可能地避免設(shè)計(jì)錯(cuò)誤的產(chǎn)生[1-2]。
本文以VTK(Visualization Toolkit)可視化圖形類庫(kù)為基礎(chǔ),在 Windows上,以VC 6.0為開發(fā)平臺(tái),結(jié)合MFC,對(duì)VTK的顯示功能進(jìn)行封裝和修改,建立了管道材料庫(kù),實(shí)現(xiàn)了管道的添加、刪除等建模過(guò)程,以及管道模型繪制,管道圖形旋轉(zhuǎn)、平移、縮放等基本的可視化功能。
VTK是一個(gè)開源、跨平臺(tái)、可自由獲取、支持并行處理的圖形應(yīng)用函數(shù)庫(kù)。通過(guò)VTK可以將科學(xué)實(shí)驗(yàn)數(shù)據(jù)如建筑學(xué)、氣象學(xué)、醫(yī)學(xué)、生物學(xué),對(duì)體、面、光源等的逼真渲染,從而幫助人們理解那些采取錯(cuò)綜復(fù)雜而又往往規(guī)模龐大的數(shù)字呈現(xiàn)形式的科學(xué)概念或結(jié)果。
1.1VTK 概述
VTK包含一個(gè)C++類庫(kù)和眾多的翻譯接口層,包括Tcl/Tk、Java、Python。VTK是在三維函數(shù)庫(kù)OpenGL的基礎(chǔ)上采用面向?qū)ο蟮脑O(shè)計(jì)方法發(fā)展起來(lái)的,它將我們?cè)诳梢暬_發(fā)過(guò)程中會(huì)經(jīng)常遇到的細(xì)節(jié)屏蔽起來(lái),并將一些常用的算法封裝起來(lái)。例如VTK將我們?cè)诒砻嬷亟ㄖ斜容^常見(jiàn)的Marching Cubes算法封裝起來(lái),以類的形式供用戶使用,這樣我們?cè)趯?duì)三維規(guī)則點(diǎn)陣數(shù)據(jù)進(jìn)行表面重建時(shí)就不必再重復(fù)編寫Marching Cubes算法的代碼,而直接使用VTK中已經(jīng)提供的vtkMarchingCubes類。
1.2VTK 原理
VTK中的兩個(gè)重要組件:可視化管線和渲染引擎??梢暬芫€主要負(fù)責(zé)數(shù)據(jù)獲取或者創(chuàng)建,數(shù)據(jù)處理,然后將數(shù)據(jù)寫入文件或者傳遞至渲染引擎中進(jìn)行顯示。渲染引擎負(fù)責(zé)創(chuàng)建傳遞過(guò)來(lái)的數(shù)據(jù)的一個(gè)可視表達(dá)。
可視化管線的運(yùn)行原理如圖1所示:
圖1 VTK可視化管線的運(yùn)行原理圖
數(shù)據(jù)源用于讀入或生成需要處理的原始數(shù)據(jù)。數(shù)據(jù)對(duì)象表示了VTK中不同類型的數(shù)據(jù),主要包括:Structured points(結(jié)構(gòu)化點(diǎn)集),vtkRectilinearGrid(線性網(wǎng)格),Structured grid(結(jié)構(gòu)化網(wǎng)格),Unstructured grid(非結(jié)構(gòu)化網(wǎng)格,管線的建模就是利用這種數(shù)據(jù)的子對(duì)象aQuad),Polygonal Data(多邊形體數(shù)據(jù))。
VTK通過(guò)管道過(guò)濾器來(lái)操作和變換數(shù)據(jù)。過(guò)濾器即各種算法(例如碰撞檢測(cè)、常用數(shù)學(xué)函數(shù)、矩陣變換和圖像處理等)所封裝成的代碼,用于對(duì)數(shù)據(jù)對(duì)象進(jìn)行相應(yīng)的處理和分析,它可以接收一個(gè)或多個(gè)數(shù)據(jù)對(duì)象的輸入,也可以產(chǎn)生一個(gè)或多個(gè)對(duì)象的輸出。
VTK將處理完后的數(shù)據(jù)通過(guò)映射器將其轉(zhuǎn)換成可被顯示幾何對(duì)象。
當(dāng)數(shù)據(jù)對(duì)象完成上述流程后,用戶只需按順序調(diào)用指定的渲染類(vtkLight、vtkAbsractMapper、vtkRen-derer、vtkCamera、vtkActtor等),就可將結(jié)果渲染到指定的窗口中[3]。
1.3VTK 與 MFC 的集成
VTK本身不提供圖形用戶接口,相對(duì)于其他語(yǔ)言,C++應(yīng)用程序體積更小,運(yùn)行更快,而且容易部署安裝。此外,采用C++語(yǔ)言開發(fā)VTK應(yīng)用程序,不需要編譯額外的Tcl、Java和Python支持。
建立新的VTK項(xiàng)目時(shí),在正確安裝VTK的基礎(chǔ)上,必須在項(xiàng)目的Project-setting中對(duì)相關(guān)參數(shù)進(jìn)行設(shè)置,以便將需要的VTK頭文件和lib庫(kù)引入MFC項(xiàng)目
中[4]。
在本文中VTK與MFC的集成方法是新建一個(gè)CCubeView類,作為整個(gè)軟件顯示功能的實(shí)現(xiàn),該類繼承自MFC的CView類,封裝了VTK中的渲染類 (如vtkRenderer)和數(shù)據(jù)對(duì)象類(如vtkUnstructuredGrid),以及映射器等。通過(guò)調(diào)用類中redraw()函數(shù)進(jìn)行視圖重繪。
管道模型中管道的數(shù)量和種類繁多,連接方式錯(cuò)綜復(fù)雜,管道模型的建立離不開數(shù)據(jù)模型的支撐。本文采用數(shù)據(jù)文本的行式,通過(guò)關(guān)鍵字記錄每根管道的基本屬性(長(zhǎng)度、方向、材料、連接方式等),利用VTK的可視化管線原理進(jìn)行數(shù)據(jù)輸出,實(shí)現(xiàn)管道的三維建模及可視化。
2.1管道模型的建立
(1)管道材料庫(kù)建立
建立管道時(shí),管道材料參數(shù)較多(泊松比、彈性模量等),并且在不同的溫度下,各參數(shù)還要進(jìn)行差值計(jì)算,為簡(jiǎn)化用戶操作,在參照GB/T20801-2006《壓力管道規(guī)范》、GB/T12459-2005《鋼制對(duì)焊無(wú)縫管件》等國(guó)家標(biāo)準(zhǔn)的基礎(chǔ)上,將管道材料做成材料文件,用戶只需選擇材料名就可以將相應(yīng)的材料參數(shù)根據(jù)不同的溫度進(jìn)行差值計(jì)算后的結(jié)果讀入程序中。如果用戶使用的材料不在材料庫(kù)中,可進(jìn)行自定義添加,或者在某種材料的參數(shù)上進(jìn)行修改。
(2)管道數(shù)據(jù)的存儲(chǔ)
模型中管道的數(shù)量及連接關(guān)系通過(guò)文本文件的方式進(jìn)行存儲(chǔ),一個(gè)文件對(duì)應(yīng)一個(gè)模型。
文件中通過(guò)關(guān)鍵字記錄每根管道的屬性。主要包括:*Model,記錄管道是模型中的第幾段以、管道的起點(diǎn)信息以及管道方向;*Dimension,記錄管道的長(zhǎng)度及終點(diǎn)坐標(biāo);*Temperature,記錄管道的溫度;*Material,記錄管道的材料參數(shù),包括材料名稱、彈性模量、泊松比、屈服強(qiáng)度等;*Welding Material,記錄管道焊接區(qū)的材料參數(shù);*start point,記錄管道起點(diǎn)的公稱直徑、彎頭系列、壁厚;*end point,記錄管道終點(diǎn)的公稱直徑、彎頭系列、壁厚。
模型中每根管道有自己獨(dú)立的編號(hào),關(guān)鍵字末尾加上編號(hào)就可成為該段管道所有參數(shù)的唯一標(biāo)識(shí)。新建模型時(shí)編號(hào)從1開始遞增,通過(guò)全局變量控制當(dāng)前添加的是第幾段管道。
(3)管道的添加與刪除
添加和刪除管道錢必須新建或者打開一個(gè)模型。在改模型上添加管道時(shí),除第一根管道外,用戶通過(guò)拾取模型中已有管道的起點(diǎn)(終點(diǎn))坐標(biāo),作為新管道的起點(diǎn),隨后輸入相關(guān)參數(shù)。程序通過(guò)識(shí)別已拾取的管道起點(diǎn)ID,在文件中查找管道起點(diǎn)坐標(biāo),根據(jù)長(zhǎng)度和方向等參數(shù)進(jìn)行計(jì)算得到管道的終點(diǎn)坐標(biāo),和用戶輸入的其他參數(shù)一起寫入數(shù)據(jù)文件。管道的方向可以是沿坐標(biāo)軸的方向,也可以是空間中任何一個(gè)方向,若是后者,通過(guò)輸入水平面夾角和水平投影與X軸夾角連個(gè)參數(shù)可以唯一確定新管道的方向。每添加一段管道,程序?qū)⒃跀?shù)據(jù)文件末尾增加一組帶管道編號(hào)的關(guān)鍵字,兵將添加的管道顯示在界面中。
下面是個(gè)添加管道的實(shí)例:第一步,在新建模型中沿x軸正方向添加一根1000米長(zhǎng)的管道;第二步,以第一根管道終點(diǎn)為起點(diǎn)沿y軸正方向添加一根1000米長(zhǎng)的管道;第三步,以第二根管道終點(diǎn)為起點(diǎn)沿Z軸正方向添加一根1000米長(zhǎng)的管道;第四步,以第二根管道終點(diǎn)為起點(diǎn),水平面夾角和水平投影與X軸夾角都設(shè)置為30度,添加一根1000米長(zhǎng)的管道。管道添加過(guò)程如圖2所示:
圖2 VTK可視化管線的運(yùn)行原理圖
刪除管道時(shí)只能刪除模型中最后一段管道,同時(shí)刪除數(shù)據(jù)文件中最后一組關(guān)鍵字。2.2管道模型的可視化
(1)顯示
根據(jù)VTK的可視化管線和渲染原理,將數(shù)據(jù)文件作為VTK的數(shù)據(jù)源。
程序中CCubeView類提供用來(lái)顯示功能。CGlob-alData是數(shù)據(jù)類,封裝了VTK中所有的數(shù)據(jù)類型,作為全局變量,存儲(chǔ)模型中的所有數(shù)據(jù)信息,在不同類之間中轉(zhuǎn)數(shù)據(jù)。
以下處理使VTK的圖像顯示在CCubeView中:
CGlobalData中的GetMesh()函數(shù)完成將模型數(shù)據(jù)文件轉(zhuǎn)換成VTK數(shù)據(jù)源的操作;SetInput()函數(shù),將CGlobalData中的VTK數(shù)據(jù)源傳給CCubeView;最后調(diào)用CCubeView的redraw()函數(shù),重繪視圖區(qū)。redraw()函數(shù)部分代碼和功能如下:
放進(jìn)VTK的渲染器,實(shí)現(xiàn)圖像繪制。
(2)旋轉(zhuǎn)
程序 vtkInteractorStyleRubberBandPick類繼承自vtkInteractorStyleTrackballCamera,OnLeftButtonDown()方法捕捉鼠標(biāo)左鍵和Ctrl鍵同時(shí)按下去的操作,隨后調(diào)用VTK的StartRotate()函數(shù),實(shí)現(xiàn)圖像旋轉(zhuǎn)。
旋轉(zhuǎn)效果如圖3所示:
圖3 旋轉(zhuǎn)對(duì)比圖
(3)縮放
vtkInteractorStyleRubberBandPick中OnMouseWheel Forward()方法捕捉鼠標(biāo)滑輪向前滾動(dòng)和Ctrl鍵同時(shí)按下去的操作,隨后調(diào)用VTK的StartDolly()函數(shù),實(shí)現(xiàn)圖像放大。圖像縮小功能原理和放大時(shí)一樣,調(diào)用的方法是OnMouseWheelBackward()。
縮放效果如圖4所示。
(4)平移
vtkInteractorStyleRubberBandPick中 OnRightBut-tonDown()方法捕捉鼠標(biāo)右鍵和Ctrl鍵同時(shí)按下去的操作,隨后調(diào)用VTK的StartPan()函數(shù),實(shí)現(xiàn)圖像平移。
平移效果如圖5所示。
圖4 縮放對(duì)比圖
綜上所述,采用VTK和MFC結(jié)合的方式,以數(shù)據(jù)文件的形式記錄管道信息實(shí)現(xiàn)管道建模。封裝VTK的數(shù)據(jù)類和顯示類,實(shí)現(xiàn)管道模型的可視化。但管道的建模過(guò)程比較繁瑣,刪除方式還不夠靈活,這是下一步的研究重點(diǎn)。
圖5 平移對(duì)比圖
[1]陳文賢.CAD三維建模技術(shù)在管道敷設(shè)中的具體應(yīng)用.石油化工建設(shè),2014.
[2]楊飛,王解先.空間管道的連接建模及3D打印.工程勘察,2015.
[3]余偉巍,席平,何飛.利用VTK與MFC的醫(yī)學(xué)模型重建方法研究與實(shí)現(xiàn).工程圖學(xué)學(xué)報(bào),2009.
[4]羅火靈,許永忠,陳世仲.基于VTK和MFC的醫(yī)學(xué)圖像三維重建研究與實(shí)現(xiàn).生物醫(yī)學(xué)工程學(xué)進(jìn)展,2010.
VTK;MFC;Pipe Modeling;Visualization
Pipe Modeling and Visualization Based on VTK and MFC
TAN Xian-feng,DONG Chao,HUGNG Bin
(College of Computer Science,Sichuan University,Chengdu 610065)
1007-1423(2016)07-0084-04
10.3969/j.issn.1007-1423.2016.07.019
譚顯峰(1983-),男,重慶人,在讀研究生,研究方向?yàn)樾畔踩?/p>
董超(1985-),男,山東新泰人,碩士研究生,研究方向?yàn)橹悄苄畔⑻幚?/p>
黃斌(1986-),男,云南曲靖人,在讀研究生,研究方向?yàn)樾畔踩透咝阅苡?jì)算
2016-01-21
2016-02-25
VTK在圖像處理與顯示方面有強(qiáng)大的功能和源代碼開放特點(diǎn),但是它缺乏友好的交互界面,通過(guò)將其與MFC結(jié)合,實(shí)現(xiàn)管道建模及可視化,可以提高管道網(wǎng)絡(luò)建設(shè)的效率和精度,最大程度地避免設(shè)計(jì)錯(cuò)誤的產(chǎn)生。
VTK;MFC;管道建模;可視化
VTK in image processing and display has powerful function and open source characteristics,but it lacks a friendly interactive interface, through the combination with MFC,can realize pipe modeling and visualization,and can improve the efficiency and accuracy of the pipeline network construction,the maximum to avoid design errors.