STL_(檔案格式)

**STL**（STereoLithography，譯作：**立體光刻**）是由 3D Systems 軟體公司創立，原本用於立體光刻電腦輔助設計軟體的檔案格式。它有一些逆向首字母縮略詞如「標準三角語言」（Standard Triangle Language）、「標準曲面細分語言」（Standard Tessellation Language）、「立體光刻語言」（STereolithography Language）和「立體光刻曲面細分語言」。許多套裝軟體支援這種格式，它被廣泛用於快速成型、3D 列印和電腦輔助製造。STL 檔案僅描述三維物體的表面幾何形狀，沒有顏色、材質貼圖或其它常見三維模型的屬性。STL 格式有文字和二進碼兩種型式。二進碼型式因較簡潔而較常見。

STL 檔描述原始非結構化三角網格由表面單位法線和由右手定則排序的頂點用三維三角形笛卡兒座標系。STL 座標必須是正數，沒有尺度資訊，且計量單位為任意的。

## 文字 (ASCII) STL

文字 STL 檔以下列來開始

```
solid _name_
```

_name_ 是個可有可無的字串。不過，即使省略了 _name_，solid 後的空白必須存在。這列之後跟著任意數量的以下列方式表示的三角形：

```
facet normal _ni nj nk_
    outer loop
        vertex _v_1x _v_1y _v_1z
        vertex _v_2x _v_2y _v_2z
        vertex _v_3x _v_3y _v_3z
    endloop
endfacet
```

當中，每個 _n_ 或 _v_ 都是正負 -假數-"e"- 正負 - 冪數型式的浮點數，如 "2.648000e-002"（注意：每個 _v_ 都必須不是負數）。檔案以

```
endsolid _name_
```

來結束。格式結構暗示其他可能的存在（如，不只一個 loop 定義同一個小面 (facet)，或一個 loop 具有三個以上頂點）。然而在實踐中，所有小面都是簡單三角形。

除了數字或單詞內以外，檔案中任何地方都可使用空白字元 (空格、tab、換列)。"facet" 和 "normal" 以及 "outer" 和 "loop" 之間的空白是必要的。

## 二進碼 STL

由於文字 STL 檔會非常大，因此有二進碼版的 STL。二進碼 STL 檔有個 80 字元的檔頭（內容通常都被忽略但絕不可用 "solid" 來開始！這樣會使不少軟體認為這是文字 STL 檔）。接著是一個 4 位元組無號整數，它表示這檔案中的三角形數。再來是描述每個三角形的資訊。之後就結束。

每個三角形以 12 個 32 位元浮點數來描述：3 個描述法線，接著三頂點的 X/Y/Z 座標─正如文字 STL 一樣。之後是一個 2 位元組無號整數 (unsigned short)，它代表「屬性字元數」─在標準格式中它該是 0，因為多數軟體不明白其它事項。

雖然檔案內沒有說明，浮點數以 little-endian 的 IEEE 754 表示。

```
UINT8[80] – Header
UINT32 – Number of triangles
  

foreach triangle
REAL32[3] – Normal vector
REAL32[3] – Vertex 1
REAL32[3] – Vertex 2
REAL32[3] – Vertex 3
UINT16 – Attribute byte count
end
```

## 二進碼 STL 的顏色

二進碼 STL 至少有兩種非標準方式來加上顏色資訊：

* VisCAM 和 SolidView 軟體用每個三角形後的 2 個「屬性字元數」存放 15 位元 RGB 色碼：
  * 位元 0 到 4 是藍的強度 (0~31)。
  * 位元 5 到 9 是綠的強度 (0~31)。
  * 位元 10 到 14 是紅的強度 (0~31)。
  * 位元 15 是 1 表顏色有效；0 表無效（同正常的 STL 檔）。
* Materialise Magics 軟體用開頭的 80 位元檔頭表示模型整體顏色。若有使用顏色，檔頭某處會是文字字串 "COLOR=" 接著 4 位元組的 RGBA (透明度)，值域為 0–255。這是整個模型的顏色，每個小面可以另外指定。這軟體還可以指定更詳細的表面特性，即物質 (電腦圖形)。在 "COLOR=RGBA" 後可加上 ASCII 字串 ",MATERIAL="，接著 3 顏色 (3×4 位元)：

先是漫反射的顏色，第二個是反射高光顏色，第三是環境光。物質設定優於顏色。每個小面的顏色是用三角形後的 2 個「屬性字元數」以下列方式來存放：

