陳小艷,王 強(qiáng),2,李柏林
(1.西南交通大學(xué) 機(jī)械工程學(xué)院,成都 610031;2. 成都工業(yè)學(xué)院 機(jī)械系,成都 610031)
利用VTK實(shí)現(xiàn)幾何模型的三維建模
陳小艷1,王 強(qiáng)1,2,李柏林1
(1.西南交通大學(xué) 機(jī)械工程學(xué)院,成都 610031;2. 成都工業(yè)學(xué)院 機(jī)械系,成都 610031)
針對(duì)鋼結(jié)構(gòu)橋梁的三維可視化問(wèn)題,提出利用VTK的三維建模功能,同時(shí)利用C#語(yǔ)言實(shí)現(xiàn)了鋼結(jié)構(gòu)橋梁的節(jié)點(diǎn)單元數(shù)據(jù)的三維可視化。研究VTK的數(shù)據(jù)表達(dá)方式,實(shí)現(xiàn)模型的拉伸、旋轉(zhuǎn)等建模;結(jié)合四元數(shù)法,實(shí)現(xiàn)模型的旋轉(zhuǎn)幾何變換。實(shí)驗(yàn)結(jié)果表明,通過(guò)VTK實(shí)現(xiàn)鋼結(jié)構(gòu)橋梁節(jié)點(diǎn)單元數(shù)據(jù)三維建模是可行的;該可視化平臺(tái)具有很好的可移植性和擴(kuò)展性,并且可以方便的依靠底層數(shù)據(jù)對(duì)模型進(jìn)行有限元分析等開(kāi)發(fā)工作。
三維可視化; VTK;三維建模; C#語(yǔ)言;四元數(shù)
在傳統(tǒng)工程行業(yè)如機(jī)械、土木、電氣等方面,二維圖紙的表達(dá)已經(jīng)不能滿(mǎn)足現(xiàn)在工程的需要,目前,大部分企業(yè)都有自己的三維可視化部門(mén),以解決二維圖紙帶來(lái)的缺陷和不足[1]。三維可視化是其它功能如分析、仿真等功能的實(shí)現(xiàn)基礎(chǔ)。目前,國(guó)內(nèi)外實(shí)現(xiàn)三維可視化的技術(shù)主要包括以下幾種方法。
(1)直接在現(xiàn)有三維軟件上進(jìn)行建模,如CATIA、UG、PRO/E等;或者以這些軟件為基礎(chǔ)進(jìn)行二次開(kāi)發(fā)來(lái)實(shí)現(xiàn)專(zhuān)用需求。采用這種方法能夠方便的實(shí)現(xiàn)三維可視化,這種方式目前應(yīng)用比較廣泛。設(shè)計(jì)人員不必關(guān)心圖形可視化的內(nèi)部實(shí)現(xiàn)算法,可以把更多的精力集中在設(shè)計(jì)上。但是這些模型只能依附于各自的軟件系統(tǒng)來(lái)展示模型,由于模型格式解讀比較困難,如果想將三維模型嵌入用戶(hù)自己的軟件系統(tǒng)中實(shí)現(xiàn)別的相關(guān)的需求是非常難于實(shí)現(xiàn)的。
(2)在現(xiàn)有的三維引擎上進(jìn)行開(kāi)發(fā),比如Open-GL。這種方法能夠?qū)崿F(xiàn)各種三維模型的可視化顯示,而且與平臺(tái)無(wú)關(guān),可以在任何軟件系統(tǒng)中實(shí)現(xiàn)三維可視化。這類(lèi)方法由于開(kāi)發(fā)工作量比較大,對(duì)于開(kāi)發(fā)人員的專(zhuān)業(yè)要求比較高,在實(shí)際應(yīng)用中也比較難實(shí)現(xiàn)。
本文采用一種C#語(yǔ)言和VTK結(jié)合進(jìn)行開(kāi)發(fā)的方法,實(shí)現(xiàn)了鋼結(jié)構(gòu)橋梁的三維可視化顯示。由于C#語(yǔ)言是完全面向?qū)ο蟮?,使用起?lái)非常方便。在開(kāi)發(fā)過(guò)程中不用擔(dān)心內(nèi)存管理,系統(tǒng)穩(wěn)定性較好。VTK是在OpenGL的基礎(chǔ)上建立的一套函數(shù)庫(kù),以其強(qiáng)大的三維可視化功能及易用性而受到歡迎。由于開(kāi)發(fā)環(huán)境的便利性,使得開(kāi)發(fā)的效率得到了提高。
VTK(Visualization Toolkit)是由William J. Schmeder, Kenneth M.Martin, William E. Iorensen三人于1993年開(kāi)發(fā),利用面向?qū)ο蟮募夹g(shù)設(shè)計(jì)和實(shí)現(xiàn)的三維可視化工具箱[2]。最早主要用于醫(yī)學(xué)圖像可視化。目前除了在醫(yī)學(xué)可視化上的廣泛應(yīng)用外,也加入了幾何圖形的三維建模功能。著名的分析軟件MIDAS就是基于VTK開(kāi)發(fā)實(shí)現(xiàn)的。然而,國(guó)內(nèi)卻很少有人知道VTK的三維建模功能。導(dǎo)致很多應(yīng)用不得不買(mǎi)國(guó)外的軟件來(lái)實(shí)現(xiàn)。VTK包含了三維計(jì)算機(jī)圖形學(xué)、圖像處理和可視化3部分功能。其中封裝了目前許多優(yōu)秀的三維可視化算法,可以方便的實(shí)現(xiàn)數(shù)據(jù)的三維可視化[3]。
VTK建立在OpenGL基礎(chǔ)之上,與平臺(tái)無(wú)關(guān)。它不僅支持對(duì)幾何的顯示及渲染,同時(shí)支持多種圖形算法(光柵圖形生成算法,消隱算法等)、可視化算法(矢量,標(biāo)量,張量) 及高級(jí)的建模技術(shù)(快速建模,多邊形優(yōu)化,Delanay 三角面片生成法)。而且,VTK 的開(kāi)發(fā)者組織了一個(gè)有效的論壇及新聞組,通過(guò)這種平臺(tái),VTK 的使用者之間可以方便地進(jìn)行交流與合作[4]。
可視化模式由數(shù)據(jù)對(duì)象和處理對(duì)象組成。在VTK中,主要有5種數(shù)據(jù)集類(lèi)型:結(jié)構(gòu)化點(diǎn)集(Structured Points)、線性網(wǎng)格(VTKRectilinear Grid)、結(jié)構(gòu)化網(wǎng)格(Stucturedd Grid)、非結(jié)構(gòu)化網(wǎng)格(Unstructured Grid)以及多邊形數(shù)據(jù)(Polygonal Data)[5]。處理對(duì)象主要包括數(shù)據(jù)源對(duì)象、過(guò)濾器以及映射器。VTK的可視化過(guò)程是基于管線流的設(shè)計(jì)模式。將要處理的數(shù)據(jù)作為流動(dòng)介質(zhì)在管線中流動(dòng),不同的階段對(duì)數(shù)據(jù)有不同的處理方式[6]。 VTK的可視化流程如圖1所示。
圖1 VTK可視化流程
可視化模型主要對(duì)數(shù)據(jù)進(jìn)行處理,生成可被繪制的集合體,而圖形模型主要對(duì)生成的幾何體進(jìn)行繪制。有了可視化管線,VTK的可視化過(guò)程就可以用數(shù)據(jù)在可視化管線流動(dòng)的過(guò)程來(lái)描述。
在C#語(yǔ)言中使用VTK是使用基于VTK的.net封裝包.net Wrappers for VTK。這是一個(gè)開(kāi)源的軟件包,可以在VTK的網(wǎng)站上直接下載來(lái)使用?;贑#語(yǔ)言的VTK開(kāi)發(fā)效率要比基于C++語(yǔ)言的VTK開(kāi)發(fā)效率高很多,主要表現(xiàn)在以下幾個(gè)方面:
(1)由于Form編程代替了MFC的界面編程,界面設(shè)計(jì)只需要使用相應(yīng)的控件,使得更方便的搭建應(yīng)用程序框架;
(2)由于C#語(yǔ)言的垃圾回收機(jī)制,使得進(jìn)行對(duì)象生成和銷(xiāo)毀管理更加方便;
(3)VTK的.net 封裝使得VTK的引用更加方便,只需要使“using vtk”,就完成了在C++語(yǔ)言中的所有頭文件的引用;
(4)由于采用的C# Form編程,使得窗口消息的獲取更加方便;
(5)C#語(yǔ)言是完全面向?qū)ο蟮?,使得?duì)程序的設(shè)計(jì)實(shí)現(xiàn)和管理更加方便。
2.1 可視化平臺(tái)數(shù)據(jù)存儲(chǔ)和管理
幾何模型是由點(diǎn)、線、面和體組成。其中,點(diǎn)是組成所有幾何模型的基礎(chǔ)。因此,所有數(shù)據(jù)存儲(chǔ)的基礎(chǔ)都是基于點(diǎn)的存儲(chǔ)。在本可視化系統(tǒng)中,點(diǎn)的數(shù)據(jù)存儲(chǔ)采用C#語(yǔ)言的字典類(lèi)(directory(TKey,TValue))來(lái)實(shí)現(xiàn)。Dictionary(TKey,TValue)類(lèi)在內(nèi)部是作為一個(gè)哈希表來(lái)實(shí)現(xiàn)的,它提供了從一組鍵到一組值的映射,通過(guò)鍵來(lái)檢索值的速度是非常快的。因此,可以方便的實(shí)現(xiàn)點(diǎn)的操作如添加、刪除、修改等。TKey表示點(diǎn)的ID,TValue表示點(diǎn)的3D坐標(biāo)。在實(shí)際應(yīng)用中添加點(diǎn)用如下代碼所示:
//聲明一個(gè)點(diǎn)存儲(chǔ)字典
Dictionary〈int, Point3D> pointList =
new Dictionary〈int, Point3D>();
//聲明一個(gè)3D點(diǎn)變量
Point3D pointCoor = new Point3D();
//對(duì)點(diǎn)進(jìn)行坐標(biāo)賦值
pointCoor.x = x;
pointCoor.y = y;
pointCoor.z = z;
//將點(diǎn)添加到字典中
pointList.Add(pointID, pointCoor);
有了點(diǎn)的存儲(chǔ)基礎(chǔ),線和面以及體的存儲(chǔ)就比較方便,其存儲(chǔ)方式都采用字典類(lèi)來(lái)實(shí)現(xiàn)。其中,線的存儲(chǔ)采用與點(diǎn)關(guān)聯(lián)的方式,面的存儲(chǔ)采用與線關(guān)聯(lián),體的存儲(chǔ)采用與面關(guān)聯(lián)。在字典中存儲(chǔ)線的格式Directory(lineID,List〈pointID>),存儲(chǔ)面的格式Directory(faceID,List〈lineID>),存儲(chǔ)體的格式Directory(bodyID,List〈faceID>)。
對(duì)于點(diǎn)、線、面以及體的操作主要包括添加、刪除和修改等。(1)對(duì)體的操作,由于體處在最頂層,如果添加一個(gè)體,根據(jù)構(gòu)成體的對(duì)應(yīng)面直接生成;如果刪除體,則直接刪除體而保留對(duì)應(yīng)的面數(shù)據(jù)。如果修改體,則根據(jù)對(duì)應(yīng)的面數(shù)據(jù)重新生成體。(2)對(duì)于其他3類(lèi)數(shù)據(jù)點(diǎn)、線和面的操作,由于每一類(lèi)的操作都關(guān)聯(lián)了另一類(lèi)數(shù)據(jù),如果是添加操作,因?yàn)樘砑硬慌c已經(jīng)存在的數(shù)據(jù)相關(guān)聯(lián),則直接生成新的數(shù)據(jù);如果是刪除或修改,則提示用戶(hù)是否保留其下一層數(shù)據(jù)。如果刪除線,則提示用戶(hù)相關(guān)聯(lián)的面和體數(shù)據(jù)是否保留。
2.2 可視化平臺(tái)的三維模型生成
三維建模方法總結(jié)起來(lái)主要有以下幾類(lèi):拉伸、旋轉(zhuǎn)、掃描以及螺旋掃描等。幾乎所有三維模型都是由這些基本的命令組合生成。拉伸是指一個(gè)二維截面圖形沿著指定方向運(yùn)動(dòng)生成實(shí)體;旋轉(zhuǎn)是指二維截面沿著指定軸旋轉(zhuǎn)生成實(shí)體;掃描指截面沿著指定路徑運(yùn)動(dòng)生成實(shí)體;螺旋掃描指截面沿著指定路徑運(yùn)動(dòng)的同時(shí)繞指定軸旋轉(zhuǎn)而生成的實(shí)體。
在實(shí)際建模中,根據(jù)實(shí)體特征構(gòu)建二維截面,然后根據(jù)特征類(lèi)型選擇不同的三維生成方法。比如拉伸特征的創(chuàng)建:(1)在字典類(lèi)中查詢(xún)構(gòu)成二維截面的線ID;(2)根據(jù)線ID查詢(xún)點(diǎn)的ID;(3)得到點(diǎn)的坐標(biāo)。根據(jù)點(diǎn)的坐標(biāo)依次連接成二維截面。同時(shí),根據(jù)點(diǎn)坐標(biāo)計(jì)算拉伸方向,拉伸方向?yàn)槎S截面的法線方向。在創(chuàng)建拉伸特征的時(shí)候,有兩個(gè)問(wèn)題需要解決:點(diǎn)的連接順序,拉伸方向的計(jì)算。在本系統(tǒng)中,結(jié)合鋼結(jié)構(gòu)橋梁可視化的特點(diǎn):根據(jù)用戶(hù)輸入的點(diǎn)和單元,可視化桿系單元,定義桿系單元的截面類(lèi)型,根據(jù)截面類(lèi)型來(lái)確定點(diǎn)的連接順序。截面的拉伸方向?yàn)榉ㄏ?,法向?jì)算根據(jù)點(diǎn)坐標(biāo)來(lái)完成。
設(shè):A(x1, y1, z1),B(x2, y2, z2),C(x3, y3, z3)是平面上的3個(gè)點(diǎn),這3個(gè)點(diǎn)可以形成3個(gè)向量。
AB(x2-x1, y2-y1, z2-z1),
AC(x3-x1, y3-y1, z3-z1),
BC(x3-x2, y3-y2, z3-z2),
取向量AB和BC做叉積AB?BC,利用三階行列式,寫(xiě)成:
計(jì)算行列式即解出平面法向量的坐標(biāo),其方向滿(mǎn)足右手螺旋法則。圖2是生成的工字鋼的拉伸三維模型。關(guān)鍵代碼如下:
//構(gòu)建二維截面數(shù)據(jù)
vtkPolyData pPolyData = new vtkPolyData()
pPolyData.SetPoints(pPoints);
//創(chuàng)建拉伸
vtkLinearExtrusionFilter extrude = new
vtkLinear-ExtrusionFilter();
//設(shè)置拉伸截面
extrude.SetInput(pPolyData);
//設(shè)置拉伸長(zhǎng)度
extrude.SetScaleFactor(iDis);
//設(shè)置拉伸方向
extrude.SetVector(direcX,direcY,direcZ);
圖2 拉伸成型的工字鋼三維模型
2.3 模型三維幾何變換
幾何變換主要包括平移、旋轉(zhuǎn)等操作。對(duì)于相同的模型,不需要進(jìn)行重復(fù)建模,只需要將模型平移或旋轉(zhuǎn)到相應(yīng)的位置即可。平移操作只需要進(jìn)行坐標(biāo)平移操作,相對(duì)比較簡(jiǎn)單,這里不再詳述。三維空間的旋轉(zhuǎn)變換可采用歐拉角、幾何旋轉(zhuǎn)矩陣或者四元數(shù)等方法。歐拉角存在萬(wàn)向節(jié)死鎖,即當(dāng)3個(gè)萬(wàn)向節(jié)其中兩個(gè)軸發(fā)生重合時(shí),會(huì)失去一個(gè)自由度,而采用旋轉(zhuǎn)矩陣需要大量的乘法運(yùn)算。因此,本文采用四元數(shù)法實(shí)現(xiàn)模型的任意方向旋轉(zhuǎn),四元數(shù)(Quaternions)是由愛(ài)爾蘭數(shù)學(xué)家威廉?盧云?哈密頓 (William Rowan Hamilton)在1843年發(fā)明的數(shù)學(xué)概念。四元數(shù)的乘法不符合交換律,它是最簡(jiǎn)單的超復(fù)數(shù),非零四元數(shù)的乘法群在R3的實(shí)部為零的部分上的共軛作用可以實(shí)現(xiàn)轉(zhuǎn)動(dòng)。單位四元數(shù)(絕對(duì)值為1的四元數(shù))若實(shí)部為cos(t),它的共軛作用是一個(gè)角度為2t的轉(zhuǎn)動(dòng),轉(zhuǎn)軸為虛部的方向[7~10]。四元數(shù)的優(yōu)點(diǎn)是:
(1)表達(dá)式無(wú)奇點(diǎn)(和例如歐拉角之類(lèi)的表示相比);
(2)比矩陣更簡(jiǎn)煉,也更快速;
(3)單位四元數(shù)的對(duì)可以表示四維空間中的一個(gè)轉(zhuǎn)動(dòng)。
設(shè)空間任意向量A(xa, ya, za)與一旋轉(zhuǎn)角度θ,如圖3所示:
圖3 四元數(shù)旋轉(zhuǎn)示意圖
將之轉(zhuǎn)換為四元數(shù):
對(duì)于三維空間的任意軸旋轉(zhuǎn),假設(shè)有一向量P(x, y, z),對(duì)一單位四元數(shù)q做旋轉(zhuǎn),將P視為無(wú)標(biāo)量的四元數(shù)Xi+Yj+Zk,則向量的旋轉(zhuǎn)經(jīng)證明如下:Rot(P)=qpq-1。為了計(jì)算方便,用矩陣的方式來(lái)表示四元數(shù)的乘法,假設(shè)四元數(shù)表示如下:q=[w, x, y, z]=[s,v],其中s=w是標(biāo)量部分,v=(x, y, z)是矢量部分。兩個(gè)四元數(shù)相乘的矩陣表示法如下:
令 q=[s,v]=[cosθ, u?sinθ]其中u為單位向量,則可以證明q?q'?q-1會(huì)讓q'繞著u軸旋轉(zhuǎn)2θ,此即為四元數(shù)的旋轉(zhuǎn)公式。根據(jù)四元數(shù)的矩陣乘法和旋轉(zhuǎn),將旋轉(zhuǎn)公式用以下矩陣的乘法來(lái)表示:
也就是說(shuō)如果要讓任意向量(x', y', z') (w'為0)對(duì)某個(gè)單位向量軸u(x, y, z)旋轉(zhuǎn)角度2θ,則w=cosθ,代入以上的矩陣乘法,即可得旋轉(zhuǎn)后的(x'', y'', z''),為了方便,轉(zhuǎn)換矩陣的最下列與最右行可以省略不寫(xiě)。利用上式變換矩陣。即可實(shí)現(xiàn)三維模型的任意方向的旋轉(zhuǎn)變換。
如圖4是采用VTK和C#語(yǔ)言結(jié)合開(kāi)發(fā)的鋼結(jié)構(gòu)橋梁的三維可視化平臺(tái)。通過(guò)數(shù)據(jù)導(dǎo)入將橋梁結(jié)構(gòu)的點(diǎn)數(shù)據(jù)和單元數(shù)據(jù)導(dǎo)入系統(tǒng),定義單元的截面形狀,最后通過(guò)VTK的三維建模功能以及四元數(shù)法實(shí)現(xiàn)模型的幾何變換后實(shí)現(xiàn)的整個(gè)鋼結(jié)構(gòu)橋梁的三維可視化顯示結(jié)果。圖中定義的截面形狀為工字型截面。點(diǎn)數(shù)據(jù)共有577個(gè),單元數(shù)據(jù)共有937個(gè)。鋼結(jié)構(gòu)橋梁的三維可視平臺(tái)如圖4所示。圖4(a)是節(jié)點(diǎn)和單元的桿系結(jié)構(gòu)可視化;圖4(b)是將單元進(jìn)行三維渲染的結(jié)構(gòu);圖4(c)是定義單元的截面形狀;圖4(d)是圖4(b)三維可視化的局部放大圖。實(shí)驗(yàn)表明,通過(guò)VTK實(shí)現(xiàn)三維建模是可行的。
VTK作為一種可視化工具包,主要用于醫(yī)學(xué)圖像的三維重建。本文利用VTK和C#語(yǔ)言開(kāi)發(fā)工具,提出了在VTK中進(jìn)行幾何實(shí)體的三維建模方法。采用C#語(yǔ)言的directory類(lèi)進(jìn)行數(shù)據(jù)存儲(chǔ)和管理;對(duì)于大數(shù)據(jù)量的幾何變換操作,利用四元數(shù)法的旋轉(zhuǎn),減少了模型在任意方向旋轉(zhuǎn)的時(shí)間。實(shí)驗(yàn)證明,采用VTK和C#語(yǔ)言結(jié)合的方式,可以方便快速地實(shí)現(xiàn)幾何模型的三維建模,開(kāi)發(fā)效率較高,并且不受系統(tǒng)限制,可以在用戶(hù)自己的平臺(tái)上實(shí)現(xiàn)三維建模。在實(shí)際工程應(yīng)用中具有較強(qiáng)的應(yīng)用價(jià)值。
圖4 鋼結(jié)構(gòu)橋梁的三維可視化平臺(tái)
[1]張祖勛,鄭順義,張劍清.三維可視化工程設(shè)計(jì)的研究[J].武漢大學(xué)學(xué)報(bào):信息科學(xué)版,2002,27(4):337-342.
[2]A.C.Pavao. E.V.S.Pouzada, M.A.Mathias. Electromagnetic field visualization through vtk software[C]. Microwave and Optoelectronics Conference, 2001. IMOC 2001, Belem, Brazi, Proceedings of the 2001 SBMO/IEEE MTT-S International, 2001,21-24.
[3]王延華,洪 飛,吳恩華. 基于VTK庫(kù)的醫(yī)學(xué)圖像處理子系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2003,39(8):205-207.
[4]Cline H, Lorensen Wetal. Two algorithm for three-Dimensional reconstruction of tomograms[J]. Medical Physics,1988,15(3): 320.
[5]William J. Schroeder, Lisa S. Avila, Kenneth M. Martin. The visualization toolkit user's guide[M].GE Corporate Research & Development,2001: 89-117.
[6]Arjan J.F. Kok, Robert van Liere. A multimodal virtual reality interface for 3D interaction with vtk[J]. Knowledge and Information Systems, 2007(13): 197-219.
[7]王 勇,馬立元,王忠強(qiáng).四元數(shù)法在計(jì)算機(jī)圖形中的應(yīng)用[J].軍械工程學(xué)院學(xué)報(bào),2001,13(2):48-51.
[8]劉俊峰.三維轉(zhuǎn)動(dòng)的四元數(shù)表述[J]. 大學(xué)物理,2004,23(4):39-43.
[9]Pletinckx D. Quaternion calculus as a basic tool in computer graphics[J]. The Visual Computer,1989, 5 (1) : 2-13 .
[10]劉愛(ài)東,黃 彬,盧中武.基于四元數(shù)的坐標(biāo)旋轉(zhuǎn)與插值方法研究[J]. 計(jì)算機(jī)與現(xiàn)代化,2012,27(2):44-47.
責(zé)任編輯 徐侃春
3-D modeling for geometric model through VTK
CHEN Xiaoyan1, WANG Qiang1,2, LI Bailin1
( 1.School of Mechanical Engineering, Southwest Jiaotong University, Chengdu 610031, China; 2. Department of Mechanics, Chengdu Technological University, Chengdu 610031, China )
A 3-D modeling method, taken advantage of VTK, combined with C#, was proposed to solve the 3-D visualizing problem of steel structure bridges. Data expression of VTK was researched, geometric transformations of model such as stretching, rotation were implemented through VTK and quaternion algorithm. Experiment showed it was practical to implement 3-D model building via VTK. In addition, the visualization platform was with portability and expansibility, fi nite analysis for model was available with underlying data.
3-D visualization; VTK(visualized toolkit); 3-D modeling; C#; quaternion
U242.5∶TP39
A
1005-8451(2015)07-0007-05
2014-12-01
四川省科技支撐計(jì)劃(2013GZ0032)。
陳小艷,在讀碩士研究生;王 強(qiáng),在讀博士研究生。