目前,我們還在函數(shù)prepareModel中徘徊,因?yàn)檫@函數(shù)實(shí)在是太長(zhǎng)了,近乎包含了整個(gè)數(shù)據(jù)處理過(guò)程。通過(guò)前面兩篇,幾何圖形已經(jīng)被導(dǎo)入到內(nèi)存中,并且由一個(gè)simplemodel變成了一個(gè)optimizedmodel?,F(xiàn)在程序拿起了屠刀,開(kāi)始了切片過(guò)程。
通常來(lái)講,在3D打印中所說(shuō)的slicer過(guò)程包含了切割幾何體,連接多邊形,生成Gcode的所有過(guò)程,但在此程序中,slicer步僅為生成切片的切割操作。每一個(gè)切包含若干個(gè)閉合平面多邊形。這些多邊形的產(chǎn)生分兩步。第一,所有的三角形面片被切割成為一條線段;第二,將每層的線段連接起來(lái)形成閉合多邊形。前篇所述的點(diǎn)-面對(duì)應(yīng)關(guān)系可以幫助這一過(guò)程快速進(jìn)行,因?yàn)閮蓚€(gè)相鄰的面上的切割線段很有可能就是相鄰線段。這段程序還可以幫助修補(bǔ)幾何圖形中的空洞,因此STL模型不需要那么完美。它也可以處理錯(cuò)誤的法向量,所以它可以翻轉(zhuǎn)線段來(lái)滿足端點(diǎn)到端點(diǎn)的連接。slicer步驟之后我們得到了一系列閉合多邊形,然后會(huì)用到clipper來(lái)處理這些多邊形(clipper只可以處理2D閉合多邊形)。這一段來(lái)自cura-engine github主頁(yè)的介紹。
切割過(guò)程代碼在slicer.h和slicer.cpp這兩個(gè)文件中。首先我們看其中的class slicer
1 SlicerSegment project2D(Point3& p0, Point3& p1, Point3& p2, int32_t z) const2 {3 SlicerSegment seg;4 seg.start.X = p0.x + int64_t(p1.x - p0.x) * int64_t(z - p0.z) / int64_t(p1.z - p0.z);5 seg.start.Y = p0.y + int64_t(p1.y - p0.y) * int64_t(z - p0.z)