* * 位元 0 到 4 是紅的強度 (0~31)。
  * 位元 5 到 9 是綠的強度 (0~31)。
  * 位元 10 到 14 是藍的強度 (0~31)。
  * 位元 15 是 0 表用小面顏色；1 表用模型顏色。

上述兩種小面顏色資訊中，2 位元裡的紅 / 綠 / 藍順序相反，因此，雖然這些格式容易相容，反序表示並非如此！更糟的是：通用的 STL 讀取器不能自動分別它們！也無法指定小面有透明度！因為沒有 α 值！雖然對目前的快速原型機而言，這不重要。

## 小面法線

文字 (ASCII) 和二進碼版的 STL，**小面法線**必項是指向模型外部的單位向量。若設為 (0,0,0)，多數軟體會自動以三角形三頂點的順序根據**右手定則**計演算法線。一些 STL 讀取器（如：Art of Illusion 的 STL 外掛) 會檢查小面的法線與它們用右手定則算出來的相符。若不同，會警告使用者。有的軟體會完算用自己根據右手定則算的。雖然可以不使用右手定則來計演算法線的情況罕見，為了完全相容，檔案都應提供小面法線及正確指定頂點順序。一個出名的例外是 SolidWorks，它用法線當濃淡處理。

## 歷史

立體光刻機是能用一系列切片來構建任何體積形狀的 3D 列印機。這些機器需要一系列用凝固材料填充在封閉的 2D 輪廓中，最後再與各層熔合在一起。對這樣的機器而言，自然的檔案格式是一系列對應不同 Z 值的封閉的多邊形。然而，因為改變層的厚度可能會得到更快（雖然不太精確）的構建，若能以**可在必要水平切片**的**封閉多面體**來定義模型，會更好。

STL 檔案格式看似能用多邊形來定義多面體，但在實用上它只被用過三角形。這表示 ASCII 協定的語法是多餘的。

要能正確組成 3D 體，STL 檔表示的表面必須是封閉同相連的，且每個邊都正好是二個三角形的一部份，且沒有交叉。
由於 STL 語法對此屬性不嚴緊，應用程式能忽視其封閉性。

作為切片的該軟體的封閉性僅事項只要三角形需要它以確保所得到的二維的多邊形是封閉的。對**切片三角形後須確保所得到的 2D 多邊形是封關閉**的軟體而言，封閉性才會重要。這類軟體有時會移動接近的頂點到同一位置，來清理小的差異。結果是不可預測的，但它往往足夠。

## 其它使用領域

STL 檔案格式簡單且容易輸出。因此，許多電腦輔助設計 (CAD) 系統能輸出 STL 檔案格式。雖然輸出簡單產生，一些聯結性資訊卻被丟棄！例如：A 和 B 在 CAD 系統是相異、但座標恰好相同的兩點。STL 只輸出點的座標，因此點 A 和 B 在 STL 就有同的表示。還存在其他的問題。

許多電腦輔助製造 (CAM) 系統必須是三角形化的模型。STL 檔案格式不是記憶體和計算上最有效轉換資料的方法，但 STL 常被 CAM 系統用於輸入三角化的幾何。這格式隨手可得，所以 CAM 系統用它。為了使用資料，CAM 系統可能要重建連接性。重建會導致誤差。

STL 也能在 CAD、CAM 和計算環境（如：Mathematica）間交換資料。

## 支援 STL 的軟體

* Clara.io, 線上免費 STL 檔案輸入、編輯、輸出的 3D 編輯器。
* CloudCompare, 處理 STL 檔的開源應用軟體。
* Maple (software) 和 Mathematica, 支援 STL 檔的技術計算系統。
* MeshLab, 視覺化、處理、且轉換 3D 網模進 / 出 STL 的免費、開源且跨平台的應用軟體。
* FreeCAD, 能輸入、輸出 STL 檔的 CAD 開源軟體。
* OpenSCADE, 構造實體幾何建模且支援專門領域用語言，能產生及輸入 STL 檔。
* MountainsMap, 能以 STL 輸出輪廓及細微 3D 表面的微測繪學軟體。

## 參見

* Additive Manufacturing 檔案格式 (AMF), 一個自然支援顏色、多種物質和星座的較新標準。
* PLY, 一個比多數立體光刻規格提供更彈性的格式。
* Wavefront .obj 檔案，一個副檔名為_.obj_ 的 3D 幾何定義檔案格式。
* X3D, 免專利費的三維電腦圖形 ISO 標準。

## 參考資料

## 外部連結

* The StL Format（頁面存檔備份，存於網際網路檔案館）: Fabbers 的標準資料格式。
* File Extension STL（頁面存檔備份，存於網際網路檔案館）: 支援 STL 的軟體列表。