3D打印自动支撑算法
一、背景
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. 識別支撐面的流程
識別支撐面流程圖
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
總結
以上是生活随笔為你收集整理的3D打印自动支撑算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 固态硬盘测试软件有哪些,手把手教你测试固
- 下一篇: 学习笔记(23):Python网络编程并