日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 3D打印切片軟件Cura及CuraEngine原理分析

3D打印切片軟件Cura及CuraEngine原理分析

來源:程序員人生   發布時間:2016-03-31 08:47:52 閱讀次數:12747次

引言

        年初開始進入3D打印行業,受命以Cura為基礎,研發1款自主的3D打印切片軟件。

        自主研發要取其長處,補其不足,首先自然是要弄清楚Cura到底做了甚么,讀Cura的代碼是必須的。我1向都覺得比起自己寫代碼來,讀他人的代碼是1個漫又而痛苦的進程,讀者的思想與寫者總有偏差,常常又沒法驗證自己的料想是不是正確,只嘆人腦不是電腦,沒法把眼前的代碼從頭到尾履行1遍。不知道各位資深程序會有甚么辦法,我的辦法是“翻譯”,看著他人寫的代碼,加上自己的理解以后,按自己的喜好重新寫出來,看1段翻譯1段,等全部翻譯完成,理論上作者的思路也明白了,同時還有了1份功能1模1樣的代碼,自己的理解是不是正確,也能夠通過履行“翻譯”出來的代碼驗證。

        計劃總是美好的,中間的工程卻是充滿變數,之間的曲折折疊不說。經過若干次推倒重寫,委曲算是有了1份自己的切片軟件,又經過了半年的斟酌摸索和打印經驗積累,1個還算另自己滿意的切片軟件終究誕生。起名Pango,先觀大略。

        Pango的介紹和說明先按下不表,以會有機會另外發文詳述。
        在Pango的開發進程中,我對Cura的理解也日趨深入。時至本日,我也有了信心可以把我的這些經驗、理解和心得分享出來,供大家參詳12,若能對后來的Cura研究者有所助益,那是再好不過。


Cura的架構

        Cura是1個python語言實現,使用wxpython圖形界面框架的3D打印切片界面軟件,說它是界面軟件是由于Cura本身其實不會進行實際的切片操作。實際的切片工作是由另外1個C++語言實現的CuraEngine命令行軟件來具體負責的,用戶在Cura界面上的絕大多數操作,如加載模型、安穩旋轉縮放、參數設置等終究會轉換成并履行1條CuraEngine命令;CuraEngine把輸入的STL、DAE或OBJ模型文件切片輸出成gcode字符串返回給Cura;Cura再把gcode在3D界面上可視化成路徑展現給用戶。

        我主要參考的代碼是CuraEngine,本文主要篇幅也會放在CuraEngine上。而Pango的界面代碼就主要靠我自己發揮了。

        Cura和CuraEngine都可以Github上找到,地址:


        https://github.com/daid/Cura

        https://github.com/Ultimaker/CuraEngine

        我所參考的版本是15.04,15.06以后Cura和CuraEngine都有較大的改動,但核心流程沒變。所以本文分析的版本也到15.04為止。

        言歸正傳,下面我們將開始1步1步揭開CuraEngine把1個模型文件轉換成為gcode的進程。

切片流程

        從整體上講,CuraEngine的切片分為5個步驟:


步驟1:模型載入

        有1點3D編程經驗的人都知道,計算機中的3D模型大多是以3角形面組合成的表面所包裹的空間來表示的。3角形作為3D模型的基本單元,有結構簡單,通用性強,可組合成任意面的特點;空間坐標中只要3個點就能夠表示1個唯1的3角形,兩點只能表示1條直線,而再多的直線也沒法組成1個平面;空間中的任意3個不共線的點都可以組成1個3角形,而4個點所組成的4邊形就必須要求4點共面;任意的表面都可以拆解成3角形,1個4邊形可以拆解成兩個3角形,但1個3角形卻沒有辦法用4邊形組合而成。計算機所善于的事情就是把簡單的事情不斷重復,而3角形正是由于這些特性,成了計算機3D世界的基石。

        CuraEngine內部也是用3角形組合來表示模型的,不過一樣1個3角形組合,卻有沒有窮多種數據結構來進行存儲。CuraEngine切片的第1步,就是從外部讀入模型數據,轉換成以CuraEngine內部的數據結構所表示的3角形組合。

        有了3角形組合還不夠,CuraEngine在載入模型階段還要對3角形進行關聯。兩個3角形共有1條邊的,就能夠判斷它們為相鄰3角形。1個3角形有3條邊,所以最多可以有3個相鄰3角形。1般而言,如果模型是封閉的,那它的每個3角形都會有3個相鄰3角形。

        有了3角形的相鄰關系,可以大幅提高低1個步驟分層進程的處理速度。Cura之所以成為當前市場上切片速度最快的軟件,這是其中最顯著的優化之1。

        模型載入更詳細的進程會另文分析,敬請期待。

