3D打印自动支撑算法

一、背景

3D打印技术出现在20世纪90年代中期,其原理是使用三维扫描采集物件的三维数据,或直接使用计算机设计三维模型,利用软件算法将物件模型分成若干层,打印机内装有液体或粉末等打印材料,与电脑连接后,通过电脑控制把“打印材料”按照层的形状一层层叠加起来,当每层材料固化后便打印下一层,从而形成成实物。

3D打印技术多大数十种,其中较常见的有FDM熔融沉积成型3D打印技术、SLA光固化快速成型3D打印技术、DLP数码影像投射3D打印技术。FDM是将材料融化,通过喷嘴挤出,逐层堆叠,创建卓越的热稳定性和耐化学性,并有良好的强度重量比FDM适用于很多行业。SLA 出现较早,SLA是通过紫外光照射光敏树脂固化成型S通过一个激光发射器将光束射到反射镜上,通过计算机控制反射镜的角度,从而使光速发射到适当的点,定点诱导光敏树脂原料的聚合。当一个点固化后,计算机控制激光束投向下一个点。DLPSLA 类似,但是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. 识别支撑面的流程

  1. 取一个未标记的种子三角形
  2. 标记该三角形,检测该三角形是否满足支撑面判断条件,满足就添加到支撑面
  3. 获取相邻三角形,并重复2
  4. 若某一三角形不满足则检查支撑面的三角形面积和是否大于阈值
  5. 若大于阈值则将支撑面输出并继续执行1
  6. 重复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

[3]安涛 戴宁 廖文和 袁天然 基于红黑树的STL数据快速拓扑重建算法 2008

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值