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 v1x v1y v1z
vertex v2x v2y v2z
vertex v3x v3y v3z
endloop
endfacet
当中，每个n或v都是正负-Significand-"e"-正负-幂数型式的浮点数，如"2.648000e-002"（注意：每个v都必须不是负数）。档案以
endsolid name
来结束。格式结构暗示其他可能的存在（如，不只一个loop定义同一个小面(Face (geometry))，或一个loop具有三个以上顶点）。然而在实践中，所有小面都是简单三角形。
除了数字或单词内以外，档案中任何地方都可使用空白字元(空格、tab、换列)。"facet"和"normal"以及"outer"和"loop"之间的空白是必要的。

**二进码 STL**
由于文字STL档会非常大，因此有二进码版的STL。二进码STL档有个80字元的档头（内容通常都被忽略但绝不可用"solid"来开始！这样会使不少软体认为这是文字STL档）。接着是一个4字节Signedness，它表示这档案中的三角形数。再来是描述每个三角形的资讯。之后就结束。
每个三角形以12个32位元浮点数来描述：3个描述法线，接着三顶点的X/Y/Z座标─正如文字STL一样。之后是一个2字节无号整数(unsigned short)，它代表「属性字元数」─在标准格式中它该是0，因为多数软体不明白其它事项。
虽然文件内没有说明，浮点数以little-endian的IEEE 754表示。
UINT880 – Header
UINT32 – Number of triangles

foreach triangle
REAL323 – Normal vector
REAL323 – Vertex 1
REAL323 – Vertex 2
REAL323 – 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。这是整个模型的颜色，每个小面可以另外指定。这软体还可以指定更详细的表面特性，即Material (computer graphics)。在"COLOR=RGBA"后可加上ASCII字串",MATERIAL="，接着3颜色(3×4位元)：
先是漫反射的颜色，第二个是Specular highlight颜色，第三是环境光。物质设置优于颜色。每个小面的颜色是用三角形后的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输出profilometer及细微3D表面的微测绘学软体。

**参见**
 Additive Manufacturing File Format (AMF), 一个自然支援颜色、多种物质和星座的较新标准。- PLY, 一个比多数立体光刻规格提供更弹性的格式。- Wavefront .obj文件, 一个副档名为.obj的3D几何定义档案格式。- X3D, 免专利费的三维电脑图形ISO标准。

**参考资料**

**外部连结**
  The StL Formatdate=20200917211707 : Fabbers的标准资料格式。-  File Extension STLdate=20160703000715 : 支援STL的软体列表。
分类:文件格式
分类:3D列印
分类:CAD文件格式
分类:三维计算机图形学
分类:图形文件格式