步驟2:分層

        如果把模型放在XY平面上,Z軸對應的就是模型高度。我們把XY平面抬高1定高度再與模型的表面相交,就能夠得到模型在這個高度上的切片。所謂的分層就是每隔1定高度就用1個XY平面去和模型相交作切片,層與層之間的距離稱為層高。全部層高切完后就能夠得到模型在每個層上的輪廓線。就像是切土豆片1樣,把1個圓的或不圓的異或不管甚么奇形怪狀的土豆用菜刀1刀1刀切開,最后就可以得到1盤薄如紙片的土豆片,固然那還得你的刀功要足夠好才行。

        分層本質上就是1個把3D模型轉化為1系列2D平面的進程,自此以后的所有操作就都是在2D圖形的基礎上進行了。

        在前面模型載入階段我說到了CuraEngine埋了1個3角形關聯的伏筆,作用是甚么,現在可以揭曉答案了。我們知道,兩個平面相交,得到的是1條直線,1個平面和1個3角形相交,就得到1條線段。固然也有可能甚么也得不到,平臺平行啦,3角形的3個點都在平面的同1面之類。這些我們可以不管,我們現在只關心和平面有交集的那些3角形便可。我們把1個平面和所有的3角形都相交了1遍,得到了許許多多的線段。但是我們需要的是2D圖形,3角形是2D圖形,4邊形,任意多邊形都是2D圖形,而線段不是。所以我們就要把這些線段試著連成1個多邊形,那末問題來了,要把這些線段連起來,只能兩個兩個地去試,看看它們是否是共端點。粗算1下,每層都是平方級的復雜度,再算上層數,那就是3次方級。但現在,我們知道了3角形的關聯關系。兩個關聯的3角形,如果都與1個平面相交,那它們的交線1定也是關聯的。如此1來,每條線段只需要判斷3個與它相鄰3角形,看看與這個平面有無交線便可,1下子就把問題的復雜度降了1個次元。速度自然可以有質的提升。

        分層更詳細的進程會另文分析,敬請期待。

步驟3:劃分組件

        經過分層以后,我們得到了1疊2D平面圖形。接下來需要做的事情就是對每層的平面圖形進行跑馬圈地,標記出哪里是外墻、內墻、填充、上下表面、支持等等。

         3D打印在每層是以組件單位,所謂組件指的就是每層2D平面圖形里可以連通的區域,比如左圖就能夠拆分為黃、綠、藍3個組件。而打印的順序就每打印完1個組件,接著會挑選1個離上1個組件最近的組件作為下1個進行打印,如此循環直至1層的組件全部打印完成;接著會Z軸上升,重復上述步驟打印下1層的所有組件。

        至于每個組件怎樣打印,就和我們手工畫畫1樣,先打邊線再對邊線內部填充。邊線可以打印多圈,最外層圈邊線稱為外墻,其它的統稱為內墻,CuraEngine之所以要對內外墻進行辨別,是為了可以為它們定制不同的打印參數:外墻會被人視察到,所以可以采取低速以提高表面質量,內墻只是起增加強度的作用,可以稍略加快打印速度以節省時間。這些都可以在Cura界面的高級選項里進行配置。

        有1點值得注意,這也是我半年打印的經驗:由于FDM擠出裝置的特性所至,擠出機是通過影響加熱腔里的熔絲壓力,間接決定噴嘴擠出速度的。而加熱腔本身對壓力就有1個緩沖作用,所以擠出機進絲速度的突變其實不會使得噴嘴的擠出速度立即隨著變化,而是有1個延遲。這1點在遠端送絲的機器上更加明顯,而恰恰我們公司的主打產品F3CL就是遠端送絲,在Pango中斟酌到這個問題,并加上了特殊處理,事實證明的確對打印質量有1定的提升。具體辦法是甚么,我先賣個關子,會Pango的專文里進行講授。

        內外墻標記完以后就是填充和上下表面的標記了。填充有1個填充率,0%填充率就是無填充,100%就是打成1個密實的平面,上下表面就是填充率為100%的填充。中間的填充率自然介于二者之間,就像1張魚網,填充率越高網眼越細。

        軟件會先把內墻之內部份統統標記成填充,以后再進1步判斷其中有哪些部份要轉換成為上下表面。是哪些部份呢?在Cura的基本設置里有1個上下表面層數的設置,它代表了模型的上下與空氣接觸的表面有幾層,它就在這里會被用到。CuraEngine會把當前層上下n層(上下表面層數)取出來與當前層進行比較,凡是當前層有而上下n層沒有的部份就會被劃歸到表皮。而原來的填充區域在割除被劃到表皮的部份后剩下的部份就是終究的填充區域。

        CuraEngine在處理進程中大量用到了2D圖形運算操作。有關2D圖形的運算,有很多人研究,也被做成許多成熟的庫以供調用。CuraEngine的作者拿來主義,選取了1個他認為比較好用的庫,叫ClipperLib的庫直接內嵌到軟件當中。ClipperLib所使用的2D圖形算法也很著名,叫Vattis Clipping Algorithm,很復雜,我也沒有完全弄懂,有興趣的讀者要是弄懂了可以多多交換。ClipperLib的網址是:http://www.angusj.com/delphi/clipper.php

        這里我先簡單介紹1下CuraEngine所用到的幾種2D圖形的運算,都是由ClipperLib實現的:交、并、減、偏移。它們與集合操作類似,先看圖:

 

