夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

obj形式のファイルフォーマットの中身を見る 

本日は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などはバイナリ形式であるため非常に理解しやすいフォーマットになっています。

 本日は以上です。