基于CuraEngine 的3D 打印模型切片算法研究*
2023-12-13邵乙迪张士亨李博文
邵乙迪,张士亨,李博文
(季华实验室新型增材制造研究院,广东 佛山 528000)
3D 打印技术是以三维模型数据为基础,通过层层堆积成型的一种新型制造技术。3D 打印技术通过对CAD 软件设计生产的三维模型进行切片处理,将三维模型“降维” 到二维轮廓,再通过相应算法对轮廓进行路径规划和填充,形成了打印设备能够识别的加工数据文件,接下来设备只要根据数据文件中的位置和工艺参数等信息便可以逐层进行打印,直到零件加工完成。与传统减材制造技术相比,3D 打印能够通过三维模型数据直接进行生产制造,无须像传统加工制造那样将模型通过人工转化加工图纸,节省了零件成型所需的模具加工成本,简化了零件的加工过程,也突破了传统加工制造方式对设计的约束,能够成型拓扑结构复杂的构件,是未来智能制造必不可少的技术之一[1]。3D 打印原理如图1 所示。
图1 3D 打印原理
3D 打印技术的核心之一就是对三维模型的加工处理技术,它决定了3D 打印的成型效率和零件的力学性能。这些技术一般作为算法的形式集成到设备或者软件中,从而实现完全自动化处理。随着3D 打印技术的迅速发展,3D 打印也越来越普及,所需成型的零件也越来越复杂,对算法的处理速度和准确性要求也随之升高。其中对三维模型数据的切片处理直接关系到最终产品的成型质量和加工效率,因此很多的学者和企业对三维模型数据的切片算法有诸多研究[2]。本文以在3D 打印行业广泛应用的开源软件CuraEngine 为基础,通过剖析CuraEngine 中的切片算法实现,为3D打印切片算法的改进和优化提供参考和借鉴。
1 基于STL 模型的分层切片算法
STL 文件格式是目前使用最广泛的三维模型文件格式之一,在3D 打印行业应用广泛,所以大部分切片算法也都是基于STL 文件开发。STL 文件主要描述了由三角面片构成的三维模型信息,STL 文件中记录了每个三角面片的法向量和顶点数据,为三维模型的读取和渲染提供了最基本的信息。STL 文件有2 种格式,一种为ASCⅠⅠ编码格式,另一种为二进制格式。ASCⅠⅠ编码格式的STL 文件可以直接通过文本进行阅读,但是ASCⅠⅠ编码格式会导致文件占用空间较大,所以在处理大型模型时,最好选择二进制格式的STL 文件进行保存,以尽可能节省储存空间且便于文件传输。
基于STL 模型进行分层切片的主要原理是通过选取合适的切片厚度,基于该厚度计算出各层高度,最后求得模型与各层高度相交的二维轮廓信息。这种分层操作会带来“阶梯效应”,即在一定角度的三维模型表面产生阶梯状的台阶,随着层厚减小,“阶梯效应” 会随之减弱。因此,切片时层厚的选取与打印模型的精度密切相关,层厚越小,打印成型的零件越精细,但是打印过程的工作量和打印时长会增加。为了减少“阶梯效应”,目前的切片算法可以分为2 种,一种是自适应层厚的切片算法,另一种是等层厚的切片算法。
国外有技术人员研究了自适应层高的切片算法对模型处理的影响[3];国内部分学者在等层厚的切片算法基础之上,提出了基于面片之间拓扑信息的分层切片算法[4]、基于不同模型本身几何特征的切片算法[5]和基于模型集合连续性的切片算法[6]。
Cura 是最早的3D 打印开源切片软件之一,经过多年的更新与维护,目前Cura 已经成为了3D 打印行业中应用最广泛的切片软件之一,而CuraEngine 作为目前Cura 最新的开源切片引擎,也是经过了多年的发展和用户的验证。CuraEngine 主要采取了等层厚的切片算法,并通过对STL 模型进行优化处理,有效提高了切片算法的效率,接下来通过对CuraEngine 的切片算法进行分析,来探究3D 打印对三维模型的处理和分层方法。
2 STL 模型的读取和前处理
STL 文件格式简单,不像其他复杂的CAD 格式那样需要多种复杂的几何表示方法对模型进行描述,其通过保存三角面片的信息基本可以保证在加工精度范围内准确地描述任何三维模型,但是STL 文件的缺点也很明显。由于STL 文件中直接记录了每个三角面片的法向量和顶点数据信息,因此造成了较多的数据冗余,因为同一个顶点信息会被共用的三角面片重复记录。其次就是STL 文件未保存模型的拓扑信息,增加了切片的难度,也增加了修复模型拓扑错误的难度,所以在进行切片之前需要对STL 模型的数据进行处理,建立模型中各个点、线、面之间的拓扑关系,为切片做好准备。
如图2 所示,将CAD 模型保存为STL 格式后,三维模型全都转换成三角面片表示,直接读取STL 格式文件,可以得到1 个三角面片的数据集合Mesh,每个三角面片保存了3 个顶点的坐标数据(若需要对模型进行渲染,可以同时保存面片的法向量数据,也可以通过顶点数据进行计算)。此时Mesh 集合中未包含面片和顶点的拓扑关系,数据也有冗余。
首先可以通过哈希表对所有的顶点数据进行分组。通过特定的哈希函数可以将顶点进行分类,每一个哈希值将对应一个顶点集合。接着遍历顶点集合中的每个顶点,将每个遍历到的顶点和对应的顶点集合中的所有点进行比较,过滤掉重复的顶点,将剩下的不重复的顶点数据保存在数组PointList 之中。利用哈希表可以大大加快处理重复顶点的时间,有效提高算法效率。同样对三角面片进行遍历,将其保存在数组FaceList 中,期间对每个三角面片进行处理,添加相连的三角面片在FaceList 中的下标,并保存在集合Touching 中;为每个顶点添加所在面片在FaceList 中的下标,并保存在集合FaceⅠndex 中。
这样就对原始STL 数据进行了优化,得到了除去冗余数据的顶点数据列表(PointList)和包含拓扑关系的三角面片数据列表(FaceList)。其中每个顶点元素包含了所在三角面片的信息,每个三角面片元素也包含了相邻三角面片的信息,这样就有效减少了接下来切片工作的工作量,有效提高了切片的效率。
3 基于CuraEngine 的切片算法
通过对STL 模型数据的前处理,得到了拥有拓扑关系的顶点和三角面片数据,在切片过程中就可以利用这些数据形成每一层的轮廓多边形。切片过程主要可以分为2 个部分,第一个部分是求取三角面片在切片平面内的投影线段(Segment),第二部分是通过拓扑关系将这些投影线段进行连接,形成每一层的轮廓多边形。切片流程如图3 所示。
在第一部分中首先根据层厚和模型起始位置计算出各个层的高度值,再对FaceList 中的各个三角面片计算其在每层高度平面的投影线段,并将投影线段保存在当前层的集合中。在对FaceList 中的三角面片进行求交运算时,可以先通过三角面片的高度值范围对集合中的数据进行过滤,忽略不包含所求高度值的三角面片,以提高效率。
在计算三角面片的投影时,可以根据每个顶点在平面上方或者下方共枚举出6 种情况,最后通过投影公式计算出三角面片在高度平面上的投影线段。在计算投影公式时,要注意输入顶点的顺序,因为输入顶点的顺序直接决定了投影线段的起始点和终止点的方向,从而影响到后续轮廓多边线的方向,对于多连通区域来说,内外轮廓的方向至关重要。
得到投影线段之后,根据三角面片中保存的拓扑关系,找到每条投影线段所在三角面片的相邻三角面片的投影线段,最后将其首尾相连就得到了该层的轮廓多边形。对于复杂的或者有破损的STL 模型数据,有可能会得到未闭合的轮廓多边形,这时就需要对未闭合的轮廓多边形进行修复,通过距离检测和长度过滤能够修复大部分未闭合的轮廓多边形。但是对于通用层接口文件(Common Layer Ⅰnterface,CLⅠ),可以储存填充线段(Hatches)数据,这些数据可以表示支撑结构或者填充线段,对这些特殊的未闭合轮廓线段需要进行特殊处理。
最终将得到的层数据集合按照用户所需的格式进行输出,以供后续打印流程使用。
4 结论与展望
本文通过梳理CuraEngine 中的切片算法,对3D打印中的模型切片技术做了介绍。该算法的优点在于:①采用哈希表快速剔除了STL 文件中的冗余数据;②在对三角面片进行求交的过程中,剔除了与高度平面不相交的面片,避免了大量的无效判断;③可以直接通过三角面片的相邻关系快速找到首尾相连的轮廓线段。
但是CuraEngine 的切片算法仍有诸多可以改进之处。首先,该算法中间用来存储数据的临时变量较多,增加了算法的空间复杂度;其次,线性的计算流程对当下追求算法效率的行业发展来说略显吃力,可以引入一定的多线程并行技术,这样在处理大型复杂三维模型时会取得更好的效果;最后,在对轮廓线进行连接时仍较为复杂,可以通过对相连的面片进行一定排序,直接求出有向的边界轮廓。