圖形相交

        2元圖形操作,終究結果為兩個圖形共同包括的區域。記作:A * B

圖形相并

        2元圖形操作,終究結果為兩個圖形其中之1或二者所包括的區域。記作:A + B

圖形相減

        2元圖形操作,終究結果為屬于前者但不屬于后者的區域。記作:A - B

圖形偏移(外擴)

        1元圖形操作,終究結果為圖形區域的邊界向外擴大指定的距離。

圖形偏移(內縮)

        1元圖形操作,終究結果為圖形區域的邊界向內收縮指定的距離。內縮與外擴互為逆運算。

        這些就是CuraEngine所用到的2D圖形操作。運算不多,卻可以做許許多多的事情。比如上面所說的上下表面計算,就能夠用數學公式來表示:

表面(i) = [填充(i) - 層(i + n)] + [填充(i) - 層(i - n)]

填充(i) = 填充(i) - 表面(i)

        其中,i為當前層號,n為上下表面層數(可以不1樣)。多簡單,數學就是這么任性!

        一樣的,組件里面內外墻,填充怎樣劃分,只用1個內縮運算就能夠弄定:

外墻 = 組件.offset(-線寬)

內墻1 = 組件.offset(-線寬 * 2)

...

內墻n = 組件.offset(-線寬 * (n + 1))

填充 = 組件.offset(-線寬 * (n + 2))

        如果模型無需支持,那組件劃分到這里就能夠收工了。否則,接下就是計算支持的時間。

        我用CuraEngine半年下來覺得它最大的不足就是在支持上,這也是我在Pango投入最大精力要改進的地方,這里就先簡單介紹1下CuraEngine所用的支持算法。

        CuraEngine首先把全部打印空間在XY平臺上劃分成為200um*200um的網格。每一個網格的中心點再延Z軸向上作1條直線,這條直線可能會與組成3D模型的3角形相交。3角形與直線的交點和這個3角形的傾斜度會被記錄到網格里面。

        現在每一個網格里記錄下了1串被稱為支持點的列表,每一個支持點包括1個高度和1個傾斜度信息。接下來會對每一個網格的支持點列表依照高度從低到高排序。根據這些信息就能夠判斷模型上任意1個點是不是需要支持了,怎樣判斷,我們看圖說話:

        讓我們從底面開始延著1根網格中心線往上走。起始我們是在模型外部的,當遇到第1個支持點的時候,就從模型外部進入到了模型內部。我們稱這個支持點為進點。

        繼續向上,遇到了第2個支持點,又從模型內部又退到了模型外部。我們稱這個支持點為出點。

        接著向上,我們可以發現,進點與出點總是交替出現的。

        利用這個規律,對模型上任何1個點,我們只要找到這個點所對應的網格,再找到這個網格里在這個點以上最近的1個支持點,我們就能夠得到兩個信息:這個點之上是不是有模型懸空;這個點上面的懸空點的面的傾斜度是多少。

        Cura界面的專家設置里面有支持角度的設置,如果1個點處于模型懸空部份以下,并且懸空點傾斜度大于支持角度,那這個點就是需要支持的。所1個平臺上所有的需要支持的點連接起來圍成的2D圖形就是支持區域。

        CuraEngine所使用的支持算法比較粗糙,但勝在速度很快。先不說網格化后失去了精度,通過傾斜角度來判斷,模型下方1旦傾斜角產生了突變,像左圖這類從負45

