本日は3Dモデリング枠です。
最近pythonを持ちいてOpen3DのライブラリでBlendetやMayaにあるような機能の独自実装を行いながら3DCGに関しての知識を深めています。
その中で一度open3dライブラリで処理をしてエクスポートしたモデルを再度Open3Dライブラリで処理を行う際にモデルのフォーマットエラーで読み込めないというエラーが発生しました。
これはobjを正確にエクスポートできていないことを示しています。
しかし厄介なのがBlenderではある程度であれば破断しているフォーマットのデータも読み込むことができてしまう点です。
これによって具体的にどのようにモデルのobj化が失敗しているのかの判別ができない状態にありました。
今回はobjのモデルがどのようなデータでできているのかを見ていきます。
〇objとは?
objはサーフェスモデルの中間拡張子として用いられるフォーマットです。
ほかのフォーマットと異なりリグ構造などを含めることができず、汎用性が高いとは呼べませんが、シンプルであるうえに軽量であることが特徴であり、単にメッシュデータのみを扱いたい場合やもともとリグなどを含めることを想定していないスキャンデータ等に用いられる傾向があります。
〇OBJ形式の中身を見る
OBJ形式は、バイナリではなく単純な形式のテキストファイルでありバイナリエディタなどの専門のツールを使用しなくてもメモ帳で開くことができます。
今回はBlenderのプリミティブキューブをobjにエクスポートして内部を見ていきます。

これをメモ帳で開くと以下のように表示されます。
# Blender 4.1.0 # www.blender.org mtllib cube.mtl o Cube v 1.000000 1.000000 -1.000000 v 1.000000 -1.000000 -1.000000 v 1.000000 1.000000 1.000000 v 1.000000 -1.000000 1.000000 v -1.000000 1.000000 -1.000000 v -1.000000 -1.000000 -1.000000 v -1.000000 1.000000 1.000000 v -1.000000 -1.000000 1.000000 vn -0.0000 1.0000 -0.0000 vn -0.0000 -0.0000 1.0000 vn -1.0000 -0.0000 -0.0000 vn -0.0000 -1.0000 -0.0000 vn 1.0000 -0.0000 -0.0000 vn -0.0000 -0.0000 -1.0000 vt 0.625000 0.500000 vt 0.875000 0.500000 vt 0.875000 0.750000 vt 0.625000 0.750000 vt 0.375000 0.750000 vt 0.625000 1.000000 vt 0.375000 1.000000 vt 0.375000 0.000000 vt 0.625000 0.000000 vt 0.625000 0.250000 vt 0.375000 0.250000 vt 0.125000 0.500000 vt 0.375000 0.500000 vt 0.125000 0.750000 s 0 usemtl Material f 1/1/1 5/2/1 7/3/1 3/4/1 f 4/5/2 3/4/2 7/6/2 8/7/2 f 8/8/3 7/9/3 5/10/3 6/11/3 f 6/12/4 2/13/4 4/5/4 8/14/4 f 2/13/5 1/1/5 3/4/5 4/5/5 f 6/11/6 5/10/6 1/1/6 2/13/6
ここで冒頭二行の#はコメントであり、ただの情報です。具体的にはBlenderのバージョンとURLが記載されています。
# Blender 4.1.0 # www.blender.org
次の行はマテリアルライブラリを指します。
mtllib cube.mtl
これは外部マテリアルであるcube.mtlを参照するという意味です。
具体的にはobj生成時に同時に生成される.mtlファイルを参照しているという意味です。

次の行がオブジェクト名です。
o Cube
そしてvから始まるデータが頂点座標です。
v 1.000000 1.000000 -1.000000 ・・・ v -1.000000 -1.000000 1.000000
その次にvnのかたちで各頂点の法線ベクトル、
vn -0.0000 1.0000 -0.0000 ・・・ vn -0.0000 -0.0000 -1.0000
vtは頂点テクスチャ
vt 0.625000 0.500000 ・・・ vt 0.125000 0.750000
使用するマテリアルスロット
usemtl Material
最後にfが面のデータを表しています。
f 1/1/1 5/2/1 7/3/1 3/4/1 ・・・・ f 6/11/6 5/10/6 1/1/6 2/13/6
以上が基本的なobjのファイルフォーマットになります。
fbxやGLBなどはバイナリ形式であるため非常に理解しやすいフォーマットになっています。
本日は以上です。