耿 鐵,任清海
(河南工業(yè)大學(xué) 機(jī)電工程學(xué)院,鄭州 450007)
STL(Stereo lithographic)文件格式是美國(guó)3D SYSTEMS公司提出的一種采用三角形面片離散地近似表示三維模型的接口標(biāo)準(zhǔn),由于其接口格式規(guī)范、對(duì)三維實(shí)體描述的解釋唯一,目前已成為CAD/CAM/CAE系統(tǒng)接口的工業(yè)標(biāo)準(zhǔn)之一。因而STL文件在三維CAD設(shè)計(jì)、逆向工程、有限元分析、醫(yī)學(xué)成像系統(tǒng)、文物保護(hù)等方面有廣泛的應(yīng)用[1]。
OpenGL(Open Graphic Library)是一個(gè)三維真實(shí)感圖形模型庫,被廣泛地運(yùn)用于科學(xué)計(jì)算可視化、計(jì)算機(jī)動(dòng)畫和虛擬現(xiàn)實(shí)等領(lǐng)域,利用OpenGL開發(fā)圖形軟件已成為當(dāng)今業(yè)界的時(shí)尚[2]。
為了獲得STL文件三維模型的真實(shí)感顯示,以更好地進(jìn)行氣體輔助注塑成型數(shù)值模擬后置處理的研究與開發(fā),本文在深入研究STL文件特點(diǎn)的基礎(chǔ)上,運(yùn)用VC++6.0環(huán)境下的MFC的串行化文件I/O操作機(jī)制和OpenGL強(qiáng)大的圖形繪制渲染功能,對(duì)STL文件三維模型真實(shí)感圖形可視化進(jìn)行了研究與實(shí)現(xiàn)。
STL 文件是由若干空間無序排列組合的、并沒有反映拓?fù)潢P(guān)系的小三角形面片組成的集合,是一種用許多空間小三角形面片逼近三維實(shí)體表面的數(shù)據(jù)模型,每個(gè)三角形面片由三角形的三個(gè)頂點(diǎn)坐標(biāo)和指向模型外部的三角形面片的法向量組成[3]。目前的STL文件格式包括二進(jìn)制文件(BINARY)和文本文件(ASCII)兩種[4]。
二進(jìn)制STL文件用固定的字節(jié)數(shù)來給出三角形面片的幾何信息[4]。文件起始的80個(gè)字節(jié)是文件頭,用于存貯零件名等文字信息,接著用4個(gè)字節(jié)的整數(shù)來描述模型的三角形面片個(gè)數(shù), 后面逐個(gè)給出每個(gè)三角形面片的幾何信息。每個(gè)三角形面片占用固定的50個(gè)字節(jié),依次是3個(gè)4字節(jié)浮點(diǎn)數(shù),用來描述三角形面片的法矢量;3個(gè)4字節(jié)浮點(diǎn)數(shù),用來描述第1個(gè)頂點(diǎn)的坐標(biāo);3個(gè)4字節(jié)浮點(diǎn)數(shù),用來描述第2個(gè)頂點(diǎn)的坐標(biāo);3個(gè)4字節(jié)浮點(diǎn)數(shù),用來描述第3個(gè)頂點(diǎn)的坐標(biāo),每個(gè)三角形面片的最后2個(gè)字節(jié)用來描述三角形面片的屬性信息(包括顏色屬性等),暫時(shí)沒有用。一個(gè)二進(jìn)制STL文件的大小為三角形面片數(shù)乘以50再加上84個(gè)字節(jié)。
ASCII碼格式的文件逐行給出三角形面片的幾何信息,每一行以1個(gè)或2個(gè)關(guān)鍵字開頭。在STL文件中的三角形面片的信息單元facet是一個(gè)帶矢量方向的三角形面片,STL三維模型就是由一系列這樣的三角形面片構(gòu)成。STL文件的首行給出了文件路徑及文件名。在一個(gè)STL文件中,每一個(gè)facet由7行數(shù)據(jù)組成,第一行是三角形面片指向?qū)嶓w外部的法矢量坐標(biāo),由facet normal開頭,第二行為outer loop關(guān)鍵字,隨后的第3、4、5行數(shù)據(jù)分別是三角形面片的個(gè)頂點(diǎn)坐標(biāo),分別以vertex關(guān)鍵字開頭,3頂點(diǎn)沿指向?qū)嶓w外部的法矢量方向逆時(shí)針排列[5],第六行為end loop關(guān)鍵字,第七行為endfacet關(guān)鍵字,表示一個(gè)三角形面片信息描述完畢。
通過對(duì)STL兩種文件格式的分析可知,其中二進(jìn)制的文件格式較小,節(jié)省文件存儲(chǔ)空間,而ASCII碼格式的文件可讀性較強(qiáng),故把這種格式作為可視化研究對(duì)象。
STL文件型由一系列三角形面片構(gòu)成,即三角形面片是構(gòu)成STL文件的基本單位。每個(gè)三角形面片又由三維空間中對(duì)應(yīng)的三個(gè)頂點(diǎn)坐標(biāo)及其構(gòu)成的平面的法向矢量組成。所以采用結(jié)構(gòu)型變量分別定義構(gòu)成三角形面片的頂點(diǎn)數(shù)據(jù)和法向量,并采用基類CObject的派生類CTriangleClass定義的m_TriangleList數(shù)組來實(shí)現(xiàn)動(dòng)態(tài)存儲(chǔ)構(gòu)成STL文件的三角形面片。
MFC提供了一種串行化方式(Serialize)存取文檔機(jī)制,可以方便地把對(duì)象的不同數(shù)據(jù)信息存儲(chǔ)到指定的二進(jìn)制文件中,也可以方便地以同樣順序從該二進(jìn)制文件中讀出數(shù)據(jù)并創(chuàng)建對(duì)象[6]。具體算法如下:
在OpenGL中,光照模型由環(huán)境反射光、漫反射光、鏡面反射光等組成,通過函數(shù)glLight對(duì)光源特性進(jìn)行設(shè)置,可以模擬真實(shí)的光照效果;材質(zhì)屬性是通過對(duì)光線中的紅、綠、藍(lán)三原色的反射率來近似定義的,可以采用函數(shù)glMaterial實(shí)現(xiàn)材質(zhì)的設(shè)置;OpenGL提供的Gouraud著色模式,實(shí)現(xiàn)了在頂點(diǎn)顏色之間進(jìn)行雙線性差值,使不同頂點(diǎn)之間的顏色光滑連續(xù),可以改進(jìn)顯示效果;在OpenGL中,還可以采用融合技術(shù),實(shí)現(xiàn)三維模型的透明處理;另外OpenGL還可以啟動(dòng)深度檢測(cè)功能,進(jìn)行消隱處理,提高三維模型的立體感[7]。通過使用光照模型、材質(zhì)屬性、著色模式、深度檢測(cè)、融合以及反走樣等技術(shù)可以實(shí)現(xiàn)三維模型的真實(shí)感顯示效果。具體算法如下:
在Visual C++6.0環(huán)境下,運(yùn)用MFC的串行化文件I/O操作機(jī)制和OpenGL函數(shù)庫對(duì)STL文件的三維模型的真實(shí)感圖形可視化進(jìn)行了研究,并且詳細(xì)介紹了STL文件的讀取和顯示方法,為后續(xù)的氣體輔助注塑成型數(shù)值模擬后置處理的研程序結(jié)果如圖1所示。究與開發(fā)提供了條件,具有一定的使用價(jià)值和應(yīng)用前景。
[1] 衛(wèi)煒, 周來水, 張麗艷.海量STL文件的快速讀取與顯示[J].機(jī)械科學(xué)與技術(shù), 2006, 25(8): 935-938.
[2] 程小茁, 劉金義, 吳濤.基于OpenGL的STL格式實(shí)真實(shí)感圖形顯示工具的實(shí)現(xiàn)[J].撫順石油學(xué)院學(xué)報(bào), 1999,19(3): 53-55.
[3] 胡海鷗, 王素.基于OpenGL的STL文件可視化研究[OL].中國(guó)科技論文在線, 2010, 3(4): 371-376.http://highlights.paper.edu.cn/page_detail.php? id=910
[4] 嚴(yán)桔銘, 鐘艷如.基于VC++和OpenGL的STL文件讀取顯示[J].計(jì)算機(jī)體系應(yīng)用, 2009, 3: 172-175.
[5] 紀(jì)峰, 陳荔, 李占利.基于STL文件的模型及應(yīng)用[J].長(zhǎng)安大學(xué)學(xué)報(bào), 2006, 26(1): 104-107.
[6] 王清輝, 王彪.Visual C++ CAD應(yīng)用程序開發(fā)技術(shù)[M].北京: 機(jī)械工業(yè)出版社.2003.
[7] 和克智, 等.OpenGL編程技術(shù)詳解[M].北京: 化學(xué)工業(yè)出版社.2010.
[8] 郭兆榮.Visual C++ OpenGL 應(yīng)用程序開發(fā)[M].北京: 人民郵電出版社, 2006.