柴微等
【摘 要】針對3D打印機工作時所需的STL文件,設(shè)計了一種無需三角形面片法向量信息的切片算法,采用垂直軸與切平面的空間平面信息進(jìn)行切片運算,并對切片過程中產(chǎn)生的錯誤數(shù)據(jù)進(jìn)行了分析,在VS2008環(huán)境中實現(xiàn)了對STL文件的切片。研究結(jié)果表明,此種切片算法,經(jīng)過對錯誤信息的處理可以得到片層的完整閉合輪廓信息,切片效率高。
【關(guān)鍵詞】3D打??;STL;切片算法;VS2008
0.引言
3D打印是將Solidworks或CAD等其它三維設(shè)計軟件設(shè)計的三維模型直接打印成真實物體。3D打印源于快速成型理念,它將所要打印的物體從底層開始,按照一定的層厚,一層一層堆疊起來,最終形成完整的物體。首先,由三維設(shè)計軟件設(shè)計物體結(jié)構(gòu),然后將所設(shè)計的物體存儲為STL格式,其次,計算機讀入STL文件,將得到的文件數(shù)據(jù)運用一定的切片算法進(jìn)行切片運算,得到每一層的完整輪廓,再次,根據(jù)得到的輪廓信息,對輪廓進(jìn)行填充與路徑規(guī)劃,最后,將得到的路徑信息轉(zhuǎn)化為實際的電機控制量,通過電機驅(qū)動執(zhí)行機構(gòu)實現(xiàn)3D打印。從3D打印的過程中可以看出,對STL文件進(jìn)行切片是實現(xiàn)3D打印功能的關(guān)鍵,完整正確的切片輪廓是后續(xù)計算的前提,它的精度直接決定了打印真實物體的精度。針對STL文件的切片技術(shù)國內(nèi)外有很多算法[1-5]。每種算法都有自己的優(yōu)缺點,本文采用的算法所需的數(shù)據(jù)量小,效率高,針對不同的物體能得到任何高度的完整輪廓信息。
1.STL文件概述
應(yīng)用于3D打印的文件有多種文件格式,由于STL文件結(jié)構(gòu)簡單,多數(shù)三維設(shè)計軟件都可以將設(shè)計的三維實物直接存儲成STL文件,使得STL格式文件被廣泛應(yīng)用。
STL文件有兩種格式:二進(jìn)制格式與ASCII碼格式。無論是哪種格式,存儲的信息都是三角形的三個頂點與法向量。無數(shù)個這樣的三角形面片構(gòu)成了一個完整的STL文件。即三維實體。
二進(jìn)制格式的STL文件格式如下:
零件名 三角形個數(shù) 三角形面片信息
其中零件名占80字節(jié),三角形個數(shù)占4字節(jié),每個三角形面片信息占50字節(jié)。三角形面片信息包含12字節(jié)的法向量、36字節(jié)的坐標(biāo)、2字節(jié)的屬性項。
ASCII碼格式的STL文件格式如下:
solid 文件名
facet normal nx,ny,nz
outer loop
vertex V1x,V1y,V1z
vertex V2x,V2y,V2z
vertex V3x,V3y,V3z
endloop
endfacet
..............................
endsolid
ASCII碼格式的文件第一行是文件名,第二行是三角形法向量,第四行到第六行是三角形的三個頂點。二進(jìn)制格式的STL文件所占用的內(nèi)存小,ASCII碼格式的STL文件可讀性強。本文是對ASCII碼格式的STL文件操作。
2.基于VS2008切片算法實現(xiàn)
2.1切片算法基本思想
本文設(shè)計的算法無需三角形面片法向量計算,只需根據(jù)設(shè)定的層厚,逐層計算與切平面的交點,求得兩個交點坐標(biāo),將切平面與所有三角形面片計算得到的交點存儲到數(shù)組中,將得到的交點坐標(biāo)按照一定的順序重新存儲,形成有序的實數(shù)對以供后續(xù)處理。
2.2切片算法實現(xiàn)步驟
以VS2008為開發(fā)環(huán)境,實現(xiàn)步驟如下:
STEP1:解析STL文件,獲取各個三角形頂點坐標(biāo)信息。
STEP2:指定層厚為LYAYETHICK,第一層高度為k*LYAYETHICK.k=1.遍歷所有三角形,將與平面z=k*LYAYETHICK相交的三角形存儲在一個數(shù)組中。
STEP3:找到第一個與平面z相交的三角形,求出交點坐標(biāo),并標(biāo)記此三角形flag=1,表示此三角形已經(jīng)被處理過,本層不在處理。
STEP4:相鄰兩個三角形只能共有一條邊和兩個頂點,利用三角形鄰邊關(guān)系找到與此三角形相鄰的三角形,并求與平面z的交點坐標(biāo),并標(biāo)記此三角形flag=1。
求交點公式:
x=(x-x)+x (1)
y=(y-y)+y (2)
ZP=z (3)
其中:三角形一個頂點為(x,y,z),另一個頂點為(x,y,z)。
STEP5:以此類推直到遍歷完本層所有三角形。
STEP6:若回到第一個三角形后,本層還有剩余的三角形沒有被標(biāo)記1,說明本層不止一個輪廓,還有其他輪廓,需要找到另一個輪廓的第一個三角形,然后重復(fù)STEP3到STEP5。
STEP7:k=k+1,求新的平面z,重復(fù)STEP3到STEP6,直到z大于STL文件中零件的高度。
STEP8:處理各層得到的交點,消除間距過小、間距過大及非法數(shù)據(jù)等,得到完整的切片輪廓。
3.切片輪廓錯誤數(shù)據(jù)分析
完整正確的輪廓數(shù)據(jù)是后續(xù)進(jìn)行路徑規(guī)劃及運動控制的關(guān)鍵因素。然而在三維繪圖或?qū)⑷S繪圖軟件所繪制的物體存儲成STL文件過程中會產(chǎn)生錯誤的三角形鄰接關(guān)系。最終導(dǎo)致計算出的輪廓不閉合、偏差大等現(xiàn)象。常見的錯誤如下:
(1)一個三角形的一條邊被另外兩個三角形所共有。
(2)切平面z經(jīng)過三角形的一個頂點或一條邊。
(3)幾個三角形面片圍成的區(qū)域形成一個缺陷區(qū)域。
以上幾點都將導(dǎo)致找不到下一個鄰接的三角形,從而產(chǎn)生錯誤隨機數(shù)據(jù),需要將切平面z適當(dāng)?shù)姆糯蠡蚩s小。
(4)在切片計算過程中會產(chǎn)生INF0和IND0的數(shù)據(jù)點。在VS2008中用_finite()與_isnan()函數(shù)來消除非法的INF0與IND0數(shù)據(jù)
(5)對于曲率變換較大的零件,經(jīng)常會出現(xiàn)曲率過度時導(dǎo)致輪廓丟點不閉合,需要人為附加點,使輪廓形成完整的閉合輪廓,以便后續(xù)進(jìn)行輪廓填充。
4.數(shù)據(jù)分析
跟據(jù)本文所設(shè)計的算法,在VS2008中進(jìn)行試驗分析。對一個直徑為50mm壁厚2mm的空心球體進(jìn)行切片分層,層厚為0.3mm,共有166層,三角形個數(shù)為19842個,切片耗時2s。切片效率很高。從仿真過程中可以看到,經(jīng)過一系列錯誤數(shù)據(jù)處理后能得到完整的輪廓。
5.結(jié)論
本文設(shè)計的切片算法切片速度快,能夠處理多種原因產(chǎn)生的錯誤數(shù)據(jù),處理錯誤數(shù)據(jù)能力強,經(jīng)過輪廓閉合處理后,消除大量冗余數(shù)據(jù),補償丟失數(shù)據(jù),能得到完成的片層輪廓。
【參考文獻(xiàn)】
[1]黃新華,孫琨,方亮等.STL模型的分層輪廓數(shù)據(jù)優(yōu)化算法[J].機械科學(xué)與技術(shù),2004,23(5):605~607.
[2]胡德洲,李占利,李滌塵等.基于STL模型幾何特征分類的快熟分層處理算法研究[J].西安交通大學(xué)學(xué)報,2000,34(1):37~41.
[3]牟小云,鄭建明,田靜云.基于坐標(biāo)分層的STL模型切片算法的研究[J].機床與液壓,2008(36):52~54.
[4]趙吉賓,劉偉軍.快速成型技術(shù)中基于STL模型的分層算法研究[J].應(yīng)用基礎(chǔ)與工程科學(xué)學(xué)報,2008(16):224~233.
[5]趙吉賓,劉偉軍,王超越.STL文件的錯誤檢測與修復(fù)算法研究[J].計算機應(yīng)用,2003,23(2):32~34.