尹海濤,葉春生
(華中科技大學 材料成形與模具技術國家重點實驗室,湖北 武漢 430074)
3D打印起源于20世紀80年代,是為滿足模型制作以及快速成型的需求而推出,現已經成為計算機輔助設計和快速制造的通用技術平臺,3D打印可用于陶瓷、金屬和聚合物類材料生產,且可實現高效無模成形[1-5],因而在醫(yī)療、汽車、航空航天和建筑領域得到了廣泛的應用。
3D打印技術將三維模型切片成二維平面,對每一層二維平面進行打印,逐層疊加形成三維模型。切片過程使用一系列在特定位置且相互平行的平面與三維模型相交,從而得到模型在這些高度上的切點并形成一條或多條閉合路徑,閉合路徑的精度影響著二維平面的打印精度,從而影響整個三維模型的精度。劉恒、朱心雄[6]提出了STL模型的分層鄰接排序快速切片算法,徐敬華、盛紅升[7]提出了基于鄰接拓撲的流形網絡模型層切多連通域構建方法,張琪、孟正大[8]提出了基于三角片分割的包圍盒樹構造方法,使用上述方法可以快速生成有序的路徑切點序列,但是上述切片層路徑是直接將有序切點連接形成,會因三維模型數據文件的缺陷等原因,造成切面層路徑不夠光滑。Bezier曲線具備光滑連接特性,被廣泛應用于自由曲線曲面造型中[9-10]。本文使用三次Bezier曲線來生成3D打印中切面層路徑。
Pi(i=0,1,2,…,n)是曲線的n+1個控制點,n次Bezier曲線函數的表達式為:
(1)
式中,控制點Pi決定Bezier曲線具體走向;Bi,n(u)則是n次Bernstein基函數:
(2)
在3D打印中,每一個切片層的分層路徑是與其他層路徑不相交的閉合曲線。為了光滑分層路徑,本文采用閉合曲線方程。首先通過切片算法得到路徑切點,切點是分層路徑上的點,而Bezier曲線的求解是通過確定控制頂點來完成的,所以需要先計算出Bezier曲線的控制頂點。
根據每兩個頂點作為一個Bezier曲線的端點(即起始點和終止點),并由這兩個頂點結合相鄰的其他兩個頂點求得和這兩個頂點對應的Bezier曲線的控制點,然后根據端點和控制點繪制一條過兩個頂點的Bezier曲線。
如果把三階Bezier曲線(見圖1)中的P0和P3視為原始數據,只要找到P1和P2兩個點(稱其為控制點),就可以根據三階Bezier曲線公式計算出P0和P3之間平滑曲線上的任意點。
圖1 三階Bezier曲線圖
所以平滑問題變成了如何計算2個原始數據點之間的控制點的問題。步驟如下。
1)第1步:粗直線連接圖2中相鄰的原始數據點P0、P1、P2、P3,計算出各線段的中點(Ai),細直線連接相鄰的中點。
圖2 原始數據點線段中點圖
需要計算P1(x1,y1)和P2(x2,y2)之間的控制點,P0(x0,y0)是前一個需要經過的點,P3(x3,y3)是下一個需要經過的點,A0(xc1,yc1)、A1(xc2,yc2)、A2(xc3,yc3)表示點與點之間連線的中點。可用代碼表示為:
double xc1 = (x0 + x1) / 2.0;double yc1 = (y0 + y1) / 2.0;
double xc2 = (x1 + x2) / 2.0;double yc2 = (y1 + y2) / 2.0;
double xc3 = (x2 + x3) / 2.0;double yc3 = (y2 + y3) / 2.0;
2)第2步:根據圖3中相鄰2條粗直線長度之比,也就是L1/L0=d1/d0這個比例,分割其中點之間細直線連線,標記分割點。計算位于Ai連接線段上面的Bi。
圖3 分割點標記圖
k1、k2表示線段比例,B1(xm1,ym1)、B2(xm2,ym2)表示中點連線上的比例分割點。代碼表示為:
double len1 = sqrt((x1-x0) * (x1-x0) + (y1-y0) * (y1-y0));
double len2 = sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
double len3 = sqrt((x3-x2) * (x3-x2) + (y3-y2) * (y3-y2));
double k1 = len1 / (len1 + len2);double k2 = len2 / (len2 + len3);
double xm1 = xc1 + (xc2 - xc1) * k1;double ym1 = yc1 + (yc2 - yc1) * k1;
double xm2 = xc2 + (xc3 - xc2) * k2;double ym2 = yc2 + (yc3 - yc2) * k2;
3)第3步:平移細直線連線,使其分割點B1、B2與相對的原始數據點P1、P2重合,得到中點連線平移圖(見圖4)。
圖4 中點連線平移圖
4)第4步:調整平移后細直線連線的端點與原始數據點的距離,通??s減40%~80%,本文縮減50%,效果如圖5所示。
圖5 端點調整圖
C1(ctrl1_x, ctrl1_y)、C2(ctrl2_x, ctrl2_y)表示最后得到的控制點,smooth_value表示平滑值K,取值[0,1]。代碼表示為:
ctrl1_x = xm1 + (xc2 - xm1) * smooth_value + x1 - xm1;
ctrl1_y = ym1 + (yc2 - ym1) * smooth_value + y1 - ym1;
ctrl2_x = xm2 + (xc2 - xm2) * smooth_value + x2 - xm2;
ctrl2_y = ym2 + (yc2 - ym2) * smooth_value + y2 - ym2;
使用上述方法,在切片過程中得到m+1個閉合數據點Pi(i=0,1,…,m)。本文平滑值K取為0.5,在經過控制頂點計算之后得到2m+2個控制頂點Ci(i=0,1,…,2m+1)。
經典的n次Bernstein基函數是由n+1個n次多項式函數構成的線性無關的函數組,用Bn,i(t)來表示其中的第i個,則
(3)
式中,i=0,1,…,n;t∈[0,1]。
每一個n次的Bernstein基函數都可以用2個相鄰的n+1次Bernstein基函數的線性組合來表示,即Bernstein基函數具有升階公式
(4)
式中,i=0,1,…n。
有了Bernstein基函數,并且給定了控制頂點以后,就可以用這兩者的線性組合來定義Bezier曲線。這里用Qi(i=0,1,…,n)來表示n次Bezier曲線的控制頂點,用pn(t)表示n次Bezier曲線,則
(5)
由式5可知,Bezier曲線由控制頂點和Bernstein基函數共同確定,又由于曲線中所采用的Bernstein基函數的次數取決于控制頂點的數量,而一旦次數確定,Bernstein基函數便固定下來,因此可以說,Bezier曲線的形狀是由控制頂點唯一確定的。
本文在平面描述中采用有序插入點策略,設定特定的步長決定曲線的疏密程度,從而表示一條在二維切面層的曲線。在Bezier曲線的每個分段上求解一定數目點的坐標,加入到路徑切點坐標中的相應位置中,然后順序連接切點生成路徑。
課題組自主開發(fā)的微噴射3D打印設備如圖6所示。該設備主要由4部分組成,分別是鋪粉機構、粘結劑噴射機構、機械運動機構和控制系統(tǒng)[11-12]??刂葡到y(tǒng)又分為硬件系統(tǒng)和軟件系統(tǒng)兩部分。
圖6 3D打印設備
試驗打印的三維模型為一個齒輪,試驗采用FZR-10型號的純氧化鋯陶瓷粉末,粉末的粒度控制在1 μm左右。
使用連續(xù)打印模式,采用0.1 mm的層間距,每層打印3次。打印成形的樣品如圖7所示。
圖7 齒輪樣品
總的來說,成形樣品的表面輪廓清晰,成形精度較高,能夠看出輪廓曲線整體的光滑。但由于粘結劑黏度的不足,相對應粘結區(qū)域黏度不夠造成部分脫落而導致極少數位置存在小缺口,而由于噴射裝置電動機存在起驟停,產生抖動造成極少量毛刺。
本文針對微噴射3D打印中分層路徑粗糙問題,提出使用三次Bezier曲線優(yōu)化路徑形成的方法,首先通過二維切面的有序切點求出Bezier曲線控制頂點,然后根據所求得控制頂點確定Bezier曲線的基函數從而求得確定的Bezier曲線。采用有序插入點策略,設定特定的步長決定曲線的疏密程度,在曲線所經切點之間求解一定數目的頂點,加入到路徑切點原始序列的相應位置,順序連接從而表示一條在二維切面層的Bezier曲線。該方法能夠使原本粗糙的切面路徑變得光滑。