たるきちのあれこれ









 
Top設計支援 ▶ STL書式

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成分値を記します。
成分値は、倍精度実数、単精度実数、指数表記の場合があります。


  バイナリフォーマット  

 バイト数  データ型  データ内容 
80char[] 任意の文字列(「solid」から始まる文字列は避ける) 
4unsigned
int
 三角形の個数 
1つ目の三角形データ
4float面法線ベクトルのX成分値
4float面法線ベクトルのY成分値
4float面法線ベクトルのZ成分値
4float1つ目の頂点のX成分値
4float1つ目の頂点のY成分値
4float1つ目の頂点のZ成分値
4float2つ目の頂点のX成分値
4float2つ目の頂点のY成分値
4float2つ目の頂点のZ成分値
4float3つ目の頂点のX成分値
4float3つ目の頂点のY成分値
4float3つ目の頂点のZ成分値
2-未使用
2つ目の三角形データ
4float面法線ベクトルのX成分値
4float面法線ベクトルのY成分値
4float面法線ベクトルのZ成分値
4float1つ目の頂点のX成分値
4float1つ目の頂点のY成分値
4float1つ目の頂点のZ成分値
4float2つ目の頂点のX成分値
4float2つ目の頂点のY成分値
4float2つ目の頂点のZ成分値
4float3つ目の頂点のX成分値
4float3つ目の頂点のY成分値
4float3つ目の頂点の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>法線ベクトルは、ベクトルの外積で求められます。
ベクトルa
ベクトルa
外積
a