STLファイルフォーマット からスクラップ:
バイナリフォーマット
* 構文
バイト数 データ型 データ内容
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枚の三角形データとして三角形枚数分のデータが続く)
VC で C言語、C++互換で書くと、こんな感じかな。
typedef struct tagSTL_FILE_HEADER
{
char comment[80]; // オブジェクト名
unsigned int numberOfTriangles; // トライアングル数
} STL_FILE_HEADER, *LP_STL_FILE_HEADER;
#pragma pack(push,1)
typedef struct tagSTL_TRIANGLE_ENTRY
{
float n[3]; // 三角形の法線ベクトルのXYZ成分値
float v1[3]; // 三角形の1点目の頂点のXYZ座標値
float v2[3]; // 三角形の2点目の頂点のXYZ座標値
float v3[3]; // 三角形の3点目の頂点のXYZ座標値
unsigned short reserved; // 未使用データ
} STL_TRIANGLE_ENTRY, *LP_STL_TRIANGLE_ENTRYR;
#pragma pack(pop)
構造体のアラインメントを正しくセットしないと、読んでいくうちにずれちゃう。
この場合は、ズレを考慮して1トライアングルづつ読み込む事も不可能ではないけど、
ディスクアクセスの効率を考えたら、動的メモリ確保で作った配列を使用して、
まとめ読みした方が確実に早いので、その場合は、アラインメントの調整は必須。
(その分メモリを多く要するけど、最近はメモリがたくさん載っている事が多いから、、、)
0 件のコメント:
コメントを投稿