度1下突變成正45度,傾斜角判斷無能為力,除非把它改大到60度,這樣的話,全部模型都會被過度支持。這樣矯枉過正,既不科學,也浪費材料和打印時間,還會對模型表面質量帶來不好的影響。

        科學的支持算法應當是找到模型局部最低點進行支持,最低點以上不1定需要支持。由于FDM材料本身的粘性,使得材料的走線可以有1部份懸空而不坍塌,這個效果被稱為

Overhang,只要上層材料的懸空距離小于1定的值,它就不需要支持,這個距離以我的經驗應當在1/4到1/2線寬之間。我在Pango中就基于這個思路重新實現了支持的算法,結果雖然速度不如Cura的支持算法那末快,但效果非常好,該撐的地方撐,不該撐的地方也不會多此1舉。

        Pango的支持算法我會在以后專文介紹。順帶1說,CuraEngine在下半年做了很大的改動,其中之1就是拋棄了之前的支持算法,而新的算法也和我上面所講的思想異曲同工。我要聲明的是Pango的支持算法和CuraEngine誰也沒有抄誰,我的算法是自己拍腦袋想出來的。算是英雄所見略同吧。

        支持范圍肯定以后,也和組件1樣,可以有外墻、內墻、填充、上下表面。依樣畫葫蘆便可。CuraEngine對支持,只會生成外墻和填充,Pango則會生成更多。

        組件和支持就是CuraEngine在這1步所生成的結果,這1步可以說是全部切片進程的核心,更詳細的進程會另文分析,敬請期待。



步驟4:路徑生成

        地圈好了,就該在里面種菜了。這1步路徑生成績要開始計劃噴頭在不同的組件中怎樣運動。路徑按大類來分,有輪廓和填充兩種。

        輪廓很簡單,沿著2D圖形的邊線走1圈便可。前1步所生成的外墻、內墻都屬于輪廓,可以直接把它們的圖形以設置里的線寬轉換為輪廓路徑。

        填充略微要復雜1些,2D圖形指定的只是填充的邊界,而生成的路徑則是在邊界的范圍內的條紋或網格結構,就像窗簾或魚網,如左圖。這兩種就最基本的結構,固然或許你還可以想出其它花式的填充,比如蜂窩狀或S型,這些在新的Cura或別的甚么切片軟件里可能會實現,但我打印下來還是這兩種基本結構更讓人放心。CuraEngine在專家設置里可以對填充類型進行選擇,里面除條紋和網格外還有1個自動選項,默許就是自動。自動模式會根據當前的填充率進行切換,當填充率小于20%就用條紋填充,否則使用網格填充。由于網格結構雖然更加公道,但它有1個問題,就是交點的地方會打兩次。填充率越高,交點越密,對打印質量的影響會越大。我們知道,表面就是100%的填充,如果表面用網格打,不但沒法打密實,表面還會坑坑洼洼,所以100%填充只能用條紋打,這就是CuraEngine推薦自動模式的緣由。

        至于填充率,就反應在線與線的間距上。100%填充率間距為0;0%填充率間距無窮大,1根線條也不會有。

        每一個組件獨立的路徑生成好了,還要肯定打印的前后順序。順序先好了可以少走彎路,打印速度和質量都會有提升。路徑的順序以先近后遠為基本原則:每打印完1條路徑,當前位置是上1條路徑的終點;在當前層里剩下還沒打印的路徑中挑選1條出發點離當前位置最近的1條路徑開打。路徑的出發點可以是路徑中的任意1個點,程序會自行判斷。而路徑的終點有兩種可能:對直線,圖形只有兩個點,終點就是除出發點以外的那個點;對輪廓,終點就是出發點,由于輪廓是1個封閉圖形,從它的出發點開始沿任意方向走1圈,最后還會回到出發點。CuraEngine對路徑選擇做了1個估值,除斟酌到先近后遠外,還順便參考了下1個點相對當前點的方向,它的物理意義就是減少噴頭轉彎。賽車在直道上開得1定比彎道快,不是么。

        路徑的順序也肯定了,還有1個問題需要斟酌:如果前后兩條路徑首尾相連,那直接走就是了,但大多數情況并不是如此,前1條路徑的終點常常和后1條路徑出發點之間有1段距離。這時候候去往下1點的路上要謹慎了,肯定不能繼續擠出材料,否則輕則拉絲,重則模型面目全非。這段路噴頭就需要空走,即噴頭只移動,不吐絲,那只要把擠出機停下來不轉就好了嗎?也不行,由于前面分析過,擠出機的速度要傳導到噴嘴,有1個延遲,不是你說停它就立即停下來的。這是FDM打印的通病,解決辦法就是回抽。所謂回抽,就是在空走之前先讓擠出機高速反轉1段材料,這樣就能夠瞬間把加熱腔里的材料抽光,再移動過去,中間就不會擠出材料,到了下1個點,在打印之前,先把剛才抽回去的絲再按1樣的長度放回來,繼續打印。回抽可以很好地解決空走拉絲的問題,但是它很慢,以抽1次0.5秒來算的話,如果打印1個表面,0.4線寬,10厘米的距離最少回抽25下,10幾秒鐘的時間1層,幾百上千層打下來,光回抽所用的時間就是幾個小時,是可忍孰不可忍!


        CuraEngine給我們提供了解決方案就是Comb,也就是繞路。我們先來看,是否是所有的回抽都是必須的呢?不回抽會拉絲是肯定的,但如果需要空走的路徑本來就要打印的,那拉絲又有何妨。按這個思路,就能夠給每一個組件設定1個邊界,只要路徑的出發點和終點都在這個邊界以內的,空走都不回抽。這樣可以解決80%的問題,但如果是左圖這樣的情況就行不通。

        紅色是出發點,綠色是終點,直接走過去會走出邊界的范圍。這時候我們就要繞1點路,走1條曲線到達我們的目的地。這就是Comb所做的事情,在Cura專家設置里面可以對Comb進行設置,選擇開啟、關閉還有表面不Comb。Comb可以大幅節省打印時間,但是同1個地方打印屢次對模型質量還是會有細微的影響,個中利弊,交給用戶自己判斷。

        Comb的調劑是個細致活,Pango花了相當多的時間來微調Comb功能以求到達更好的效果,進程繁瑣,不再贅述。

        至此路徑生成完成,更詳細的進程另文分析,敬請期待。

