申作林,沙晨明
(哈爾濱理工大學(xué),哈爾濱 150040)
?
三角網(wǎng)格文件的格式處理在3D打印技術(shù)中的應(yīng)用
申作林,沙晨明
(哈爾濱理工大學(xué),哈爾濱 150040)
三維模型是計(jì)算機(jī)圖形學(xué)重要的組成部分,用網(wǎng)格描述的三維模型的表示又是3D打印技術(shù)應(yīng)用的先決條件,而對(duì)三角網(wǎng)格文件數(shù)據(jù)結(jié)構(gòu)的認(rèn)識(shí)將會(huì)直接影響到三維模型的分析處理。常用模型數(shù)據(jù)文件格式的提出,對(duì)擴(kuò)充計(jì)算機(jī)圖形學(xué)具有重要意義。在詳細(xì)了解3D打印流程基礎(chǔ)上,詳細(xì)分析常用基于三角網(wǎng)格文件的數(shù)據(jù)結(jié)構(gòu),針對(duì)目前OFF模型文件組織結(jié)構(gòu)的定義沒有形成系統(tǒng)的規(guī)范問題,完成一種OFF文件網(wǎng)格模型數(shù)據(jù)結(jié)構(gòu)的定義,提出模型互轉(zhuǎn)思想,設(shè)計(jì)一種轉(zhuǎn)換算法并進(jìn)行3D打印實(shí)驗(yàn)驗(yàn)證結(jié)果。
計(jì)算機(jī)圖形學(xué); 格式轉(zhuǎn)換;三維模型;3D打?。蝗蔷W(wǎng)格文件
三維模型是計(jì)算機(jī)圖形學(xué)中的重要組成部分,目前隨著3D打印技術(shù)的興起,三維模型在計(jì)算機(jī)應(yīng)用領(lǐng)域的研究中也扮演了更重要的角色。3D打印技術(shù)是制造業(yè)正在飛速發(fā)展的一項(xiàng)新興技術(shù),被稱為“具有工業(yè)革命意義的制造技術(shù)”。美國《時(shí)代》周刊也將3D打印列為“美國十大增長最快的工業(yè)”之一。對(duì)于這一空前的技術(shù)而言,它有著必然的優(yōu)勢,如:工業(yè)制造上無須模具即可加工、產(chǎn)出品多樣化、支持個(gè)性定制、降低技術(shù)門檻等。然而,在這種優(yōu)勢下也存在一系列問題,如:難以尋找具有優(yōu)良性能的可打印耗材、打印經(jīng)濟(jì)代價(jià)昂貴、打印操作過于復(fù)雜、用于打印的模型冗雜且處理方式不規(guī)范導(dǎo)致打印效率低下等。針對(duì)3D打印模型冗雜這一問題,本文將簡述3D打印的常規(guī)流程,提出“云制造+3D打印”的新型模式,論述常見三角網(wǎng)格模型文件的數(shù)據(jù)結(jié)構(gòu),針對(duì)OFF模型文件的組織結(jié)構(gòu)設(shè)計(jì)模型轉(zhuǎn)換算法,通過實(shí)驗(yàn)做出結(jié)論。
對(duì)3D打印流程的詳細(xì)分析,是實(shí)現(xiàn)3D打印流程細(xì)節(jié)優(yōu)化的最根本前提。傳統(tǒng)上認(rèn)為,3D打印可大致分為六個(gè)部分,如圖1所示。
在這六個(gè)部分中,前四項(xiàng)是數(shù)字幾何處理部分,在這里不妨把這四部分稱作“軟處理”部分,而后兩部分為硬件相關(guān)部分,稱作“硬處理”部分。由“軟”、“硬”的劃分可見,三維模型的處理在3D打印應(yīng)用中的重要性。
“云時(shí)代”的到來給制造業(yè)帶來了一種全新的流程模式,傳統(tǒng)的3D打印流程未能體現(xiàn)“云時(shí)代”的靈活性和多變性,那現(xiàn)在我們不妨思考一種全新的流程模式: 云制造+3D打印。在該模式下,通過基于Web的模型操作平臺(tái)處理欲打印的三維模型,亦可通過平臺(tái)結(jié)合格式轉(zhuǎn)換器轉(zhuǎn)換文件格式,上傳至三維模型庫或下載至本地,連接3D打印設(shè)備完成操作,如圖2所示。在這種模式下,不僅實(shí)現(xiàn)了制造的云處理,而且利用OFF文件模型庫占用空間少這一特點(diǎn),實(shí)現(xiàn)了資源的節(jié)約。
圖1 3D打印流程圖Fig.1 3D printing flow chart
圖2 云制造+3D打印Fig.2 Cloud manufacturing + 3D printing
通過以上的大致分析,已經(jīng)對(duì)3D打印流程有了一定的了解,下面本文將對(duì)數(shù)字處理階段進(jìn)行解析。
模型文件作為3D打印機(jī)的基本輸入將直接影響到3D打印的效率。對(duì)常用模型數(shù)據(jù)文件格式及文件內(nèi)部組織結(jié)構(gòu)的分析,有利于更深入的研究模型優(yōu)化算法,下面將介紹三種常用模型數(shù)據(jù)文件格式。
2.1 OBJ文件的數(shù)據(jù)結(jié)構(gòu)
OBJ文件是Alias| Wavefront公司為它的一套3D建模和動(dòng)畫軟件“Advanced Visualizer”而開發(fā)的3D模型文件格式,該格式以純文本的形式存儲(chǔ)了模型的頂點(diǎn)、面片、法線及紋理坐標(biāo)等使用信息。這種文件格式由于結(jié)構(gòu)簡單,通常是各種模型文件格式轉(zhuǎn)換的中間文件。
2.2 STL文件的數(shù)據(jù)結(jié)構(gòu)
STL同樣也是采用三角形面片進(jìn)而離散的表示三維模型,STL已成為快速原型技術(shù)領(lǐng)域的接口標(biāo)準(zhǔn)。對(duì)于STL文件來說,它是由一系列無序的三角面片組成,而三角面片是直接用點(diǎn)來表示的,沒有用來反映三角面片之間的拓?fù)潢P(guān)系,并且每個(gè)三角面片都與相鄰的三角面片之間共用兩個(gè)頂點(diǎn)。以部分STL文件片段為例進(jìn)行分析,分析如下:
solid STL File
Facet normal 0.000000e+000 0.000000e+000 8.729460e+000
outer loop
Vertex 6.198058e-001 2.317201e+001 3.826742e+001
Vertex 6.198058e-001 2.273891e+001 3.826742e+001
Vertex 6.376099e-001 2.318196e+001 3.826742e+001
endloop
endfacet
...
endsolid STL File
片段中以solid關(guān)鍵字開頭,指定了文件名,第二行用facet normal關(guān)鍵字指定了指向模型外部的面片法向量,隨后以outer loop和endloop為一對(duì)關(guān)鍵字描述三角形的三個(gè)頂點(diǎn),endfacet是面片定義結(jié)束,endsolid 意味著STL文件的結(jié)束。
STL文件的數(shù)據(jù)結(jié)構(gòu)只能描述三維模型的幾何信息,不能表示樣式信息,這區(qū)別于OBJ文件,STL是計(jì)算機(jī)圖形學(xué)、數(shù)字幾何處理、數(shù)字幾何工業(yè)應(yīng)用等領(lǐng)域最常用的文件格式,亦是三維打印機(jī)支持的最常見文件格式。
2.3 OFF文件的數(shù)據(jù)結(jié)構(gòu)
利用三角形圖元可以近似逼近出幾乎所有的三維立體模型,這種逼近方法也是多數(shù)三維網(wǎng)格數(shù)據(jù)文件所采用的方法。OFF( Object Format File )文件也采用了這種方法,它利用點(diǎn)和邊組成許多空間三角形來逼近三維模型表面。與其他文件不同,OFF文件的數(shù)據(jù)只支持ASCII格式存儲(chǔ),利用ASCII格式存儲(chǔ)的優(yōu)點(diǎn)是可讀性強(qiáng),方便理解數(shù)據(jù)。下面再看一個(gè)例子,來理解OFF的數(shù)據(jù)結(jié)構(gòu)。
OFF
4 4 6
0.0 0.0 2.0
1.632993 -0.942809 -0.666667
0.000000 1.885618 -0.666667
-1.632993 -0.942809 -0.666667
3 1 0 3
3 2 0 1
3 3 0 2
3 3 2 1
圖3 OFF文件顯示圖Fig.3 OFF document display image
如圖3所示為該OFF文件的顯示圖。由示例可知,OFF文件與OBJ文件非常相似,只不過與OFF相比OBJ文件多了一組表示信息,例子中的第二行“4 4 6”,分別代表模型頂點(diǎn)數(shù),三角面片數(shù),邊數(shù)。隨后是頂點(diǎn)坐標(biāo)及三角面片,拿一個(gè)面片為例:“3 1 0 3”中第一個(gè)“3”代表隨后跟著3個(gè)點(diǎn)的索引值,值得注意的是,索引值從0開始( 與OBJ文件不同 )。與STL相似,OFF也沒有表示模型樣式的相關(guān)信息,這很方便進(jìn)行OFF到STL的轉(zhuǎn)換。
盡管在計(jì)算機(jī)圖形學(xué)方面有所建樹的國內(nèi)外學(xué)者對(duì)三維圖形有了深入的研究,但是對(duì)于OFF文件數(shù)據(jù)結(jié)構(gòu)的定義卻沒有形成一種規(guī)范定義。在對(duì)OFF模型的數(shù)據(jù)結(jié)構(gòu)有了一定的了解之后,本小節(jié)試圖給出OFF描述的三維模型的定義。
3.1 頂點(diǎn)的定義
從集合論的角度很容易得到如下頂點(diǎn)的定義:
V:{p1(x1,y1,z1),…,pn(xn,yn,zn)}
使用C++語言描述的頂點(diǎn)部分定義如下:
Class Vector
{
unsigned int id; /*頂點(diǎn)標(biāo)識(shí)*/
float x,y,z; /*頂點(diǎn)坐標(biāo)*/
};
3.2 面片的定義
設(shè)面片集合:
S:{s1,s2,…,sn}
根據(jù)頂點(diǎn)的定義,有映射:
f:V→S
sn=f(pn,pm,pv)
其中pn,pm,pv∈V,sn∈S
得到面片集為:
S:{sn|sn=f(pn,pm,pv),p∈V}
使用C++語言描述的三角面片部分定義如下:
Class Triangle
{
unsigned int id; /*面片標(biāo)識(shí)*/
int verts[3]; /*三角形的三個(gè)點(diǎn)的標(biāo)識(shí)*/
int nverts; /*頂點(diǎn)索引個(gè)數(shù)*/
};
3.3 網(wǎng)格模型的定義
有了上述頂點(diǎn)和面片的定義,很容易完成網(wǎng)格模型的定義。
網(wǎng)格定義如下:
M:{(V,S)}
其中V是包含全部頂點(diǎn)的集合,S是包含由3個(gè)V集合上的點(diǎn)所組成的面片集合。
使用C++語言描述的網(wǎng)格模型部分定義如下:
class CMesh
{
Vertex * vertex; /*點(diǎn)集合*/
Triangle * triangle; /*面片集合*/
...
int nVertices,nTriangles,nEdges;
/*存儲(chǔ)相關(guān)數(shù)目*/
public:
void Read();
void RenderScene();
...
};
3.4 網(wǎng)格模型的操作
根據(jù)上述模型的定義,可以結(jié)合OpenGL編程技術(shù)進(jìn)行模型的讀取及繪制操作,OpenGL編程技術(shù)的使用能更好的實(shí)現(xiàn)三維模型的立體感和真實(shí)感,在繪圖方面更加有優(yōu)勢。圖4為OpenGL顯示效果圖,可以利用OpenGL提供的各種API接口實(shí)現(xiàn)模型的顯示。
下面部分代碼使用了部分繪圖函數(shù):
void CMesh:: RenderScene(){
...
for(int i=0;i glBegin(GL_TRANGLES); glVertex3f(vertex[i].x,vertex[i].y, vertex[i].z); glVertex3f(vertex[i+1].x,vertex[i+1].y, vertex[i+1].z); glVertex3f(vertex[i+2].x,vertex[i+2].y, vertex[i+2].z); glEnd();} ... } 圖4 OFF模型顯示示例Fig.4 OFF model display scale 3.5 模型互轉(zhuǎn)研究 研究常用三維網(wǎng)格數(shù)據(jù)文件格式之間的轉(zhuǎn)換,無論對(duì)于擴(kuò)充計(jì)算機(jī)圖形學(xué)還是更好地應(yīng)用3D打印技術(shù)來說,都具有非常重要意義?;谏鲜龇治?,我們已經(jīng)對(duì)常用模型數(shù)據(jù)文件格式( OBJ、STL、OFF ) 的內(nèi)部數(shù)據(jù)組織結(jié)構(gòu)有了一定了解,下面本文將根據(jù)模型的定義分析三種文件的各自特點(diǎn),提出轉(zhuǎn)換思想。 前面提到的OBJ文件很適合用于模型之間的互轉(zhuǎn),所以本小節(jié)著重分別分析OBJ與STL、OFF的聯(lián)系和區(qū)別。從OBJ文件中可以很容易找到與STL文件、OFF文件的一些聯(lián)系和區(qū)別。 A.OBJ文件可以存儲(chǔ)模型的樣式等信息,而STL文件與OFF文件并沒有相關(guān)表示信息,所以在設(shè)計(jì)轉(zhuǎn)換時(shí)只需舍去樣式表示信息即可。 B.OBJ文件與OFF文件用索引表示三角面片,但兩者表示范圍不同,OBJ文件的點(diǎn)索引下標(biāo)從1開始, OFF文件的點(diǎn)索引下標(biāo)從0開始。STL用outer loop和endloop關(guān)鍵字結(jié)合三個(gè)頂點(diǎn)描述三角形面片,所以在設(shè)計(jì)轉(zhuǎn)換時(shí)使用適當(dāng)?shù)谋硎痉椒纯伞?/p> C.OBJ文件與STL文件均可存儲(chǔ)面片法向量信息,而OFF文件沒有相關(guān)表示信息。所以在設(shè)計(jì)轉(zhuǎn)換時(shí),需要計(jì)算面片法向量。 D.OFF文件存儲(chǔ)了相關(guān)點(diǎn)、邊及面片的數(shù)量信息,而OBJ文件與STL文件沒有明確給出,所以在設(shè)計(jì)轉(zhuǎn)換時(shí)需要計(jì)算相關(guān)信息數(shù)目。 通過以上分析可以發(fā)現(xiàn),利用文件的各自特點(diǎn),通過使用提供的索引信息,使用幾何學(xué)中的向量法,可求出表示STL文件所用的法向量,進(jìn)而得到3D打印需要的STL文件格式。 3.6 一種簡單的OFF到STL的轉(zhuǎn)換算法 OFF文件和STL文件同樣采用二進(jìn)制文本信息來描述三維模型的方式,但是OFF文件通過其特有的數(shù)據(jù)結(jié)構(gòu),較STL文件在數(shù)據(jù)存儲(chǔ)上占有一定的優(yōu)勢,這種優(yōu)勢在建立大型三維模型庫、云制造的資源空間等應(yīng)用上表現(xiàn)得更加明顯。因此,可以利用OFF文件存儲(chǔ)空間較小這一特點(diǎn),應(yīng)用OFF模型文件處理平臺(tái)對(duì)OFF文件進(jìn)行預(yù)處理操作,再通過調(diào)用轉(zhuǎn)換算法完成模型轉(zhuǎn)換,來達(dá)到節(jié)約時(shí)間和空間的目的。 圖5 轉(zhuǎn)換算法流程Fig.5 Transition algorithm flow path 圖5描述了轉(zhuǎn)換算法的流程,下面將實(shí)現(xiàn)轉(zhuǎn)換算法代碼: Void Transformation algorithm ( CMesh inputMesh/*輸入模型文件*/ ) { FILE*fout=fopen(“D://outputMesh.stl”,“w”); //打開輸出文件 for(int i = 0; i //遍歷表示模型的所有三角形 { Vector vertexA, vertexB, vertexC, tempVector1, tempVector2, normalVector; //結(jié)點(diǎn)的獲取 vertexA.x=inputMesh.vertex[inputMesh.triangle[i].verts[0]].x; VertexA.y=inputMesh.vertex[inputMesh.triangle[i].verts[0]].y; vertexA.z=inputMesh.vertex[inputMesh.triangle[i].verts[0]].z; /*用第i個(gè)三角形的第0個(gè)點(diǎn)的索引值來訪問第i個(gè)三角形的第0個(gè)點(diǎn)的坐標(biāo)值*/ vertexB.x=inputMesh.vertex[inputMesh.triangle[i].verts[1]].x; vertexB.y=inputMesh.vertex[inputMesh.triangle[i].verts[1]].y; vertexB.z=inputMesh.vertex[inputMesh.triangle[i].verts[1]].z; /*用第i個(gè)三角形的第1個(gè)點(diǎn)的索引值來訪問第i個(gè)三角形的第1個(gè)點(diǎn)的坐標(biāo)值*/ vertexC.x=inputMesh.vertex[inputMesh.triangle[i].verts[2]].x; vertexC.y=inputMesh.vertex[inputMesh.triangle[i].verts[2]].y; vertexC.z=inputMesh.vertex[inputMesh.triangle[i].verts[2]].z; /*用第i個(gè)三角形的第2個(gè)點(diǎn)的索引值來訪問第i個(gè)三角形的第2個(gè)點(diǎn)的坐標(biāo)值*/ //法向量計(jì)算區(qū)域 tempVector1.x = vertexB.x-vertexA.x; tempVector1.y = vertexB.y-vertexA.y; tempVector1.z = vertexB.z-vertexA.z; tempVector2.x = vertexC.x-vertexA.x; tempVector2.y = vertexC.y-vertexA.y; tempVector2.z = vertexC.z-vertexA.z; normalVector.x=tempVector1.y*tempVector2.z-tempVector1.z*tempVector2.y; normalVector.y=tempVector1.z*tempVector2.x-tempVector1.x*tempVector2.z; normalVector.z=tempVector1.x*tempVector2.y-tempVector1.y*tempVector2.x; //單位化法向量 float mol= sqrt(normalVector.x*normalVector.x+normalVector.y*normalVector.y+normalVector.z*normalVector.z); //向量的模 normalVector.x=normalVector.x/mol; normalVector.y=normalVector.y/mol; normalVector.z=normalVector.z/mol; fwrite();//按照STL格式寫入關(guān)鍵字 } fclose(fout);//關(guān)閉文件 } 實(shí)驗(yàn)步驟:本實(shí)驗(yàn)在VC++6.0平臺(tái)上實(shí)現(xiàn)轉(zhuǎn)換算法,并完成若干模型的轉(zhuǎn)換得到3D打印需要的STL文件格式。使用型號(hào)為BI V2.0的實(shí)驗(yàn)型3D打印機(jī),如圖6所示。實(shí)驗(yàn)耗材選用ABS樹脂,模型使用計(jì)算機(jī)虛擬合成的三維模型,原始模型如圖7中M1所示。實(shí)驗(yàn)利用的簡化基本操作為邊折疊,采用誤差測度-二次誤差度量算法,并將簡化測度化簡為計(jì)算簡單的遞推表達(dá)式的方法預(yù)處理原始模型文件,得到M2所示模型。 圖6 BI V2.0 3D打印機(jī)Fig.6 BI V2.0 3D printer 利用以上模型,調(diào)節(jié)切片厚度,填充密度級(jí)別并保持其他參數(shù)不變的前提下進(jìn)行打印測試,欲打印模型大小為(W,D,H:100.0 mm,45.07 mm,73.12 mm)。其他主要控制參數(shù)見表1。 圖7 模型簡化Fig.7 Model simplification 表1 其他主要控制參數(shù) 新一代信息技術(shù)與制造業(yè)的融合,正引發(fā)影響深遠(yuǎn)的全球產(chǎn)業(yè)革命,更為我國制造業(yè)的轉(zhuǎn)型升級(jí)、創(chuàng)新發(fā)展提供重大機(jī)遇,在《中國制造2025》的強(qiáng)國戰(zhàn)略下,從“中國制造”到“中國智造”,全面提升產(chǎn)業(yè)技術(shù)水平和國際競爭力刻不容緩。對(duì)于3D打印這一具有跨時(shí)代意義的技術(shù)而言,大力推動(dòng)其發(fā)展不僅可以促進(jìn)制造業(yè)轉(zhuǎn)型升級(jí),更可為我國科學(xué)研究工作貢獻(xiàn)強(qiáng)大的力量。 [1] 劉利剛,徐文鵬,王偉明,等.3D打印中的幾何計(jì)算研究進(jìn)展[J].計(jì)算機(jī)學(xué)報(bào),2015,(06):1243-1267. [2] 嚴(yán)梽銘,鐘艷如.基于VC++和OpenGL的STL文件讀取顯示[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2009,18(03):172-175. [3] 沙晨明,申作林,申可心.三角網(wǎng)格文件OFF的格式分析及OFF到STL的轉(zhuǎn)化[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2016,(04):232-236. [4] 劉源.三維幾何模型的重建與結(jié)構(gòu)優(yōu)化[D].合肥:中國科學(xué)技術(shù)大學(xué),2015. [5] 胡瑞珍,黃惠.3D打印啟發(fā)下的模型實(shí)例化優(yōu)化研究綜述[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2015,(06):961-967. [6] 曾龍,劉永進(jìn),張東亮.面向三維打印的特征驅(qū)動(dòng)輪廓線編輯方法[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2015,(06):974-983. [7] 衛(wèi)煒,周來水,張麗艷.海量STL文件的快速讀取與顯示[J].機(jī)械科學(xué)與技術(shù),2006,25(08):935-938,975. [8] 牛振華,付婭琦,董遷遷. 3D打印速度的研究[J].江蘇科技信息,2014,(07):61-62. [9] 王勝法,李寶軍,呂掌權(quán),等.面向三維打印的殼狀結(jié)構(gòu)汽車及部件模型輕量化建模[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2015,(06):968-973. [10] 李小麗,馬劍雄,李萍,等.3D打印技術(shù)及應(yīng)用趨勢[J].自動(dòng)化儀表,2014,(01):1-5. The geometry of triangular mesh file processing in the application of 3D printing SHEN Zuo-lin, SHA Chen-ming (Harbin University of Science and Technology, Harbin 150040, China) Three dimensional model plays an important part in computer graphics, and the 3D model of mesh description is the precondition of 3D printing application. Understanding of the data structure of triangular mesh file will directly affect the processing of 3D model. Commonly used model data file format is of great significance to the expansion of computer graphics. On the basis of detailed understanding of the 3D printing process, a detailed analysis of the commonly used data structure based on the triangular grid file was made. In view of the problem that the definition of the structure of the OFF model file is not standardized, this paper defines the data structure of the OFF model, presents ideas of a model for transformation, designs a transformation algorithm and designs an experiment to verify the results through 3D printing. Computer graphics; Format conversion; 3D Model; 3D printing; Triangular mesh file 2017-01-06 黑龍江省大學(xué)生創(chuàng)新創(chuàng)業(yè)訓(xùn)練項(xiàng)目(201510214027) 申作林(1995-),男,本科在讀學(xué)生。 沙晨明(1981-), 女,碩士,講師。 TP391.41 A 1674-8646(2017)02-0018-054 實(shí)驗(yàn)
5 結(jié)語