STLとは三次元形状を小さな三角形の集合体として表現するデータを
保存するファイルフォーマットのひとつです。
オブジェクトの形状は、3つの頂点座標値(右ねじの法則で並べる)と面法線ベクトル(単位ベクトル)
により定義される三角形ポリゴンのファセット(facet)により表現します。
STLファイルには、アスキーフォーマットとバイナリフォーマットがあります。
solid OBJECT
facet normal 0.4346657272846644 0.54766102262932548 0.71493573824274259
outer loop
vertex 1.6564099788665771 120.53340911865234 98.117500305175781
vertex 5.1112079620361328 124.97022247314453 92.618331909179688
vertex 1.7037359476089478 124.97022247314453 94.69000244140625
endloop
endfacet
facet normal -0.334360 -0.619707 -0.710047
outer loop
vertex 1.656410 120.533406 98.117500
vertex 4.969230 120.533406 96.557500
vertex 5.111208 124.970219 92.618333
endloop
endfacet
facet normal 0.000000e+00 0.000000e+00 1.000000e+00
outer loop
vertex 0.000000e+00 0.000000e+00 1.000000e+01
vertex 1.000000e+01 0.000000e+00 1.000000e+01
vertex 0.000000e+00 1.000000e+01 1.000000e+01
endloop
endfacet
・
・
・
endsolid OBJECT
|
「solid」行にソリッド名を記します。
以降の「facet normal」〜「endfacet」が1つの三角形です。
「facet normal」行に面法線ベクトルのX成分値、Y成分値、Z成分値を記します。
「vertex」行に頂点座標のX成分値、Y成分値、Z成分値を記します。
成分値は、倍精度実数、単精度実数、指数表記の場合があります。
バイト数 | データ型 | データ内容 |
80 | char[] | 任意の文字列(「solid」から始まる文字列は避ける) |
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 | - | 未使用 |
・ ・ ・ |
<参考1>バイナリフォーマットファイルからデータを取得するサンプルコードです。
C# |
// using System.IO;
FileStream fs = new FileStream(@"C:\binary.stl", FileMode.Open, FileAccess.Read);
byte[] bs = new byte[fs.Length];
fs.Read(bs, 0, bs.Length);
fs.Close();
// コメント取得
string strComment = Encoding.GetEncoding("Shift_JIS").GetString(bs, 0, 80);
// 三角形の個数取得
uint intCount = BitConverter.ToUInt32(bs, 80);
int ii = 84;
for (uint i = 0; i < intCount; i++)
{
// 面法線ベクトル成分取得
float vx = BitConverter.ToSingle(bs, ii);
float vy = BitConverter.ToSingle(bs, ii + 4);
float vz = BitConverter.ToSingle(bs, ii + 8);
// 1つ目の頂点成分取得
float x1 = BitConverter.ToSingle(bs, ii + 12);
float y1 = BitConverter.ToSingle(bs, ii + 16);
float z1 = BitConverter.ToSingle(bs, ii + 20);
// 2つ目の頂点成分取得
float x2 = BitConverter.ToSingle(bs, ii + 24);
float y2 = BitConverter.ToSingle(bs, ii + 28);
float z2 = BitConverter.ToSingle(bs, ii + 32);
// 3つ目の頂点成分取得
float x3 = BitConverter.ToSingle(bs, ii + 36);
float y3 = BitConverter.ToSingle(bs, ii + 40);
float z3 = BitConverter.ToSingle(bs, ii + 44);
ii += 50;
}
|
<参考2>法線ベクトルは、ベクトルの外積で求められます。