Wavefront .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の間で変化することができる。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 ...
  ...

ジオメトリ頂点

頂点 (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) は頂点リストを使って定義される。四角形のようなポリゴンは三つより多くの頂点/テクスチャ/法線インデックスを使うことで定義できる。
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 ....

テクスチャ座標インデックス無しの頂点法線インデックス

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

他のジオメトリ形式

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

マテリアル参照

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

相対および絶対インデックス

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

概要

3DCGにおいて、最も一般的なジオメトリ交換ファイル形式の一つは、OBJ形式である。MTLファイル形式は、一つ以上のOBJファイルに含まれるオブジェクトのシェーディング (マテリアル) 特性を記述するために必携のファイル形式である。.OBJファイルは一つ以上の.MTLファイル (これを「マテリアルライブラリ」と呼ぶ) を参照し、そこから、名前によって一つ以上のマテリアル記述を参照する。

序説

マテリアルテンプレートライブラリ形式 (MTL) は、Wavefront Technologiesにより定義された、コンピューターレンダリングの目的のための、フォン反射モデルに関する面の光反射特性を定義するASCIIファイルの標準である。この標準は、異なるコンピューターソフトウェアパッケージの間に広範なサポートがあり、便利なマテリアル交換形式となっている。
MTLファイルは一般的に、MTLファイルのマテリアルがマップされたジオメトリを定義するOBJファイルに付属し、そのファイルから参照される。
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     # 黒 (無効)
   Ns 10.000                # 0から1000の範囲
マテリアルは透過できる。これは「ディゾルブ」(dissolve) とも呼ばれる。本物の透過とは異なり、結果はオブジェクトの厚みに依存しない。
d 0.9                    # いくつかの実装は 'd' を使う。
   Tr 0.1                   # 他は 'Tr' (反転) を使う。
マテリアル毎に、複数の照明モデルが利用可能である。以下に列挙する:
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      # 透過度テクスチャマップ   map_bump lenna_bump.tga    # いくつかの実装は下の'bump'の代わりに'map_bump'を使用している   bump lenna_bump.tga        # バンプマップ (標準で画像の輝度値チャンネルを使用)
   disp lenna_disp.tga        # ディスプレースメントマップ   decal lenna_stencil.tga    # ステンシルデカールテクスチャ (標準で画像の'matte'チャンネルを使用)
テクスチャマップ文はオプションパラメータを持つこともある (full specを参照)。
   map_Ka -o 1 1 1 ambient.tga            # テクスチャ原点 (1,1,1) 
   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'である)
    bump -imfchan r bumpmap.tga            # bumpmap.tgaの赤チャンネルをバンプマップとして使うと宣言する。
反射マップ用:
    -type sphere                           # "refl"反射マップのための球を指定    -type cube_top    | cube_bottom |      # キューブマップを使う際のそれぞれのテクスチャファイル          cube_front  | cube_back   |      # キューブの側面は別々に指定する          cube_left   | cube_right

ベンダー独自の改変

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