Wavefront .objファイル

Wavefront OBJ (.OBJ) は、当初Wavefront Technologiesが、同社のアニメーションパッケージであるAdvanced Visualizerのために開発したジオメトリ定義ファイル形式である。
ファイル形式が公開されると、他の3DCGソフトウェアベンダーも対応を行っていった。おおよそ、これは広く受け入れられた形式である。
OBJファイル形式は、3Dジオメトリのみを表現する単純なデータ形式である。3Dジオメトリのみとは則ち、各頂点の位置、各テクスチャ座標の頂点のUV位置、Vertex normal、頂点リストとして定義された各ポリゴンを形作る面、そしてテクスチャ頂点である。頂点は標準で反時計回りに記録され、面法線の明示的宣言を不要としている。OBJ座標は単位を持っていないものの、OBJ形式は人間の読めるコメント行内にスケール情報を含むことができる。

**ファイル形式**
ハッシュ文字(#)に続く文字はコメントである。
# これはコメントである。
OBJファイルは、頂点データ、自由曲線/曲面 (free-form curve/surface) 属性、要素、自由曲線/曲面本文、自由曲面間の連続性、グループおよび表示/描画属性情報を含むことができる。特に一般的な要素は、ジオメトリ頂点、テクスチャ座標、頂点法線、ポリゴン面である:
# (x,y,z,w) 座標によるジオメトリ頂点の一覧。w は任意であり、標準は 1.0 である。右手座標系である。
v 0.123 0.234 0.345 1.0
v ...
...
# (u, v ,w) 座標によるテクスチャ座標の一覧。座標は0から1の間で変化することができる。v と w は任意であり、標準は 0 である。
vt 0.500 1 0
vt ...
...
# (x,y,z) 形式による頂点法線の一覧; 法線は単位法線ではないかもしれない。
vn 0.707 0.000 0.707
vn ...
...
# ( u ,v ,w ) 形式によるパラメータ空間頂点 ; 自由ジオメトリ文 (以下を参照)
vp 0.310000 3.210000 2.100000
vp ...
...
# ポリゴン面要素 (以下を参照)
f 1 2 3
f 3/1 4/2 5/3
f 6/4/1 3/5/3 7/6/5
f ...
...
# ライン要素 (以下を参照)
l 5 8 1 2 4 9

**ジオメトリ頂点**
頂点 (vertex) は、文字vから始まる行で指定できる。これには (x,y,z,w) 座標が続く。w は任意であり、標準は 1.0 である。右手座標系である。いくつかのアプリケーションは、赤、緑および青の値を、x、yおよびzの後に入れることで、頂点カラーに対応する。色の値の範囲は 0 から 1 である。

**パラメータ空間頂点**
自由形式のジオメトリ文は、文字列vpから始まる行で指定できる。曲線 (curve) または曲面 (surface) のパラメータ空間における点を定義する。
u のみは曲線の点に必要であり、u および v は曲面の点と非有理境界曲線 (non-rational trimming curve) の制御点に必要であり、さらに u、v および w (weight: 重み) は有理境界曲線 (rational trimming curve) の制御点に必要である。

**面要素**
面 (face) は頂点、テクスチャ、法線のインデックスのリストを使って定義される。これはそれぞれのインデックスが1から始まり、定義された参照要素の順序に応じて増加するvertex_index/texture_index/normal_indexの形式による。四角形のようなポリゴンは三つより多くのインデックスを使うことで定義できる。
OBJ形式はまた、NURBS曲面のような、オブジェクト定義に曲線と曲面を使用する自由形式ジオメトリに対応する。

**頂点インデックス**
有効な頂点インデックスは、以前に定義した頂点リストの、対応する頂点要素に一致する。もしインデックスが正なら、1から始まる、その頂点リストのオフセットを指す。もしインデックスが負なら、それは頂点リストの終わりを相対的に指し、-1は最後の要素を差す。
それぞれの面は三つ以上の頂点を含む。
f v1 v2 v3 ....

**頂点テクスチャ座標インデックス**
任意により、面を定義する際、テクスチャ座標インデックスは、テクスチャ座標を指定することに使われることができる。
面を定義する際、頂点インデックスにテクスチャ座標インデックスを追加するには、
頂点インデックスの後、直ぐにスラッシュを入れ、その後、テクスチャ座標インデックスを入れる必要がある。スラッシュの前後に空白は許可されていない。
有効なテクスチャ座標インデックスは、以前に定義した1から始まるテクスチャ座標の一覧にある対応する要素と一致する。
f v1/vt1 v2/vt2 v3/vt3 ...

**頂点法線インデックス**
任意により、面を定義する際、法線インデックスは頂点のための法線ベクトルを指定するために使われることができる。
面を定義する際、頂点インデックスに法線インデックスを追加するには、
テクスチャ座標の後、二個目のスラッシュを入れなければならず、その後、法線インデックスを入れる。
有効な法線インデックスは、以前に定義した1から始まる法線の一覧にある対応する要素と一致する。
それぞれの面は、三つ以上の要素を含む。
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ....

**テクスチャ座標インデックス無しの頂点法線インデックス**
テクスチャ座標は任意であるため、それら無しでジオメトリを定義することは可能であるが、その場合、頂点インデックスの後、法線インデックスを挿入する前に、二つのスラッシュを挿入しなければならない。


**ライン要素**
文字"l"から始まる記述はポリラインを構築する頂点順序を指定する。


**他のジオメトリ形式**
OBJファイルはTaylorおよびBスプラインのようないくつかの異なる種類の補間を使用した高次曲面に対応しているものの、サードパーティのファイルリーダーにおけるそれらの機能のサポートは、普遍的とはほど遠い。また、OBJファイルは、メッシュ階層や、いかなる種類のアニメーション/変形 (例えば、頂点スキニングやメッシュモーフ) にも対応していない。

**マテリアル参照**
ポリゴンのビジュアル面を記述するlabel=マテリアルは、外部の.mtlファイルに保存される。一つより多くの外部のMTLマテリアルファイルが、一つのOBJファイルから参照されることができる。.mtlファイルは一つ以上の名前のマテリアル定義を含むことができる。
mtllib 外部 .mtl ファイル名
...
このタグはタグに続いてマテリアル名を指定する。マテリアル名は、外部.mtlファイルで定義された名づけられたマテリアルに一致する。
usemtl マテリアル名
...
名づけられたオブジェクトとポリゴングループは以下のタグを通して指定される。
o オブジェクト名
...
g グループ名
...
ポリゴン間のスムーズシェーディングは、スムージンググループにより有効化される。
s 1
...
# スムーズシェーディングは無効化することもできる。
s off
...

**相対および絶対インデックス**
OBJファイルは、その一覧構造に関して、その絶対位置 (1で最初の定義された頂点を、NでN番目の定義された頂点を表す)か、その相対位置 (-1で最新の頂点を表す)かを問わず、頂点、法線などを参照することが可能である。
しかしながら、全てのソフトウェアが後者の方法をサポートするというわけではなく、逆にいくつかのソフトウェアは本質的に後者の形で書き込みを行い (頂点オフセットなどの再計算が不必要な要素を追加するのに好都合なため)、時折非互換を導く。

**マテリアル・テンプレート・ライブラリ**
マテリアルテンプレートライブラリ形式 (MTL) 又は .MTL ファイル形式は、一つ以上のOBJファイルに含まれるオブジェクトの面のシェーディング (マテリアル) 特性を記述するために必携のファイル形式であり、同じくWavefront Technologiesにより定義された。.OBJファイルは一つ以上の.MTLファイル (これを「マテリアルライブラリ」と呼ぶ) を参照し、そこから、名前によって一つ以上のマテリアル記述を参照する。.MTL はコンピューターレンダリングの目的のための、フォン反射モデルに関する面の光反射特性を定義するASCIIファイルである。この標準は、異なるコンピューターソフトウェアパッケージの間に広範なサポートがあり、便利なマテリアル交換形式となっている。
MTL形式は未だ広く使われているものの、時代遅れで、スペキュラマップおよびパララックスマップのような後発の技術に完全対応していない。しかしながら、フォーマットのオープン性と直感性により、これらのパラメータはカスタムのMTLファイルジェネレータを使って簡単に追加することができる。
MTL形式はいくつかの形式を定義している。

**基本的なマテリアル**
単体の .mtl ファイルは、複数のマテリアルを定義することができる。マテリアルはファイル内に逐次定義される。それぞれはnewmtlコマンドより始まる:
# 'Colored'と名づけたマテリアルを定義
newmtl Colored
マテリアルのアンビエント色は、Kaを使って記述される。色の定義は、それぞれのチャンネルの値が0から1の間となるRGBである。
# 白
Ka 1.000 1.000 1.000
似たように、ディフューズ色は、Kdを使って記述される。
# 白
Kd 1.000 1.000 1.000
スペキュラ色は、Ksを使って記述され、スペキュラ指数 Ns を使って重み付けされる。 
# 黒 (無効)
Ks 0.000 0.000 0.000

# 0から1000の範囲
Ns 10.000
マテリアルは透過できる。これは「ディゾルブ」(dissolve) とも呼ばれる。本物の透過とは異なり、結果はオブジェクトの厚みに依存しない。"d"における1.0の値は標準であり完全に不透明を意味し、Trの0.0の値と同等である。
# いくつかの実装は 'd' を使う。
d 0.9 

# 他は 'Tr' (反転) を使う。
Tr 0.1
マテリアルはそのサーフィスの光学密度を持つことができる。これは屈折率としても知られている。
# 光学密度
Ni 1.45000
値は0.001から10の範囲を取る。1.0の値は光がオブジェクトをパススルーし曲がらないことを意味する。光学密度の増加は光の曲がる量を増加させる。 ガラスは約1.5の屈折率を持つ。1.0未満の値は奇妙な結果を生むため推奨されない。
マテリアル毎に、複数の照明モデルが利用可能である。以下に列挙する:
0. 色 有効 かつ アンビエント 無効
1. 色 有効 かつ アンビエント 有効
2. ハイライト 有効
3. 反射 有効 かつ レイトレース 有効
4. 透過: グラス 有効, 反射: レイトレース 有効
5. 反射: フレネル 有効 かつ レイトレース 有効
6. 透過: 反射 有効, 反射: フレネル 無効 かつ レイトレース 有効
7. 透過: 反射 有効, 反射: フレネル 有効 かつ レイトレース 有効
8. 反射 有効 かつ レイトレース 無効
9. 透過: ガラス 有効, 反射: レイトレース 無効
10. 不可視面に影を投影
illum 2

**テクスチャマップ**
テクスチャマテリアルは上記と同じプロパティを使用しており、追加でテクスチャマップを定義している。以下は一般的なマテリアルファイルの例である。より多くの詳細は、完全なWavefrontファイル形式リファレンスを参照。
newmtl Textured
Ka 1.000 1.000 1.000
Kd 1.000 1.000 1.000
Ks 0.000 0.000 0.000
d 1.0
illum 2
# アンビエントテクスチャマップ
map_Ka lenna.tga

# ディフューズテクスチャマップ (多くの場合、アンビエントテクスチャマップと同じにされる)
map_Kd lenna.tga

# スペキュラカラーテクスチャマップ
map_Ks lenna.tga

# スペキュラハイライト成分
map_Ns lenna_spec.tga

# 透過度テクスチャマップ
map_d lenna_alpha.tga

# いくつかの実装は下の'bump'の代わりに'map_bump'を使用している
map_bump lenna_bump.tga
# バンプマップ (標準で画像の輝度値チャンネルを使用)
bump lenna_bump.tga

# ディスプレースメントマップ
disp lenna_disp.tga

# ステンシルデカールテクスチャ (標準で画像の'matte'チャンネルを使用)
decal lenna_stencil.tga
テクスチャマップ文はオプションパラメータを持つこともある ( full specを参照)。
# テクスチャ原点 (1,1,1) 
map_Ka -o 1 1 1 ambient.tga

# 球形反射マップ
refl -type sphere clouds.tga

**テクスチャオプション**
-blendu on | off                       # 水平テクスチャ混合を設定 (標準は on)
-blendv on | off                       # 垂直テクスチャ混合を設定 (標準は on)
-boost float_value                     # mip-mapのシャープさを押し上げ
-mm base_value gain_value              # テクスチャマップの値を変更 (標準は 0 1)
#     base_value = brightness, gain_value = contrast
-o u v w                           # 原点オフセット            (標準は 0 0 0)
-s u v w                           # スケール                  (標準は 1 1 1)
-t u v w                           # Turbulence                (標準は 0 0 0)
-texres resolution                     # 作成するテクスチャ解像度
-clamp on | off                        # 0から1の範囲でクランプされたテクセルのみレンダリング (標準は off)
#   クランプしない場合、テクスチャは面を横断して繰り返す。
#   クランプする場合、0から1の範囲中に置かれるテクセルのみレンダリングされる。
-bm mult_value                         # バンプ乗数 (バンプマップ専用)
-imfchan r | g | b | m | l | z         # スカラーまたはバンプテクスチャを作成するために
# どのファイルのチャンネルを使用するか指定。
# r:赤, g:緑, b:青, m:マット, l:輝度値, z:Z深度
# (バンプ用の標準は'l'であり、デカール用の標準は'm'である)
用:
-type sphere                           # "refl"反射マップのための球を指定
-type cube_top    
# キューブマップを使う際のそれぞれのテクスチャファイル
cube_front  
# キューブの側面は別々に指定する
cube_left   
cube_right

**ベンダー独自の改変**
ファイルの構文解析の容易さのため、またファイル形式が非標準で広まったために、ファイルはベンダー独自の改変を含んでいる可能性がある。
仕様によれば、オプションはテクスチャファイル名に先行することになっている。しかしながら、少なくとも一つのベンダーは、オプションを後ろに付加してファイル名を生成する。
# 0.2のバンプ乗数
bump texbump.tga -bm 0.2              

**物理ベースレンダリング**
オンライン3D編集及びモデリングツールの製作者であるClara.ioはMTL形式にphysically-based renderingのパラメータを表現する以下のパラメータを含めるよう拡張することを提案した:
Pr/map_Pr     # ラフネス
Pm/map_Pm     # メタリック
Ps/map_Ps     # Sheen
Pc            # クリアコートの厚さ
Pcr           # クリアコートのラフネス
Ke/map_Ke     # 放射
aniso         # 異方性
anisor        # 異方性の回転
norm          # 法線マップ、"bump"パラメータと同じ形式
更なる提案された拡張はMicrosoftのDirectXエンジンのためのDirectXMeshツールキットから来ている。これはモデルの事前コンパイルされたRMAマテリアルの定義を可能とする。
map_RMA       # RMAマテリアル (ラフネス、メタルネス、アンビエントオクルージョン)
map_ORM       # map_RMAの代替定義

**関連項目**
 GlTF- OFF (file format)- Standard Triangulated Language (STL)- PLY (ファイル形式) - ほとんどの光造形アプリケーションよりも柔軟性を提供する代替ファイル形式。

**出典**

**外部リンク**
 Appendix B1. Object Files (.obj), Advanced Visualizer Manual- Obj Specification as used by Wavefront- Mtl Specification- Tools, libraries and example files- FileFormat.Info: Wavefront OBJ File Format Summary