沙晨明,申作林,申可心(哈爾濱理工大學(xué) 軟件學(xué)院,哈爾濱 50040)(大慶師范學(xué)院 機電工程學(xué)院,大慶 637)
?
三角網(wǎng)格文件OFF的格式分析及OFF到STL的轉(zhuǎn)化①
沙晨明1,申作林1,申可心2
1(哈爾濱理工大學(xué) 軟件學(xué)院,哈爾濱 150040)
2(大慶師范學(xué)院 機電工程學(xué)院,大慶 163712)
摘 要:OFF文件格式是一種用三角網(wǎng)格描述三維模型的常用格式之一,對OFF文件格式的詳細分析研究是讀取、顯示及操作OFF文件的前提條件.針對目前OFF文件的簡單分析及處理沒有形成一定系統(tǒng)的規(guī)范和思路這一問題.以Visual C++6.0為開發(fā)平臺;以MFC為基礎(chǔ)進行可視化界面設(shè)計;利用C++語言的標(biāo)準(zhǔn)IO庫實現(xiàn)對OFF文件進行讀取和寫入操作;應(yīng)用OpenGL編程技術(shù)實現(xiàn)對OFF文件的顯示;建立OFF文件的讀取和顯示系統(tǒng),通過實驗驗證讀取和顯示效果,并利用格式轉(zhuǎn)化算法完成OFF文件到STL文件的轉(zhuǎn)換.
關(guān)鍵詞:OFF; STL; 格式轉(zhuǎn)化; 三角網(wǎng)格模型; OpenGL
三角網(wǎng)格模型是指由三角形網(wǎng)格組成的表面模型,由于三角網(wǎng)格模型的處理簡便快捷、可視化效果好,表現(xiàn)能力佳,因而被視為描述三維立體模型的常用手段之一.近年來隨著計算機圖形學(xué)的迅猛發(fā)展,三角網(wǎng)格模型已廣泛應(yīng)用于三維動畫、電子商務(wù)、計算機輔助設(shè)計、工業(yè)制造、數(shù)字娛樂等諸多方面[2].尤其是隨著3D打印這一具有現(xiàn)代化工業(yè)革命性質(zhì)的技術(shù)蓬勃興起,三角網(wǎng)格模型更成為三維立體模型表示方法的焦點.目前STL文件已成為快速原型技術(shù)領(lǐng)域最為常用的文件格式和事實上的接口標(biāo)準(zhǔn),OFF文件也大量的被用于三維模型表示等三維圖像幾何處理領(lǐng)域中[6].OFF(Object File Format)文件格式是描述三維網(wǎng)狀物對象的文件格式,常用來表示基于三角網(wǎng)格描述的三維模型,一般通過現(xiàn)實采點取樣獲得數(shù)據(jù),通過一定的預(yù)處理和一定的簡化操作,再通過一定的存儲手段形成現(xiàn)有的OFF文件.對OFF文件格式的分析是進行OFF文件讀取、顯示和操作的前提,更是數(shù)字圖像處理的關(guān)鍵.目前對于OFF文件的簡單分析處理沒有形成一定系統(tǒng)的規(guī)范和思路.本文將對OFF的文件特點進行深入的分析并在Visual C++ 6.0平臺上,利用MFC進行圖形界面設(shè)計,利用C++標(biāo)準(zhǔn)IO庫結(jié)合OpenGL編程技術(shù)實現(xiàn)對OFF文件的讀取和顯示.同時通過深入分析,利用格式轉(zhuǎn)換算法完成OFF文件到STL文件的轉(zhuǎn)換研究.
利用現(xiàn)有的計算機圖形學(xué)知識,充分了解基于三角網(wǎng)格信息描述的三維立體模型數(shù)據(jù)文件格式,理解三維立體模型的數(shù)據(jù)內(nèi)部組織結(jié)構(gòu)是對三維立體模型處理的基礎(chǔ)和關(guān)鍵[5].
OFF文件是一種利用點和邊組成許多空間小三角形面片來逼近三維模型表面的一種數(shù)據(jù)文件,這種逼近方法也是大多數(shù)三維網(wǎng)格文件所采用的圖元表示法,利用三角形可以近似逼近出幾乎所有的三維立體模型.OFF文件的數(shù)據(jù)是采用ASCII格式存儲的,包括定義創(chuàng)建物體表面的平面多邊形的頂點集合、以組成三角面片的三個點為元素的三角形集合.每個OFF文件格式都是OFF關(guān)鍵字開頭的,第二行則是包括三維物體的頂點數(shù)量、三角面片數(shù)量和邊數(shù)量,其中邊的數(shù)量可以安全的省略.之后的數(shù)行是頂點和表面的表示,對于頂點是用X,Y,Z坐標(biāo)值表示并記錄的,而表面則可以用點的索引來表示.
一個具體的OFF文件如下,圖一為其顯示結(jié)果:
通過對OFF文件格式的分析可知,每一個點的坐標(biāo)表示了其三維空間的位置,點之間的索引關(guān)系表示了立體模型的拓撲序列.此外用ASCII碼表示的OFF文件可讀性強,以點集和面集表示思路簡單清晰,這方便了我們的進一步讀取并處理數(shù)據(jù).
本文通過對OFF文件格式和內(nèi)部數(shù)據(jù)組織結(jié)構(gòu)的分析,以MFC作為處理三維模型的基礎(chǔ),在Visual C++ 6.0平臺下使用C++語言,通過IO流操作實現(xiàn)文件讀取并存儲,應(yīng)用OpenGL編程技術(shù)實現(xiàn)OFF文件的三維圖形顯示.
由OFF文件的存儲格式可知,我們可以從中讀取出三維模型的頂點以及用頂點索引表示的一系列小三角面片,對于每個三角面片的邊來說,我們可以進行相應(yīng)的計算,所以邊數(shù)可以安全的省略.
3.1頂點和三角面片
對于三維立體模型而言,無非是一系列頂點和三角面片,所以對于這兩種基本組成元素而言,其定義是描述三維模型的前提條件.
設(shè)頂點集合
每個頂點都有一個唯一標(biāo)識的下標(biāo),下標(biāo)從0到n,而每個點又可定義為:
所以有點集
設(shè)面片集合
每個三角面片是有三個點組成,所以有映射
其中
則面片集為
3.2網(wǎng)格模型
由以上分析可知,網(wǎng)格模型是由點集和三角面片集合組成,所以我們只需加入相關(guān)表示信息即可表示網(wǎng)格模型,完成網(wǎng)格模型的定義.
設(shè)網(wǎng)格集合為
其中V包括組成網(wǎng)格模型的全部頂點,且每個頂點都有唯一的索引,索引滿足從0到n,F包括由3個V上的點所組成的元素.
3.3文件讀取
由于OFF文件的可讀性強,可用一般的文本編輯器打開,所以通過C++標(biāo)準(zhǔn)IO庫的輸入輸出流來實現(xiàn)OFF文件的讀取功能.
通過使用C++標(biāo)準(zhǔn)庫的FILE類創(chuàng)建文件指針,指向欲打開的OFF文件; 使用fopen()函數(shù)進行文件打開并通過返回值是否為NULL判斷成功與否; 使用fscanf()函數(shù)實現(xiàn)字符的讀入功能并用strcmp()進行字符的匹配; OFF文件中存在三維模型頂點、面片的數(shù)目,利用此信息通過一定的循環(huán)方式逐行讀入字符并存儲數(shù)據(jù).
讀取方法流程如圖2所示.
圖2 讀取方法流程圖
3.4文件顯示
OpenGL編程技術(shù)的使用能更好的實現(xiàn)三維模型的立體感和真實感,在繪圖方面更加有優(yōu)勢[1].在OpenGL提供的API中,有一系列畫圖的函數(shù),在這里我們使用指定圖元為三角面片的繪圖.
glBegin(GL_TRIANGLES)函數(shù)指定了以下為圖元列表的開始; glEnd()函數(shù)指定了圖元列表結(jié)束; 在glBegin()與glEnd()之間使用三個參數(shù)的glVertex3f()函數(shù)繪制.
STL(stereo lithographic)文件格式由3D Systems公司于1987年推出,同樣也是采用三角形面片進而離散地近似表示三維模型,目前STL已成為快速原型技術(shù)領(lǐng)域最為常用的文件格式和事實上的接口標(biāo)準(zhǔn)[2].研究各類三維網(wǎng)格圖形文件格式之間的轉(zhuǎn)化對于發(fā)展和擴充計算機圖形學(xué)領(lǐng)域來說,具有非常重要意義[4].在之前分析的基礎(chǔ)上,我們已經(jīng)對OFF文件的內(nèi)部數(shù)據(jù)結(jié)構(gòu)有了清晰的了解,它主要描述了點集合以及用點索引表示的三角面片集合.對于STL文件來說,它是由一系列無序的三角面片組成,而三角面片是直接用點來表示的,沒有用來反映三角面片之間的拓撲關(guān)系,并且每個三角面片都與相鄰的三角面片之間共用兩個頂點[3].根據(jù)兩者之間的聯(lián)系與區(qū)別,本小節(jié)設(shè)計并完成OFF文件到STL文件的轉(zhuǎn)化.
4.1STL格式文件的分析
如下為一個簡單的STL文件,以此為例進行分析.
第一行以solid關(guān)鍵字開頭,可指出文件路徑和文件名,第二行則以facet normal關(guān)鍵字指出指向?qū)嶓w外部的三角面片法向量的信息,隨后從outer loop開始到endloop結(jié)束為描述三角面片的三個頂點,endfacet表示本三角面片表示結(jié)束,endsolid Object01聲明了STL的結(jié)尾.
4.2OFF文件與STL文件的聯(lián)系與區(qū)別
從OFF文件當(dāng)中我們可以很容易的找到與STL文件的一些聯(lián)系和區(qū)別.
① 點的表示OFF文件和STL文件均可用正常浮點數(shù)及科學(xué)記數(shù)法表示,如+0.75、-0.52628e+00.
② OFF文件中存在表示頂點個數(shù)和三角面片及邊數(shù)的信息,而STL文件沒有明確給出,需要后期計算.
③ OFF文件用頂點的索引表示三角面片,而STL文件之間直接用關(guān)鍵字facet羅列表示.
④ OFF文件并沒有指出指向?qū)嶓w外部的三角面片法向量的信息,而STL文件恰好給出了這樣的信息.
通過以上分析我們可以發(fā)現(xiàn),利用OFF文件提供的表示三角面片的索引信息,通過使用向量法,可求出表示STL文件所用的法向量.
4.3轉(zhuǎn)換算法的實現(xiàn)
若以索引方式表示的三角面片為:
n1 n2 n3的空間坐標(biāo)分別為:
則設(shè)在該三角面片上相交的兩條直線的向量為:
由三角面片的法向量定義可知,其法向量垂直于該三角面片上任何兩條相交的直線,則設(shè)該三角面片的法向量為n且有:
根據(jù)以上公式繼續(xù)推導(dǎo)有:
隨后將x,y,z中的任意一個賦予一便于計算的定值,則可求出法向量n.利用單位化向量公式可進一步求出一定精度下的單位化法向量,具體為:
求出法向量后,我們可以利用C++ 標(biāo)準(zhǔn)IO庫的進行文件的寫入.按照STL文件的格式,依此寫入開始定義文件的關(guān)鍵字、指向?qū)嶓w外部的三角面片法向量、表示三角面片的三個頂點信息、結(jié)束定義文件的關(guān)鍵字即可完成從OFF文件到STL文件的轉(zhuǎn)化.
根據(jù)以上分析,使用MFC編程技術(shù)和OpenGL提供的函數(shù)接口,在Visual C++ 6.0平臺上進行實驗,以計算機模擬合成的OFF文件為數(shù)據(jù)材料,進行讀取顯示并實現(xiàn)了預(yù)期效果.圖3為顯示效果圖.
圖3 模型顯示效果圖
本文以理清OFF文件內(nèi)部存儲結(jié)構(gòu)、讀取及顯示OFF文件為目的,通過系統(tǒng)的分析、處理、實驗等操作實現(xiàn)了相應(yīng)目的,并研究轉(zhuǎn)換算法,完成了從OFF文件到STL文件的轉(zhuǎn)換.這方便了對OFF文件相關(guān)研究的擴展,為進一步對OFF文件進行冗余數(shù)據(jù)處理、三維網(wǎng)格圖形的形變操作、數(shù)據(jù)結(jié)構(gòu)算法的應(yīng)用、相應(yīng)的圖形處理的探索打下了基礎(chǔ).雖然對OFF文件的分析已經(jīng)有了系統(tǒng)的研究,但是在今后對于OFF文件的快速讀取、顯示、處理方面仍有待于我們進一步的研究和發(fā)現(xiàn).
參考文獻
1嚴梽銘,鐘艷如.基于VC++和OpenGL的STL文件讀取顯示.計算機系統(tǒng)應(yīng)用,2009,18(3):172–175.
2衛(wèi)煒,周來水,張麗艷.海量STL文件的快速讀取與顯示.機械科學(xué)與技術(shù),2006,25(8):935-938,975.
3朱虎,楊忠鳳,張偉.STL文件的應(yīng)用與研究進展.機床與液壓,2009,37(6).
4羅東.三維模型表現(xiàn)形式轉(zhuǎn)換技術(shù)及存儲格式定義的研究與實現(xiàn)[碩士學(xué)位論文].西安:西北大學(xué),2010.
5黎華,肖偉.幾種三維模型文件在OpenGL中的輸入與處理.物探化探計算技術(shù),2007,29(1):83–86.
6丁麗.基于OpenGL的三維模型的可視化研究[碩士學(xué)位論文].濟南:山東大學(xué),2009.
Format of Triangular Mesh File OFF and Transformation of STL to OFF
SHA Chen-Ming1,SHEN Zuo-Lin1,SHEN Ke-Xin2
1(School of Software,Harbin University of Science and Technology,Harbin 150040,China)2(School of Mechtronics Engineering,Daqing Normal University,Daqing 163712,China)
Abstract:OFF (Object File Format)is a kind of common format for three-dimensional model described with triangular mesh.The research of OFF is the foundation condition for reading,displaying and other operations.Nowadays,it doesn’t have a set of standards and specifications about the simple analysis of OFF.First of all,the software is based on Visual C++ 6.0 developing platform and uses MFC to achieve a visual interface.In addition,we can read and write the OFF file taking advantage of C++ standard I/O library and the view of OFF file is implemented by using OpenGL technology.In the end,we have a system that realizes the functions of reading and displaying for OFF file while it completes the transformation of file from OFF to STL with format conversion algorithms.
Key words:OFF; STL; format transformation; trianglular mesh model; OpenGL
基金項目:①黑龍江省大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練計劃項目(201510214027)
收稿時間:2015-07-17;收到修改稿時間:2015-09-16