STLファイルフォーマット

概要

3D Systems社のSLA CADというソフト用のファイルフォーマットです。
多くの解析ソフトがサポートし、三角形メッシュソリッド表現ファイルフォーマットとして広く使用されています。

記録される3Dモデルデータは、三角形の面法線ベクトルと3つの頂点の座標値です。

三角形の頂点の順番と面の表裏の関係は、右ねじの規則に従います。(三角形の表側は点が半時計周りに回る順番に並びます。)(3つの点の座標値から三角形の面法線ベクトルは求まるはずなのだが、三角形の面法線も記録するフォーマットとなっています。)



STLファイルフォーマットには、アスキーフォーマットとバイナリーフォーマットがあります。

公式の仕様書

筆者は、公式の仕様書の所在を知りません。
公式の仕様書の所在をご存知の方はご一報ください。(「ホーム > コンタクト」)

アスキーフォーマット

構文

solid 任意の文字列
facet normal x成分値 y成分値 z成分値
outer loop
vertex x成分値 y成分値 z成分値
vertex x成分値 y成分値 z成分値
vertex x成分値 y成分値 z成分値
endloop
endfacet
facet normal x成分値 y成分値 z成分値
outer loop
vertex x成分値 y成分値 z成分値
vertex x成分値 y成分値 z成分値
vertex x成分値 y成分値 z成分値
endloop
endfacet
(facet normal行からendfacet行までを1枚の三角形データとして以降繰り返し)
endsolid 任意の文字列

解説

すべての行が、
    キーワード[1文字スペース]データ
という形式になっています。

改行コードに関しては、CR+LF、LF、CRのどれが正しいのかは不明です。

キーワードおよびデータを区切るものとしては、1文字分の半角スペースです。
複数文字分の半角スペースやタブでも良いかに関しては不明です。
キーワードの前にスペースやタブを入れても良いかに関しては不明です。
キーワード文字を大文字や、大文字小文字混在にしても良いかに関しては不明です。

facet normal行からendfacet行までを一組とし、1つの三角形を表します。
facet normal行の次には、outer loopの行が、その次には3つのvertexの行が、その次にはendloopの行が、その次にはenndofacetが来ます。

「solid」キーワード行
ソリッド名を指定します。
キーワードの後には区切り文字をはさんで、ソリッド名が記されます。
ソリッド名の文字数の制限に関しては不明です。
通常1つのSTLファイルにsolidキーワード行は1回だけ記されます。
「facet normal」キーワード行
1つの三角形の面法線ベクトルを指定します。
2単語で1キーワード。
2単語の間には1文字分の半角スペースです。
キーワードの後には区切り文字をはさんで、三角形の面法線ベクトルのX成分値 Y成分値 Z成分値が記されます。
成分値の表記に関しては、科学表記、単精度実数表記を用いるとする資料(外部リンク外部リンク)があるが、それ以外の表記で記録されたSTLファイルもある模様です。
「outer loop」キーワード行
2単語で1キーワードです。
2単語の間には1文字分の半角スペースです。
キーワードの後には何も記されません。
「vertex」キーワード行
1つの頂点の頂点座標値を指定します。
キーワードの後には区切り文字をはさんで、三角形の3つの頂点のうちの1つの頂点の頂点座標値のX成分値 Y成分値 Z成分値が記されます。
座標値の表記に関しては、科学表記、単精度実数表記を用いるとする資料(外部リンク外部リンク)があるが、それ以外の表記で記録されたSTLファイルもある模様です。
「endloop」キーワード行
endとloopの間にはスペースをはさまみません。
キーワードの後には何も記されません。
「endfacet」キーワード行
endとfacetの間にはスペースをはさみません。
キーワードの後には何も記されません。
コメント行に関して
コメント行に関する規定は不明です。
上記キーワードがない行がコメント行ともいえます。

ダウンロード

サンプルファイル

cube-ascii.stl ( 10x10x10 立方体 )

バイナリフォーマット

構文

バイト数 データ型 データ内容
80 char[ ] 任意の文字列
4 unsigned int 三角形の枚数
- - 1つ目の三角形データ
4 float 三角形の法線ベクトルのX成分値
4 float 三角形の法線ベクトルのY成分値
4 float 三角形の法線ベクトルのZ成分値
4 float 三角形の1点目の頂点のX座標値
4 float 三角形の1点目の頂点のY座標値
4 float 三角形の1点目の頂点のZ座標値
4 float 三角形の2点目の頂点のX座標値
4 float 三角形の2点目の頂点のY座標値
4 float 三角形の2点目の頂点のZ座標値
4 float 三角形の3点目の頂点のX座標値
4 float 三角形の3点目の頂点のY座標値
4 float 三角形の3点目の頂点のZ座標値
2 - 未使用データ
- - 2つ目の三角形データ
4 float 三角形の法線ベクトルのX成分値
4 float 三角形の法線ベクトルのY成分値
4 float 三角形の法線ベクトルのZ成分値
4 float 三角形の1点目の頂点のX座標値
4 float 三角形の1点目の頂点のY座標値
4 float 三角形の1点目の頂点のZ座標値
4 float 三角形の2点目の頂点のX座標値
4 float 三角形の2点目の頂点のY座標値
4 float 三角形の2点目の頂点のZ座標値
4 float 三角形の3点目の頂点のX座標値
4 float 三角形の3点目の頂点のY座標値
4 float 三角形の3点目の頂点のZ座標値
2 - 未使用データ
・・・ - (三角形の法線ベクトルのX成分値から未使用データまでを1枚の三角形データとして三角形枚数分のデータが続く)

解説

最初に80バイト分の任意の文字列があり、次に4バイトで三角形の枚数、次に50バイト(=4*3+4*3+4*3+4*3+2)で1枚の三角形のデータが三角形枚数分続くという形式になっています。

エンディアン(endian、byte order)に関してはLittle Endian、Big Endianのどちらが正しいのかは不明です。

任意の文字列
任意の文字列で何を記すかに関しては不明です。
ソリッド名、STLファイルを生成したソフト名、ソリッド名とSTLファイルを生成したソフト名、等が記されている場合の他、何も記されていない場合もあります。
三角形の枚数
int型
三角形の法線ベクトルのそれぞれの成分値
float型
三角形の頂点のそれぞれの座標値
float型

ダウンロード

サンプルファイル

cube-binary.stl ( 10x10x10 立方体 )