Standard Triangulated Language

STLは三次元形状を表現するデータを保存するファイルフォーマットのひとつである。名称の由来は光造形法を意味する光造形法()である。 や  の略称とされることもある。

米国のによって開発された三次元CADソフト用のファイルフォーマットとして作られた。3次元形状を扱う多くのソフトにサポートされており、特にラピッドプロトタイピングシステムのファイルフォーマットとしても利用されている。

 特徴 
三次元形状を構成する小さな三角形要素の集合を記述する。元来は三角形のみで他の多角形や曲線を一切扱わないのが特徴。色やトポロジーデータ（形状同士のつながり）なども含まれない。データ構造が簡単であることからラピッドプロトタイピングの分野では標準フォーマットとなっており、各種ラピッドプロトタイピングシステムで使用可能。

三角形要素は三つの頂点の座標と法線ベクトルにより定義される三角形ポリゴンであり、ファセット(facet)と呼ばれる。

三角要素以外の点や線といった要素、色、面間の連続性、その他の特性の定義については、標準的にはできないが、拡張されたものも存在する。一部のソフトウェアにおいては、バイナリSTLにおいてファセット番号を定義する2バイト分を転用することで、色の指定を行っている場合がある。

 データ形式 
プレーンテキストで記述されたASCII STL形式と、バイナリSTL形式がある。どちらのファイル形式でも、三角形の法線ベクトル（長さ１の単位ベクトル）と、面の表裏を示すために右手系に従って並んだ三角形の座標データを三角形の数だけ含む。このような冗長性のため、面の表裏は法線ベクトルと各点座標の記述順序（右手系）のどちらでも判別できる。

 ASCII形式 
ASCII形式は人間が見た時の可読性が高いが、バイナリ形式と比較してファイルサイズが大きくなり、さらにファイル読み書き時の処理に時間がかかる。

書式は非常に単純である。

すべての行は以下の形式を満たす。:

  キーワード 　[半角1文字スペース]  データ

最初の行は以下の文で始まる。:

  solid name

nameはオプションだが、省いた場合にも必ず半角スペースが必要である。
このあとに三角形データが続く。:

  facet normal ni nj nk
    outer loop
      vertex v1x v1y v1z
      vertex v2x v2y v2z
      vertex v3x v3y v3z
    endloop
  endfacet

法線ベクトルは英語でと表記される。ここではfacet normalで三角形の法線ベクトルを意味する。法線ベクトルは大きさ１の単位ベクトルである。三角形の座標(vertex)は反時計回りに回る順番となる。数学上は三角形の座標から法線ベクトルは決定されるのだが(逆に法線ベクトルからは座標はわからない。後述するように法線ベクトルデータが直接扱われることは少ない)、三角形の法線ベクトルも同時に表示する規格となっている。
ni - nk とv1x - v3z は、e表記法(例：1.000000e+01 ）で表記される。
facet normal と outer loop の間のスペースは必要である。法線ベクトルの成分はマイナスを取りえるが、座標の成分はゼロか正値のみである。

ファイルの最後は以下の文で終了する:

  endsolid name

 バイナリ形式 
STLにはバイナリー形式も用意されており、ASCIIにくらべファイルサイズが小さく済み、読み書きの際のエンコード/デコードがないぶん高速となる。ファイルサイズの点では、ASCII表示したときに浮動小数点の桁が多いときほど、ASCII形式との差が開き有利となる。ファイル読み書き処理の点では、SSDのような高速ストレージの転送速度を生かすためにはバイナリである必要が生じうる。

バイナリーSTLファイルは80バイトの任意の文字列で開始される（通常内容は無視される。ただし、solid から記載を始めた場合にASCII形式であると誤認識するソフトウェアが存在し、注意を要する）。次に4バイトの整数でファイルに含まれる三角形の枚数が示される。そのあとに、それぞれの三角形のデータが枚数分続くという構造になっている。終了コードはない。最後の三角形のデータがファイルの後端となる。

それぞれの三角形は12個の32ビット浮動小数点で示される。ASCII形式のSTLファイルと同様に、最初に三角形の法線ベクトル(3個)、次に三角形の各座標(3x3=9個)が X/Y/Zの順番で示される。その後2バイトの未使用データが続く。ほとんどのソフトはこの部分を無視するので値はそれぞれゼロである。

浮動小数点の表記方法はIEEE方式(IEEE 754)である。エンディアンは、仕様文書に明示されていないがリトルエンディアンである。

 UINT8[80]         -   ヘッダー（任意の文字列）
 UINT32            -   ファイルに含まれる三角形の数

 foreach triangle
   REAL32[3]       -    法線ベクトル
   REAL32[3]       -    座標 1
   REAL32[3]       -    座標 2
   REAL32[3]       -    座標 3
   UINT16          -    未使用データ
 end

 法線ベクトルの取り扱い 

STLフォーマットの規格では、ASCII形式においてもバイナリ形式においても法線ベクトルは物体の外側を示す単位ベクトルでなくてはならない。特にRPシステムでは法線ベクトルは内外を表示する情報として扱われることがあるため、重要な情報となる。変換ミスで逆になった場合は反転三角としてRP作成時のエラーの原因となる。Magicsなどの各種STL編集ソフトでそのような間違いを修正することができる。
一部のソフト(例:SolidWorks)ではシェーディング効果に法線ベクトルを利用する。そのためこのようなソフトでは三角形の面に対する真の法線ベクトルとはならない。

 外部リンク 
 STLファイルフォーマット(個人による日本語メモ) 
 The STL Format - Standard Data Format for Fabbers: The STL Format
 Free STL Viewer for Google Chrome

STL