一、背景
3D打印技术出现在20世纪90年代中期,其原理是使用三维扫描采集物件的三维数据,或直接使用计算机设计三维模型,利用软件算法将物件模型分成若干层,打印机内装有液体或粉末等打印材料,与电脑连接后,通过电脑控制把“打印材料”按照层的形状一层层叠加起来,当每层材料固化后便打印下一层,从而形成成实物。
3D打印技术多大数十种,其中较常见的有FDM熔融沉积成型3D打印技术、SLA光固化快速成型3D打印技术、DLP数码影像投射3D打印技术。FDM是将材料融化,通过喷嘴挤出,逐层堆叠,创建卓越的热稳定性和耐化学性,并有良好的强度重量比。FDM适用于很多行业。SLA 出现较早,SLA是通过紫外光照射光敏树脂固化成型。S通过一个激光发射器将光束射到反射镜上,通过计算机控制反射镜的角度,从而使光速发射到适当的点,定点诱导光敏树脂原料的聚合。当一个点固化后,计算机控制激光束投向下一个点。DLP与SLA 类似,但是DLP不像SLA产生单独光斑。DLP通过图像投影技术将一层影响通射到树脂上,经过一段时间照射使光敏树脂原料固化,其打印速度比SLA 快,打印精度也有所提高。
本文属于3D打印技术领域,涉及一种自动添加支撑的算法。目的是提供一种检测三维模型支撑点的算法,解决了3D打印中某些特殊结构因重力影响导致打印失败的问题。
光固化快速成型3D打印示意图
二、3D打印支撑
我们都知道3D打印技术的原理是,将材料一层一层的堆积,直至模型最终成型。下一层材料堆叠在上一层材料上,对于不规则的物体,下一层与上一层不一样,并不是完美堆叠,可能有平移,那么这里就要考虑到一个重力的问题。由于材料受重力影响,有可能发生坠落,从而导致打印失败。
3D打印支撑是指为了保持3D打印物品的物理平衡而产生的支架材料。文献[1]提出一种斜壁结构自动支撑算法。
三维模型有若干三角形片面组成,文献[2]中提到有以下四种情况要添加支撑:
(1)被支撑面与Z轴垂直
(2)被支撑面与Z轴形成一定夹角θ
(3)悬吊边、悬吊点
(4)悬吊线
本文只考虑被支撑面与Z轴形成一定夹角θ及悬吊点两种情况便可满足大部分情况。
1. 45度倾斜
根据重力原理,如果一个物体的某个面与垂直线的角度大于45度且悬空,就有可能发生坠落,导致打印失败。一般的经验法则是:如果悬垂物与垂直方向倾斜的角度小于45度,那么可以不使用支撑结构;与垂直方向成45度以上角度的悬垂需要3D打印支撑结构。如下图:第一个形状不用添加支撑结构,第二第三个形状需要添加支撑结构。
r
物体表面倾斜
2. 悬吊点
对于悬空的结构,由于下方没有可以支撑它的结构,材料就会在重力的影响下下坠,轻则影响最终打印物的精准度,重则变成乱糟糟的一团完全打印失败。同样,在打印内含中空结构的物体时也会出现类似问题,导致打印失败。
悬吊点
。
三、算法原理
算法的原理分为两部分,第一部分查找满足条件的悬吊点,第二部分查找满足条件的支撑面,对于部分查找满足条件的面使用经典的种子填充算法。
通过hash表建立拓扑结构,先遍历所有三角形片面,找到悬吊点,再使用种子填充算法的变种算法,查找相邻三角形,并判断是否需要添加支撑,将需要添加支撑的三角形组成集合,并从集合中找到孤立点,对于孤立点必添加支撑,对于支撑点以外的区域,使用网格法均匀增加支撑点。
1. 三维模型文件格式简介
常见的三维文件格式有abc、glTF、fbx、obj、dea、sts、3ds等,stl作为一种简单的格式,使用非常方便,本文采样这种格式进行测试。stl只能用来表示封闭的面或者体。stl文件有两种:一种是ASCII明码格式,另一种是二进制格式。
二进制STL文件用固定的字节数来给出三角面片的几何信息。
文件起始的80个字节是文件头,用于存贮文件名;
紧接着用 4 个字节的整数来描述模型的三角面片个数,
后面逐个给出每个三角面片的几何信息。每个三角面片占用固定的50个字节,依次是:
3个4字节浮点数(角面片的法矢量)
3个4字节浮点数(1个顶点的坐标)
3个4字节浮点数(2个顶点的坐标)
3个4字节浮点数(3个顶点的坐标)个
三角面片的最后2个字节用来描述三角面片的属性信息。
一个完整二进制STL文件的大小为三角形面片数乘以 50再加上84个字节。
2. 基于哈希表的三维模型拓扑结构
一个三维模型包含大量三角形数和其发向量。对于一个由三角形片构成的多面体,其每个三角形有三个顶点,每个顶点同时属于若干个三角形,因此相邻的三角形存在拓扑关系。在计算过程中,需要非常平凡地访问三角形的顶点即法向量,这个过程非常耗时,因此建立三角形之间的拓扑结构,可大幅提高算法的速度。
文献[3]提出一种基于红黑树的STL拓扑重建算法,红黑树时间复杂度是O(log n),本文选择hash表作为数据结构,理想情况下时间复杂度是O(1),平均速度比红黑树更快。
对于点p(x,y,z),以p为key,以p相邻的三角形的索引的集合为值,建立拓扑结构。哈希函数为:H(key)= p.x *1000 + p.y*1000 + p.z*1000;对于三角形t1、t2,其顶点为为p1,p2, p3, p4,以点为hash的键,以点相邻的三角形为hash值,构建如下数据结构:
三维模型拓扑结构与hash表
3. 支撑面的识别
a. 种子填充
本文使用种子填充算法识别大片彼此相邻的三角形,即支撑面。
种子填充算法,也叫泛洪算法——Flood Fill,是一种从连通区域内的一个种子点开始,逐渐向其四周扩展,填充整个区域的算法,多用于图像处理中,用于填充具有不同颜色的连接的,颜色相似的区域,直到图形的边界。
种子填充算法有几个重要的要素如下:
1.领域选择策略。即确定周围相邻的三角形。
2.包含策略。即判断一个三角形是否能纳入当前连通区域,以及什么样的三角形不能加入。
3.生长方式。深度优先还是广度优先。
b. 领域选择策略
相邻的三角形即为领域,即两个三角形共边,则这另个三角形相邻。判断条件:三角形t1和t2有公共顶点,则t1和t2相邻。
c. 包含策略
满足添加支撑的添加即可包含,判断条件:三角形t的法向量n,Z轴负方向p,p与n的夹角θ,有 θ > 45° 且 θ < 135°
三角形法向量与Z轴角
d. 生长方式
采用广度优先策略搜索,即从某个三角形出发,首先判断改三角形是否被包含,若被包含则依据拓扑结构,依次获取相邻的三角形的集合,并判断该集合内的每三角形是否被包含,以次规则直至所有的相邻的三角形都被访问。
e. 识别支撑面的流程
- 取一个未标记的种子三角形
- 标记该三角形,检测该三角形是否满足支撑面判断条件,满足就添加到支撑面
- 获取相邻三角形,并重复2
- 若某一三角形不满足则检查支撑面的三角形面积和是否大于阈值
- 若大于阈值则将支撑面输出并继续执行1
- 重复1-5,直到已经检测所有三角形为止
识别支撑面流程图
4. 悬吊点的识别
由于模型表面通常都不是平整的面,会产生悬吊点结构。该点的Z坐标低于周围点的Z坐标。判断某一顶点为悬吊点,可通过模型拓扑结构,获取改顶点所有相邻点,通过比较Z坐标来确定。一般会设置一个阈值高度,当悬吊点与周围相邻点Z坐标差的平均值大于该阈值高度则识别为悬吊点。
如图,点1的Z坐标低于点2、点3、点4、点5、点6、点7,此时点1为悬吊点。
悬吊点
5. 支撑点的确定
支撑点为最终输出的可添加支撑的点,支撑点应满足以下条件:
(1)包含所有的悬吊点
(2)覆盖所有的支撑面
(3)支撑点之间保持适当间隔,防止支撑粘连
(4)支撑点应均匀分布,防止模型受力失衡倒塌
6. 支撑生成步骤
1、检测模型的悬吊点并作为支撑点
2、检测模型的支撑区域
5、对每个支撑区域xy平面投影
6、用网格覆盖平面投影
7、判断网格中是否有悬吊点,若没有则标记网格
8、遍历所有网格,对没有标记的网格取中心
9、计算步骤8中网格中心与模型下表面的交点,作为支撑点
10、生成支撑结构
如下图,支撑区域为不规则形状,使用网格覆盖支撑区域,点1为悬吊点,因此悬吊点的位置即为支撑点,其他网格以网格中心与模型下表面相交的点2、 3、 4 为支撑点。
支撑区域投影
四、计算实例
实验环境 | |
处理器 |
Intel Core i7-9750 2.60GHz |
内存 |
8.00GB |
操作系统 |
64位 Windows 10 |
实验结果 | |||
模型 |
三角形数量 |
支撑点数量 |
耗时(毫秒) |
模型1 |
204 |
26 |
37 |
模型2 |
185636 |
74 |
158 |
模型3 |
222838 |
27 |
238 |
网格间隔:5毫米
模型1
模型2
模型3
参考文献
[1]黄小毛 叶春生 郭开波 莫键华 基于STL的斜壁结构支撑及自动生成算法 2009
[2]王燕宁 3D打印支撑结构自动生成算法及实现 2018文章来源:https://www.toymoban.com/news/detail-428977.html
[3]安涛 戴宁 廖文和 袁天然 基于红黑树的STL数据快速拓扑重建算法 2008文章来源地址https://www.toymoban.com/news/detail-428977.html
到了这里,关于3D打印自动支撑算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!