HobbyistBox

趣味事をつらつらと

【FBX to OBJ】01 .objファイルについて

はじめに

前回 FBXSDK を設定し、いよいよプログラミングを開始できるようになりました。ですが、ゴールである OBJ形式について触れていません。

今回は、早くプログラミングしたい気持ちを グッ こらえて OBJ形式を見ていきましょう。

このファイル形式の特徴は 3D の形状を定義する .obj ファイルとマテリアルを定義する .mtl ファイルの2つで構成されているところです。ファイルが2つなので .mtl ファイルは関係ないのですが、OBJ でエクスポートと言えば .mtl ファイルも込みなので OBJ と大文字で書いた場合は .obj ファイルと .mtl ファイルを指すこととします。

ちなみに、mtl は MaterialTemplateLibrary の略です。

目標

このエントリーでは .obj ファイルの構成を読んで FBXファイル内のどの情報が必要かを理解したいと思います。

環境

作業環境は

で進めていきたいと思います。

教科書となるOBJ

まず、Blender を起動します、設定をいじっていなければ立方体(Cube)が1つあると思います。

f:id:Hobbyist:20160212235907p:plain

無い場合は左下にある Add >> Mesh >> Cube または、ショートカット Shift + A から Mesh >> Cube で追加してください。

f:id:Hobbyist:20160213000510p:plain

次に、このただの Cube をエクスポートします。
ウィンドウ左上の File >> Export >> WaveFront(.obj) を選択してください。

f:id:Hobbyist:20160213001012p:plain

開いたウィンドウでエクスポート先とファイル名を設定して右上にある Export OBJ をおしてください。
初期エクスポート先はユーザドキュメントになっているので、System Bookmarks から Desktop(デスクトップ) または System から Cドライブなどアクセスしやすい場所を選んでください。

f:id:Hobbyist:20160213002537p:plain

要素

エクスポートした .obj をテキストエディタで開いてみましょう。

# Blender v2.76 (sub 0) OBJ File: ''
# www.blender.org
mtllib SampleObj.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 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vn 0.000000 -1.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 1.000000 0.000000 0.000000
vn -0.000000 -0.000000 1.000000
vn -1.000000 -0.000000 -0.000000
vn 0.000000 0.000000 -1.000000
usemtl Material
s off
f 1//1 2//1 3//1 4//1
f 5//2 8//2 7//2 6//2
f 1//3 5//3 6//3 2//3
f 2//4 6//4 7//4 3//4
f 3//5 7//5 8//5 4//5
f 5//6 1//6 4//6 8//6

先ほどエクスポートした Cube を OBJ形式で表現するとこのようになります。では、1つずつ見ていきましょう。


# (string)
1行コメントを表します。#(シャープ)の後に書かれた文字はモデルデータに影響をあたえません。


mtllib (file path)
マテリアルを定義した .mtl ファイルを指定します。省略可能。


o (name)
オブジェクトの名前を小文字の o(オー)の後に記述します。


v (x y z [w])
頂点の座標を記述します。最後の w 要素は基本 1.0 で省略可能です。
ここで指定する座標はインデックスバッファで最適化されているかどうかは区別されません。


vt (u v [w])
今回のサンプルにはありませんが、テクスチャ座標を指定します。
最後の w 要素は基本 0 で省略可能です。


vn (x y z)
法線ベクトルを記述します。
ここで指定するベクトルは面法線か頂点法線か区別されません。


usemtl (material name)
mtllib で指定した .mtl ファイル内に定義されているマテリアル名を指定します。省略可能。


s (1 or 0)
オブジェクトにスムースシェーディングをかけるかを指定します。
値が 1 ならスムース、0 または OFF ならフラットです。


f (v/vt/vn ...)
面(Face)を定義します。
ここはちょっとややこしいのでしっかりやりましょう。

まず、ここで指定する数値は先に指定した v要素 vt要素 vn要素の1から始まる番号です。

f 1//1

この場合、座標(v)リストの1番目(1.000000 -1.000000 -1.000000)で法線(vn)リストの1番目(0.000000 -1.000000 0.000000)を使用しています。UV(vt)はないので省略しています。
そして、この面は四角形なので4頂点を指定します。

f 1//1 2//1 3//1 4//1

また、座標以外は省略可能ですが、指定する順番(v/vt/vn) は変えられません。
そこで指定パターンを四角形ポリゴンを例に書いておきます。

座標のみ f v1 v2 v3 v4 f 1 2 3 4
座標 + UV f v1/vt1 v2/vt2 v3/vt3 v4/vt4 f 1/1 2/2 3/3 4/4
座標 + UV + 法線 f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 v4/vt4/vn4 f 1/1/1 2/2/2 3/3/3 4/4/4
座標 + 法線 f v1//vn1 v2//vn2 v3//vn3 v4//vn4 f 1//1 2//2 3//3 4//4

エクスポートした .obj ファイルについての説明は終わりです。

v要素の数とvn要素の数が違うのになんで成り立つのか、などいくつか説明を省略している箇所もありますがそこは 3D プログラミングのテクニック的なことなので今回は省略です。

.objファイルが読めるようになることで、コンバートしたデータを毎回ファイルに書き出して3Dソフトで確認してということをせずに、コンソール上で確認できるようになりました。

.mtl ファイルについてはマテリアルを触るときに改めて説明したいと思います。