步驟三:劃分組件
經(jīng)過分層之后,我們得到了一疊2D平面圖形。接下來需要做的事情就是對每一層的平面圖形進行跑馬圈地,標記出哪里是外墻、內(nèi)墻、填充、上下表面、支撐等等。
3D打印在每一層是以組件單位,所謂組件指的就是每一層2D平面圖形里可以連通的區(qū)域,比如左圖就可以拆分為黃、綠、藍三個組件。而打印的順序就每打印完一個組件,接著會挑選一個離上一個組件最近的組件作為下一個進行打印,如此循環(huán)直至一層的組件全部打印完成;接著會Z軸上升,重復(fù)上述步驟打印下一層的所有組件。
至于每一個組件怎么打印,就和我們手工畫畫一樣,先打邊線再對邊線內(nèi)部填充。邊線可以打印多圈,最外層圈邊線稱為外墻,其它的統(tǒng)稱為內(nèi)墻,CuraEngine之所以要對內(nèi)外墻進行區(qū)分,是為了可以為它們定制不同的打印參數(shù):外墻會被人觀察到,所以可以采用低速以提高表面質(zhì)量,內(nèi)墻只是起增加強度的作用,可以稍稍加快打印速度以節(jié)省時間。這些都可以在Cura界面的高級選項里進行配置。
有一點值得注意,這也是我半年打印的經(jīng)驗:由于FDM擠出裝置的特性所至,擠出機是通過影響加熱腔里的熔絲壓力,間接決定噴嘴擠出速度的。而加熱腔本身對于壓力就有一個緩沖作用,所以擠出機進絲速度的突變并不會使得噴嘴的擠出速度立即跟著變化,而是有一個延遲。這一點在遠端送絲的機器上更為明顯,而恰恰我們公司的主打產(chǎn)品F3CL就是遠端送絲,在Pango中考慮到這個問題,并加上了特殊處理,事實證明的確對打印質(zhì)量有一定的提升。具體辦法是什么,我先賣個關(guān)子,會Pango的專文里進行講解。
內(nèi)外墻標記完之后就是填充和上下表面的標記了。填充有一個填充率,0%填充率就是無填充,100%就是打成一個密實的平面,上下表面就是填充率為100%的填充。中間的填充率自然介于兩者之間,就像一張漁網(wǎng),填充率越高網(wǎng)眼越細。
軟件會先把內(nèi)墻以內(nèi)部分統(tǒng)統(tǒng)標記成填充,之后再進一步判斷其中有哪些部分要轉(zhuǎn)換成為上下表面。是哪些部分呢?在Cura的基本設(shè)置里有一個上下表面層數(shù)的設(shè)置,它代表了模型的上下與空氣接觸的表面有幾層,它就在這里會被用到。CuraEngine會把當前層上下n層(上下表面層數(shù))取出來與當前層進行比較,凡是當前層有而上下n層沒有的部分就會被劃歸到表皮。而原來的填充區(qū)域在割除被劃到表皮的部分后剩下的部分就是最終的填充區(qū)域。
CuraEngine在處理過程中大量用到了2D圖形運算操作。有關(guān)2D圖形的運算,有很多人研究,也被做成許多成熟的庫以供調(diào)用。CuraEngine的作者拿來主義,選取了一個他認為比較好用的庫,叫ClipperLib的庫直接內(nèi)嵌到軟件之中。ClipperLib所使用的2D圖形算法也很著名,叫Vatti's Clipping Algorithm,很復(fù)雜,我也沒有完全搞懂,有興趣的讀者要是搞懂了可以多多交流。
ClipperLib的網(wǎng)址是:http://www.angusj.com/delphi/clipper.php
這里我先簡單介紹一下CuraEngine所用到的幾種2D圖形的運算,都是由ClipperLib實現(xiàn)的:交、并、減、偏移。它們與集合操作類似,先看圖:
圖形相交
二元圖形操作,最終結(jié)果為兩個圖形共同包含的區(qū)域。記作:A * B
圖形相并
二元圖形操作,最終結(jié)果為兩個圖形其中之一或兩者所包含的區(qū)域。記作:A + B
圖形相減
二元圖形操作,最終結(jié)果為屬于前者但不屬于后者的區(qū)域。記作:A - B
圖形偏移(外擴)
一元圖形操作,最終結(jié)果為圖形區(qū)域的邊界向外擴展指定的距離。
圖形偏移(內(nèi)縮)
一元圖形操作,最終結(jié)果為圖形區(qū)域的邊界向內(nèi)收縮指定的距離。內(nèi)縮與外擴互為逆運算。
這些就是CuraEngine所用到的2D圖形操作。運算不多,卻可以做許許多多的事情。比如上面所說的上下表面計算,就可以用數(shù)學公式來表示:表面(i) = [填充(i) - 層(i + n)] + [填充(i) - 層(i - n)] 填充(i) = 填充(i) - 表面(i)
其中,i為當前層號,n為上下表面層數(shù)(可以不一樣)。多簡單,數(shù)學就是這么任性!
同樣的,組件里面內(nèi)外墻,填充怎么劃分,只用一個內(nèi)縮運算就可以搞定:外墻 = 組件.offset(-線寬) 內(nèi)墻1 = 組件.offset(-線寬 * 2) ... 內(nèi)墻n = 組件.offset(-線寬 * (n + 1)) 填充 = 組件.offset(-線寬 * (n + 2))
如果模型無需支撐,那組件劃分到這里就可以收工了。否則,接下就是計算支撐的時間。
我用CuraEngine半年下來覺得它最大的不足就是在支撐上,這也是我在Pango投入最大精力要改進的地方,這里就先簡單介紹一下CuraEngine所用的支撐算法。
CuraEngine首先把整個打印空間在XY平臺上劃分成為200um*200um的網(wǎng)格。每個網(wǎng)格的中心點再延Z軸向上作一條直線,這條直線可能會與組成3D模型的三角形相交。三角形與直線的交點以及這個三角形的傾斜度會被記錄到網(wǎng)格里面。
現(xiàn)在每個網(wǎng)格里記錄下了一串被稱為支撐點的列表,每個支撐點包含一個高度和一個傾斜度信息。接下來會對每個網(wǎng)格的支撐點列表按照高度從低到高排序。根據(jù)這些信息就可以判斷模型上任意一個點是否需要支撐了,怎么判斷,我們看圖說話:
讓我們從底面開始延著一根網(wǎng)格中心線往上走。起始我們是在模型外部的,當遇到第一個支撐點的時候,就從模型外部進入到了模型內(nèi)部。我們稱這個支撐點為進點。
繼續(xù)向上,遇到了第二個支撐點,又從模型內(nèi)部又退到了模型外部。我們稱這個支撐點為出點。
接著向上,我們可以發(fā)現(xiàn),進點與出點總是交替出現(xiàn)的。
利用這個規(guī)律,對于模型上任何一個點,我們只要找到這個點所對應(yīng)的網(wǎng)格,再找到這個網(wǎng)格里在這個點以上最近的一個支撐點,我們就可以得到兩個信息:這個點之上是否有模型懸空;這個點上面的懸空點的面的傾斜度是多少。
Cura界面的專家設(shè)置里面有支撐角度的設(shè)置,如果一個點處于模型懸空部分以下,并且懸空點傾斜度大于支撐角度,那這個點就是需要支撐的。所一個平臺上所有的需要支撐的點連接起來圍成的2D圖形就是支撐區(qū)域。
CuraEngine所使用的支撐算法比較粗糙,但勝在速度很快。先不說網(wǎng)格化后失去了精度,通過傾斜角度來判斷,模型下方一旦傾斜角發(fā)生了突變,像左圖這種從負45度一下突變成正45度,傾斜角判斷無能為力,除非把它改大到60度,這樣的話,整個模型都會被過度支撐。這樣矯枉過正,既不科學,也浪費材料和打印時間,還會對模型表面質(zhì)量帶來不好的影響。
科學的支撐算法應(yīng)該是找到模型局部最低點進行支撐,最低點以上不一定需要支撐。因為FDM材料本身的粘性,使得材料的走線可以有一部分懸空而不坍塌,這個效果被稱為Overhang,只要上層材料的懸空距離小于一定的值,它就不需要支撐,這個距離以我的經(jīng)驗應(yīng)該在1/4到1/2線寬之間。我在Pango中就基于這個思路重新實現(xiàn)了支撐的算法,結(jié)果雖然速度不如Cura的支撐算法那么快,但效果非常好,該撐的地方撐,不該撐的地方也不會多此一舉。
Pango的支撐算法我會在以后專文介紹。順帶一說,CuraEngine在下半年做了很大的改動,其中之一就是拋棄了之前的支撐算法,而新的算法也和我上面所講的思想異曲同工。我要聲明的是Pango的支撐算法和CuraEngine誰也沒有抄誰,我的算法是自己拍腦袋想出來的。算是英雄所見略同吧。
支撐范圍確定之后,也和組件一樣,可以有外墻、內(nèi)墻、填充、上下表面。依樣畫葫蘆即可。CuraEngine對于支撐,只會生成外墻和填充,Pango則會生成更多。
組件和支撐就是CuraEngine在這一步所生成的結(jié)果,這一步可以說是整個切片過程的核心。
|
你可能喜歡
拓竹Bambu Lab A1 mini測評:這臺3D打印機
變廢為寶:通過固相制造將鋁廢料轉(zhuǎn)化為3D打
新突破:基于聲波的3D打印技術(shù)——全息直聲
一篇帶你讀懂:金屬3D打印在航空航天領(lǐng)域的
推薦課程
神奇的3D打印
SLA3D打印工藝全套培訓課程 - 軟件篇
3D打印月球燈視頻教程 包括完整貼圖建模流
【原創(chuàng)發(fā)布】Cura軟件修改二次開發(fā)定制視頻