切片软件Cura及CuraEngine原理分析3-划分组件 

3D打印技术 /[软件]
2017-03-17 18:14
                                        步骤三:划分组件

       经过分层之后,我们得到了一叠2D平面图形。接下来需要做的事情就是对每一层的平面图形进行跑马圈地,标记出哪里是外墙、内墙、填充、上下表面、支撑等等。
1.png          

      3D打印在每一层是以组件单位,所谓组件指的就是每一层2D平面图形里可以连通的区域,比如左图就可以拆分为黄、绿、蓝三个组件。而打印的顺序就每打印完一个组件,接着会挑选一个离上一个组件最近的组件作为下一个进行打印,如此循环直至一层的组件全部打印完成;接着会Z轴上升,重复上述步骤打印下一层的所有组件。

       至于每一个组件怎么打印,就和我们手工画画一样,先打边线再对边线内部填充。边线可以打印多圈,最外层圈边线称为外墙,其它的统称为内墙,CuraEngine之所以要对内外墙进行区分,是为了可以为它们定制不同的打印参数:外墙会被人观察到,所以可以采用低速以提高表面质量,内墙只是起增加强度的作用,可以稍稍加快打印速度以节省时间。这些都可以在Cura界面的高级选项里进行配置。


        有一点值得注意,这也是我半年打印的经验:由于FDM挤出装置的特性所至,挤出机是通过影响加热腔里的熔丝压力,间接决定喷嘴挤出速度的。而加热腔本身对于压力就有一个缓冲作用,所以挤出机进丝速度的突变并不会使得喷嘴的挤出速度立即跟着变化,而是有一个延迟。这一点在远端送丝的机器上更为明显,而恰恰我们公司的主打产品F3CL就是远端送丝,在Pango中考虑到这个问题,并加上了特殊处理,事实证明的确对打印质量有一定的提升。具体办法是什么,我先卖个关子,会Pango的专文里进行讲解。

        内外墙标记完之后就是填充和上下表面的标记了。填充有一个填充率,0%填充率就是无填充,100%就是打成一个密实的平面,上下表面就是填充率为100%的填充。中间的填充率自然介于两者之间,就像一张渔网,填充率越高网眼越细。
        软件会先把内墙以内部分统统标记成填充,之后再进一步判断其中有哪些部分要转换成为上下表面。是哪些部分呢?在Cura的基本设置里有一个上下表面层数的设置,它代表了模型的上下与空气接触的表面有几层,它就在这里会被用到。CuraEngine会把当前层上下n层(上下表面层数)取出来与当前层进行比较,凡是当前层有而上下n层没有的部分就会被划归到表皮。而原来的填充区域在割除被划到表皮的部分后剩下的部分就是最终的填充区域。


        CuraEngine在处理过程中大量用到了2D图形运算操作。有关2D图形的运算,有很多人研究,也被做成许多成熟的库以供调用。CuraEngine的作者拿来主义,选取了一个他认为比较好用的库,叫ClipperLib的库直接内嵌到软件之中。ClipperLib所使用的2D图形算法也很著名,叫Vatti's Clipping Algorithm,很复杂,我也没有完全搞懂,有兴趣的读者要是搞懂了可以多多交流。


        ClipperLib的网址是:http://www.angusj.com/delphi/clipper.php
        这里我先简单介绍一下CuraEngine所用到的几种2D图形的运算,都是由ClipperLib实现的:交、并、减、偏移。它们与集合操作类似,先看图:


2.png

图形相交

       二元图形操作,最终结果为两个图形共同包含的区域。记作:A * B

图形相并

       二元图形操作,最终结果为两个图形其中之一或两者所包含的区域。记作:A + B

图形相减

       二元图形操作,最终结果为属于前者但不属于后者的区域。记作:A - B

图形偏移(外扩)

       一元图形操作,最终结果为图形区域的边界向外扩展指定的距离。

图形偏移(内缩)

       一元图形操作,最终结果为图形区域的边界向内收缩指定的距离。内缩与外扩互为逆运算。
       这些就是CuraEngine所用到的2D图形操作。运算不多,却可以做许许多多的事情。比如上面所说的上下表面计算,就可以用数学公式来表示:
表面(i) = [填充(i) - 层(i + n)] + [填充(i) - 层(i - n)]
填充(i) = 填充(i) - 表面(i)

       其中,i为当前层号,n为上下表面层数(可以不一样)。多简单,数学就是这么任性!
       同样的,组件里面内外墙,填充怎么划分,只用一个内缩运算就可以搞定:
外墙 = 组件.offset(-线宽)
内墙1 = 组件.offset(-线宽 * 2)
...
内墙n = 组件.offset(-线宽 * (n + 1))
填充 = 组件.offset(-线宽 * (n + 2))

       如果模型无需支撑,那组件划分到这里就可以收工了。否则,接下就是计算支撑的时间。
       我用CuraEngine半年下来觉得它最大的不足就是在支撑上,这也是我在Pango投入最大精力要改进的地方,这里就先简单介绍一下CuraEngine所用的支撑算法。
       CuraEngine首先把整个打印空间在XY平台上划分成为200um*200um的网格。每个网格的中心点再延Z轴向上作一条直线,这条直线可能会与组成3D模型的三角形相交。三角形与直线的交点以及这个三角形的倾斜度会被记录到网格里面。

3.png
       现在每个网格里记录下了一串被称为支撑点的列表,每个支撑点包含一个高度和一个倾斜度信息。接下来会对每个网格的支撑点列表按照高度从低到高排序。根据这些信息就可以判断模型上任意一个点是否需要支撑了,怎么判断,我们看图说话:
       让我们从底面开始延着一根网格中心线往上走。起始我们是在模型外部的,当遇到第一个支撑点的时候,就从模型外部进入到了模型内部。我们称这个支撑点为进点。
       继续向上,遇到了第二个支撑点,又从模型内部又退到了模型外部。我们称这个支撑点为出点。
       接着向上,我们可以发现,进点与出点总是交替出现的。
       利用这个规律,对于模型上任何一个点,我们只要找到这个点所对应的网格,再找到这个网格里在这个点以上最近的一个支撑点,我们就可以得到两个信息:这个点之上是否有模型悬空;这个点上面的悬空点的面的倾斜度是多少。
       Cura界面的专家设置里面有支撑角度的设置,如果一个点处于模型悬空部分以下,并且悬空点倾斜度大于支撑角度,那这个点就是需要支撑的。所一个平台上所有的需要支撑的点连接起来围成的2D图形就是支撑区域。

4.png
       CuraEngine所使用的支撑算法比较粗糙,但胜在速度很快。先不说网格化后失去了精度,通过倾斜角度来判断,模型下方一旦倾斜角发生了突变,像左图这种从负45度一下突变成正45度,倾斜角判断无能为力,除非把它改大到60度,这样的话,整个模型都会被过度支撑。这样矫枉过正,既不科学,也浪费材料和打印时间,还会对模型表面质量带来不好的影响。

       科学的支撑算法应该是找到模型局部最低点进行支撑,最低点以上不一定需要支撑。因为FDM材料本身的粘性,使得材料的走线可以有一部分悬空而不坍塌,这个效果被称为Overhang,只要上层材料的悬空距离小于一定的值,它就不需要支撑,这个距离以我的经验应该在1/4到1/2线宽之间。我在Pango中就基于这个思路重新实现了支撑的算法,结果虽然速度不如Cura的支撑算法那么快,但效果非常好,该撑的地方撑,不该撑的地方也不会多此一举。

5.png
        Pango的支撑算法我会在以后专文介绍。顺带一说,CuraEngine在下半年做了很大的改动,其中之一就是抛弃了之前的支撑算法,而新的算法也和我上面所讲的思想异曲同工。我要声明的是Pango的支撑算法和CuraEngine谁也没有抄谁,我的算法是自己拍脑袋想出来的。算是英雄所见略同吧。
        支撑范围确定之后,也和组件一样,可以有外墙、内墙、填充、上下表面。依样画葫芦即可。CuraEngine对于支撑,只会生成外墙和填充,Pango则会生成更多。
        组件和支撑就是CuraEngine在这一步所生成的结果,这一步可以说是整个切片过程的核心。
                                
声明:3D打印资源库(3dzyk)内网友所发表的所有内容及言论仅代表其本人,并不代表3D打印资源库(3dzyk)观点和立场;如对文章有异议或投诉,请联系kefu@3dzyk.cn。
标签:
切片软件Cura及CuraEngine原理分析3-划分组件 
快速回复 返回顶部 返回列表