3DにおけるJPEGとは?
STLファイルフォーマットを解きほぐす
はじめに
3次元(以下3D)画像の分野で、 という表現を目にします。
例えば、
引用:glTF
引用:2020年代に注目すべき3Dデータファイル形式
引用:「VRMコンソーシアム」13社合同で設立
などの記事があります。
JPEGは周知の通り2次元(以下2D)画像ファイルでありカメラで撮影される写真の画像ファイルとして広く普及しています。
JPEGはデータサイズを小さくする圧縮方式を採っており、2D画像ファイルとしては他にもBMPやTIFFやPNGなど数多く存在します。
カメラで撮影して作られるJPEGなどの2D画像ファイルは、被写体が2次元の面に投影されて得られる2D画像データを格納しているファイルです。
そのため、被写体の位置や照明光の違いや投影時のボケ具合などの影響を受けて同じ被写体であっても2D画像の中身は変化します。
これに対して、「3DにおけるJPEG」と位置付けられる3D画像ファイルとはどういうものなのでしょうか?
この意味合いを探るべく、先ずは3Dプリントを中心に既に広く普及しているSTLファイルフォーマットを出来るだけ具体的に解きほぐしてみることにしました。
STLファイルフォーマットの仕様
STLファイルフォーマットの仕様については、The StL FormatやSTLファイルフォーマットなどに書かれています。
このフォーマットは、
ことを特徴にしています。
このフォーマットのデータ構成は、
1.ヘッダ(任意領域) 80Byte
2.ポリゴン枚数 4Byte
3.各ポリゴンのデータ
(1)法線ベクトル値 12Byte
(2)頂点1の座標値 12Byte
(3)頂点2の座標値 12Byte
(4)頂点3の座標値 12Byte
(5)未使用データ 2Byte
となっていて、立方体であれば12個のポリゴンで構成されて80+4+12×(12+12+12+12+2)=計684Byteの容量になります。
STLファイルフォーマットの具体例
著名なオープンソースの3DCGソフトであるBlenderから出力された、単純な立方体モデルのSTLファイル(バイナリ)を拝借してその構造を説明します。
対象物
対象となる立体物は立方体です。物体であることを示すために灰色にしておりますが、6個の面がある単なる立方体です。
STLファイルの尺度単位は任意となっており、この具体例では縦横高さがそれぞれ±1.0の大きさ内に位置する構造になっています。下記データとの対応を示すために便宜的にいわゆる右手座標系を使って図示しています。
立方体の中心OがXYZ座標軸の原点(0,0,0)で8個ある頂点の座標が
A(-1,+1,-1)
B(+1,+1,-1)
C(+1,+1,+1)
D(-1,+1,+1)
E(-1,-1,-1)
F(+1,-1,-1)
G(+1,-1,+1)
H(-1,-1,+1)
に位置しています。これらの頂点の記号の名称や順番は適当に割り当てています。
ファイルデータの説明
ファイルデータは後段に記しています。そのファイルデータの内容をここにまとめておきます。
ポリゴン構成
ポリゴンは三角形で、立方体の6個の面を2等分して計12枚のポリゴンにしています。
ポリゴン1は三角形CDH
ポリゴン2は三角形CHG
ポリゴン3は三角形FGH
ポリゴン4は三角形FHE
ポリゴン5は三角形EHD
ポリゴン6は三角形EDA
ポリゴン7は三角形ABF
ポリゴン8は三角形AFE
ポリゴン9は三角形BCG
ポリゴン10は三角形BGF
ポリゴン11は三角形ADC
ポリゴン12は三角形ACB
に対応しています。
法線ベクトル
法線ベクトルはポリゴンの面の表裏を定めるために設定されています。面が向いている方向を特定するには面に直交する方向とするのが理にかなっており、方向であるのでベクトルで表現する方法が古くから用いられてきています。裏面にも法線ベクトルは当然にあって表面の法線ベクトルとは反対側の方向を向いています。ここでの法線ベクトルは表面の法線ベクトルで、中心から大きさ1の単位法線ベクトルで表現されています。
尚、法線ベクトルは面上に位置する3点から外積演算で求めることができるので、ポリゴンの頂点座標が分かれば法線ベクトルが計算できることになります。しかし、表裏の区別が必要なので、頂点123の登録順を表面から見て反時計回りに設定することが必要になります。STLファイルフォーマットにはそのような反時計回りの頂点123の設定についてが記されています。この規定に従うのであれば法線ベクトルの記載は不要になりますが、法線ベクトルがあればその演算処理が不要になるなど何かと便利になります。
三角形CDHのポリゴン1と三角形CHGのポリゴン2を例にとると、これら2つのポリゴンは同一面にあるので、ポリゴン1の法線ベクトルとポリゴン2の法線ベクトルは同一のN1f(裏面の法線ベクトルはN1b)で、(0,0,1)になっています。これはz軸のベクトルと一致しています。
ファイルデータ
ヘッダ(任意領域)
バイト数 データ型
80Byte ASCII
データ
Exported from Blender-3.4.1
ポリゴン枚数
バイト数 データ型
4Byte unsigned long integer
データ
12
ポリゴンの共通データ構造
バイト数 データ型
※以下のポリゴンで共通
48Byte float × 12
2Byte unsigned integer
ポリゴン1のデータ
データ
法線ベクトル値 (0,0,1)
頂点1座標値 (1,1,1)
頂点2座標値 (-1,1,1)
頂点3座標値 (-1,-1,1)
未使用データ (0)
ポリゴン2のデータ
データ
法線ベクトル値 (0,0,1)
頂点1座標値 (1,1,1)
頂点2座標値 (-1,-1,1)
頂点3座標値 (-1,1,1)
未使用データ (0)
ポリゴン3のデータ
データ
法線ベクトル値 (0,-1,0)
頂点1座標値 (1,-1,-1)
頂点2座標値 (1,-1,1)
頂点3座標値 (-1,-1,1)
未使用データ (0)
ポリゴン4のデータ
データ
法線ベクトル値 (0,-1,0)
頂点1座標値 (1,-1,-1)
頂点2座標値 (-1,-1,1)
頂点3座標値 (-1,-1,-1)
未使用データ (0)
ポリゴン5のデータ
データ
法線ベクトル値 (-1,0,0)
頂点1座標値 (-1,-1,-1)
頂点2座標値 (-1,-1,1)
頂点3座標値 (-1,1,1)
未使用データ (0)
ポリゴン6のデータ
データ
法線ベクトル値 (-1,0,0)
頂点1座標値 (-1,-1,-1)
頂点2座標値 (-1,1,1)
頂点3座標値 (-1,1,-1)
未使用データ (0)
ポリゴン7のデータ
データ
法線ベクトル値 (0,0,-1)
頂点1座標値 (-1,1,-1)
頂点2座標値 (1,1,-1)
頂点3座標値 (1,-1,-1)
未使用データ (0)
ポリゴン8のデータ
データ
法線ベクトル値 (0,0,-1)
頂点1座標値 (-1,1,-1)
頂点2座標値 (1,-1,-1)
頂点3座標値 (-1,-1,-1)
未使用データ (0)
ポリゴン9のデータ
データ
法線ベクトル値 (1,0,0)
頂点1座標値 (1,1,-1)
頂点2座標値 (1,1,1)
頂点3座標値 (1,-1,1)
未使用データ (0)
ポリゴン10のデータ
データ
法線ベクトル値 (1,0,0)
頂点1座標値 (1,1,-1)
頂点2座標値 (1,-1,1)
頂点3座標値 (1,-1,-1)
未使用データ (0)
ポリゴン11のデータ
データ
法線ベクトル値 (0,1,0)
頂点1座標値 (-1,1,-1)
頂点2座標値 (-1,1,1)
頂点3座標値 (1,1,1)
未使用データ (0)
ポリゴン12のデータ
データ
法線ベクトル値 (0,1,0)
頂点1座標値 (-1,1,-1)
頂点2座標値 (1,1,1)
頂点3座標値 (1,1,-1)
未使用データ (0)
より高度なglTFファイルを調べるなら
おわりに
「STLはテッセレーションと呼ばれるとても単純なアプローチで3Dモデルのジオメトリを保存している。」という前出引用:
2020年代に注目すべき3Dデータファイル形式
の表現が的確に言い表しています。
などの知見が得られます。