OBJ ファイル形式は、3 次元ジオメトリ (テクスチャや照明を含む) を表現するために使用されるシンプルなデータ形式で、元々は Wavefront Technologies によって高度なアニメーション ソフトウェア用に開発されました。シンプルな構造と読みやすい ASCII 形式により、3D モデル交換形式として人気があります。
v、vt、vn、fの意味
OBJ ファイルの内容には次のものが含まれます。
頂点 (v): モデルの物理的な位置を表す点。
テクスチャ座標 (vt): UV マッピングの座標。2D テクスチャを 3D サーフェスにマッピングするために使用されます。
法線 (vn): サーフェスの方向を記述し、照明の計算に使用されます。
表面 (f): 3 次元オブジェクトの表面を記述します。面は、頂点、テクスチャ座標、法線で構成できます。
OBJ ファイルは、モデルのマテリアルとシェーディング情報を記述する MTL ファイルを参照することもあります。
OBJ 形式はプレーン テキスト形式であるため、任意のテキスト エディタを使用してその内容を開いて表示できます。その構造は非常に直感的です。次に例を示します。
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
...
vt 0.748573 0.750412
vt 0.748573 0.249588
...
vn 0.000000 0.000000 -1.000000
vn 0.000000 0.000000 1.000000
...
f 1/1/1 2/2/1 3/3/1
f 3/1/1 4/2/1 5/3/1
...
上記のコードは、頂点 (v)、テクスチャ座標 (vt)、法線 (vn)、および面 (f) を定義します。面は、どの頂点、テクスチャ座標、法線を組み合わせてオブジェクトの表面を形成するかを定義します。
OBJ 形式は可読性が高く、幅広いソフトウェアをサポートしているため、3D グラフィックスとモデリング ツールの間の交換形式としてよく使用されます。
OBJ ファイル形式では、頂点、テクスチャ座標、法線、面の対応は次のように理解できます。
- 頂点 (v):
モデルの物理的な位置を定義します。各頂点には、次のような x、y、z 座標があります。
v x y z
- テクスチャ座標 (vt):
2D テクスチャが 3D モデルにどのようにマッピングされるかを説明する座標。各テクスチャ座標には通常、次のような u、v 座標 (オプションで w 座標も含まれますが、ほとんどの場合は使用されません) があります。
vt u v
- Normal (vn):
ライティングとレンダリングに使用されるサーフェスの方向を記述します。各法線には、次のような方向を示す x、y、z 座標があります。
vn x y z
- サーフェス (f):
3D モデルのサーフェスを構成するポリゴンを表します。OBJ 形式では、面は 3 つ以上の頂点で構成され、対応するテクスチャ座標と法線を含めることができます。面の定義形式は以下のとおりです。
f vertex/texture/normal vertex/texture/normal vertex/texture/normal ...
例えば:
f 1/1/1 2/2/1 3/3/1
上記の面の定義では、頂点/テクスチャ/法線の各組み合わせによって、頂点、そのテクスチャ座標、および法線が記述されます。たとえば、1/1/1 は、1 番目の頂点、1 番目のテクスチャ座標、および 1 番目の法線を使用することを意味します。
すべての OBJ ファイルにテクスチャ座標と法線が含まれているわけではないことに注意してください。面の定義には、次のような頂点のみを含めることができます。
f 1 2 3
または、頂点とテクスチャ座標だけを使用し、法線は使用しません。
f 1/1 2/2 3/3
さらに、OBJ ファイルの面は通常三角形または四角形ですが、任意の多角形にすることもできます。ただし、互換性の理由から、多くのプログラムは多角形を三角形に分割して処理します。
f行のフォーマット
OBJ ファイルの行 f は、頂点、テクスチャ座標、および法線によって定義されるポリゴンを記述します。20336//20336 のような形式が表示された場合、テクスチャ座標インデックスではなく、頂点インデックスと法線インデックスのみが提供されていることを意味します。
具体的には、行 f の形式は次のようになります。
頂点のみ:
f v1 v2 v3 ...
例: f 20336 29090 33004
頂点とテクスチャの座標:
f v1/vt1 v2/vt2 v3/vt3 ...
例: f 20336/20336 29090/29090 33004/33004
頂点、テクスチャ座標、法線:
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...
例: f 20336/20336/20336 29090/29090/29090 33004/33004/33004
頂点と法線 (テクスチャ座標なし):
f v1//vn1 v2//vn2 v3//vn3 ...
例: f 20336//20336 29090//29090 33004//33004
あなたが言及した f 20336//20336 29090//29090 33004//33004 形式では、二重スラッシュ // を使用すると、テクスチャ座標インデックスがないことを意味します。これは、テクスチャを必要としないモデル、またはモデルにテクスチャ座標が割り当てられていないモデルで発生する可能性があります。
obj ファイルの最初の行は mtllib Mesh.mtl です。
.obj ファイルでは、1 行目の mtllib ディレクティブは、使用するマテリアル ライブラリ ファイル (マテリアル ライブラリ) を指定するために使用されます。このディレクティブは、モデルのレンダリングまたは表示時にマテリアルおよびテクスチャ情報を取得するためにどの .mtl ファイルを参照する必要があるかをレンダリング エンジンまたは 3D アプリケーションに指示します。
たとえば、.obj ファイルの最初の行が次の場合、
mtllib mesh.mtl
次に、同じフォルダー内の Mesh.mtl ファイルを読み取るようにレンダリング エンジンに指示します。このファイルには、モデルのマテリアル プロパティ、テクスチャ マップ パス、その他の情報が含まれている必要があります。この .mtl ファイルは、色、テクスチャ、その他の情報を含むモデル マテリアルの定義を提供し、レンダリング中にモデルに正しく適用できるようにします。
つまり、mtllib コマンドを使用して .mtl ファイルを関連付け、モデルのマテリアル情報を正しくロードして適用できるようにします。