步驟5:gcode生成

        路徑都生成好了,還需要翻譯對打印機可以實別的gcode代碼才行。這1步花樣不多,循序漸進便可。

        先讓打印機做1些準備工作:歸零、加熱噴頭和平臺、抬高噴頭、擠1小段絲、風扇設置。

        從下到上1層1層打印,每層打印之前先用G0抬高Z坐標到相應位置。

        依照路徑,每一個點生成1條gcode。其中空走G0;邊擠邊走用G1,Cura的設置里有絲材的直徑、線寬,可以算出走這些距離需要擠出多少材料;G0和G1的速度也都在設置里可以調劑。

        若需回抽,用G1生成1條E軸倒退的代碼。在下1條G1履行之前,再用G1生成1條相應的E軸前進的代碼。

        所有層都打完后讓打印機做1些掃尾工作:關閉加熱、XY歸零、機電釋放。

        生成gcode的進程中,CuraEngine也會摹擬1遍打印進程,用來計算出打印所需要的時間和材料長度,這些也會寫在gcode的注釋里供用戶參考。

        gcode生成不用另文詳細分析,但是gcode的說明還是可以專文分析1下,敬請期待。

待續

         寫了這么多,Cura的切片流程也只能講個大概,也算是個提綱,希望對大家有所幫助。我計劃對上面的第1個步驟再專文分析。除此以外,還有Cura界臉部分和Cura與CuraEngine的通訊也能夠講講。以后就是我半年創作,自我感覺良好到覺得可以超出Cura的Pango,也是不說不快的。

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 亚洲欧美久久久 | 日韩视频在线免费观看 | 国产精品视频网 | 国产精品黄色网 | 国产毛片av| 99精品在线观看 | 最近中文字幕 | 亚洲国产精品自拍 | 国产精品一区二区在线播放 | 免费av网站观看 | 国产精品久久久久久久久久免费 | 久久精品播放 | 日韩在线毛片 | 日韩一区在线播放 | 久久久精品欧美一区二区 | 一区二区三区四区在线 | 日日操视频 | 亚洲欧美在线综合 | 日韩一区二区三区精品视频 | 国内久久精品 | 成人欧美一区二区三区视频网页 | 亚洲伊人av| 亚洲综合欧美 | 91精品国产欧美一区二区 | 精品久久久噜噜噜久久x99a | 国产高清在线精品 | 精品国产成人 | 三级网址在线播放 | 欧美一区二区三区视频在线 | 黄色片播放视频 | 亚洲福利片 | 91久久精品一区二区二区 | 一区二区三区 在线 | 亚洲欧洲自拍偷拍 | 中文av网站 | 99精品免费久久 | 成人精品久久久 | 高清国产一区二区三区 | 亚洲 变态 欧美 另类 捆绑 | 99久久综合国产精品二区国产 | 亚洲久久久久 |