STL (檔案格式)

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

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

## 文字(ASCII)STL
文字STL檔以下列來開始

 solid *name*

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

 facet normal *n<sub>i</sub> n<sub>j</sub> n<sub>k</sub>*
     outer loop
         vertex *v*1*x* *v*1*y* *v*1*z*
         vertex *v*2*x* *v*2*y* *v*2*z*
         vertex *v*3*x* *v*3*y* *v*3*z*
     endloop
 endfacet

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

 endsolid *name*

來結束。格式結構暗示其他可能的存在（如，不只一個loop定義同一個小面()，或一個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表面的微測繪學軟體。

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

## 參考資料

## 外部連結
* The StL Format: Fabbers的標準資料格式。
* File Extension STL: 支援STL的軟體列表。

分類:3D列印
分類:CAD文件格式
分類:3D檔案格式
分類:圖形文件格式