基于VS2008的3D打印切片算法研究
2013-12-05柴微等
柴微等
【摘 要】针对3D打印机工作时所需的STL文件,设计了一种无需三角形面片法向量信息的切片算法,采用垂直轴与切平面的空间平面信息进行切片运算,并对切片过程中产生的错误数据进行了分析,在VS2008环境中实现了对STL文件的切片。研究结果表明,此种切片算法,经过对错误信息的处理可以得到片层的完整闭合轮廓信息,切片效率高。
【关键词】3D打印;STL;切片算法;VS2008
0.引言
3D打印是将Solidworks或CAD等其它三维设计软件设计的三维模型直接打印成真实物体。3D打印源于快速成型理念,它将所要打印的物体从底层开始,按照一定的层厚,一层一层堆叠起来,最终形成完整的物体。首先,由三维设计软件设计物体结构,然后将所设计的物体存储为STL格式,其次,计算机读入STL文件,将得到的文件数据运用一定的切片算法进行切片运算,得到每一层的完整轮廓,再次,根据得到的轮廓信息,对轮廓进行填充与路径规划,最后,将得到的路径信息转化为实际的电机控制量,通过电机驱动执行机构实现3D打印。从3D打印的过程中可以看出,对STL文件进行切片是实现3D打印功能的关键,完整正确的切片轮廓是后续计算的前提,它的精度直接决定了打印真实物体的精度。针对STL文件的切片技术国内外有很多算法[1-5]。每种算法都有自己的优缺点,本文采用的算法所需的数据量小,效率高,针对不同的物体能得到任何高度的完整轮廓信息。
1.STL文件概述
应用于3D打印的文件有多种文件格式,由于STL文件结构简单,多数三维设计软件都可以将设计的三维实物直接存储成STL文件,使得STL格式文件被广泛应用。
STL文件有两种格式:二进制格式与ASCII码格式。无论是哪种格式,存储的信息都是三角形的三个顶点与法向量。无数个这样的三角形面片构成了一个完整的STL文件。即三维实体。
二进制格式的STL文件格式如下:
零件名 三角形个数 三角形面片信息
其中零件名占80字节,三角形个数占4字节,每个三角形面片信息占50字节。三角形面片信息包含12字节的法向量、36字节的坐标、2字节的属性项。
ASCII码格式的STL文件格式如下:
solid 文件名
facet normal nx,ny,nz
outer loop
vertex V1x,V1y,V1z
vertex V2x,V2y,V2z
vertex V3x,V3y,V3z
endloop
endfacet
..............................
endsolid
ASCII码格式的文件第一行是文件名,第二行是三角形法向量,第四行到第六行是三角形的三个顶点。二进制格式的STL文件所占用的内存小,ASCII码格式的STL文件可读性强。本文是对ASCII码格式的STL文件操作。
2.基于VS2008切片算法实现
2.1切片算法基本思想
本文设计的算法无需三角形面片法向量计算,只需根据设定的层厚,逐层计算与切平面的交点,求得两个交点坐标,将切平面与所有三角形面片计算得到的交点存储到数组中,将得到的交点坐标按照一定的顺序重新存储,形成有序的实数对以供后续处理。
2.2切片算法实现步骤
以VS2008为开发环境,实现步骤如下:
STEP1:解析STL文件,获取各个三角形顶点坐标信息。
STEP2:指定层厚为LYAYETHICK,第一层高度为k*LYAYETHICK.k=1.遍历所有三角形,将与平面z=k*LYAYETHICK相交的三角形存储在一个数组中。
STEP3:找到第一个与平面z相交的三角形,求出交点坐标,并标记此三角形flag=1,表示此三角形已经被处理过,本层不在处理。
STEP4:相邻两个三角形只能共有一条边和两个顶点,利用三角形邻边关系找到与此三角形相邻的三角形,并求与平面z的交点坐标,并标记此三角形flag=1。
求交点公式:
x=(x-x)+x (1)
y=(y-y)+y (2)
ZP=z (3)
其中:三角形一个顶点为(x,y,z),另一个顶点为(x,y,z)。
STEP5:以此类推直到遍历完本层所有三角形。
STEP6:若回到第一个三角形后,本层还有剩余的三角形没有被标记1,说明本层不止一个轮廓,还有其他轮廓,需要找到另一个轮廓的第一个三角形,然后重复STEP3到STEP5。
STEP7:k=k+1,求新的平面z,重复STEP3到STEP6,直到z大于STL文件中零件的高度。
STEP8:处理各层得到的交点,消除间距过小、间距过大及非法数据等,得到完整的切片轮廓。
3.切片轮廓错误数据分析
完整正确的轮廓数据是后续进行路径规划及运动控制的关键因素。然而在三维绘图或将三维绘图软件所绘制的物体存储成STL文件过程中会产生错误的三角形邻接关系。最终导致计算出的轮廓不闭合、偏差大等现象。常见的错误如下:
(1)一个三角形的一条边被另外两个三角形所共有。
(2)切平面z经过三角形的一个顶点或一条边。
(3)几个三角形面片围成的区域形成一个缺陷区域。
以上几点都将导致找不到下一个邻接的三角形,从而产生错误随机数据,需要将切平面z适当的放大或缩小。
(4)在切片计算过程中会产生INF0和IND0的数据点。在VS2008中用_finite()与_isnan()函数来消除非法的INF0与IND0数据
(5)对于曲率变换较大的零件,经常会出现曲率过度时导致轮廓丢点不闭合,需要人为附加点,使轮廓形成完整的闭合轮廓,以便后续进行轮廓填充。
4.数据分析
跟据本文所设计的算法,在VS2008中进行试验分析。对一个直径为50mm壁厚2mm的空心球体进行切片分层,层厚为0.3mm,共有166层,三角形个数为19842个,切片耗时2s。切片效率很高。从仿真过程中可以看到,经过一系列错误数据处理后能得到完整的轮廓。
5.结论
本文设计的切片算法切片速度快,能够处理多种原因产生的错误数据,处理错误数据能力强,经过轮廓闭合处理后,消除大量冗余数据,补偿丢失数据,能得到完成的片层轮廓。
【参考文献】
[1]黄新华,孙琨,方亮等.STL模型的分层轮廓数据优化算法[J].机械科学与技术,2004,23(5):605~607.
[2]胡德洲,李占利,李涤尘等.基于STL模型几何特征分类的快熟分层处理算法研究[J].西安交通大学学报,2000,34(1):37~41.
[3]牟小云,郑建明,田静云.基于坐标分层的STL模型切片算法的研究[J].机床与液压,2008(36):52~54.
[4]赵吉宾,刘伟军.快速成型技术中基于STL模型的分层算法研究[J].应用基础与工程科学学报,2008(16):224~233.
[5]赵吉宾,刘伟军,王超越.STL文件的错误检测与修复算法研究[J].计算机应用,2003,23(2):32~34.