OBJ (または.OBJ)は、 Wavefront Technologies社がAdvanced Visualizerアニメーションパッケージ向けに開発したジオメトリ定義ファイル形式です。オープンなファイル形式であり、他の3Dコンピュータグラフィックスアプリケーションベンダーにも採用されています。
OBJファイル形式は、3Dジオメトリのみを表すシンプルなデータ形式です。具体的には、各頂点の位置、各テクスチャ座標頂点のUV座標、頂点法線、および頂点のリストとテクスチャ頂点として定義される各ポリゴンを構成する面が含まれます。頂点はデフォルトで反時計回りの順序で格納されるため、面法線を明示的に宣言する必要はありません。OBJ座標には単位はありませんが、OBJファイルには人間が読みやすいコメント行でスケール情報を含めることができます。
ハッシュ記号(#)の後に続くものはすべてコメントです。
# これはコメントです。
OBJファイルには、頂点データ、自由曲面/曲面の属性、要素、自由曲面/曲面のボディステートメント、自由曲面間の接続性、グループ化、表示/レンダリング属性情報が含まれる場合があります。最も一般的な要素は、幾何学的頂点、テクスチャ座標、頂点法線、および多角形面です。
# 幾何学的頂点のリスト。(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 副社長... ... # 多角形面要素(下記参照) f 1 2 3 f 3/1 4/2 5/3 f 6/4/1 3/5/3 7/6/5 f 7//1 8//2 9//3 f ... ... # 線要素(下記参照) l 5 8 1 2 4 9
頂点は、文字で始まる行によって指定されますv。その後に (x,y,z[,w]) 座標が続きます。W はオプションで、デフォルト値は 1.0 です。W は点のスケールです。点 (x,y,z,w) は点 (x/w,y/w,z/w) に対応します。座標位置を指定するには、右手座標系が使用されます。一部のアプリケーションでは、xy と z の後に赤、緑、青の値を指定することで頂点の色をサポートしています (この場合、w を指定することはできません)。色の値は 0 から 1 の範囲です。[ 2 ]
自由形状のジオメトリステートメントは、文字列 で始まる行で指定できますvp。曲線または曲面のパラメータ空間に点を定義します。u曲線点には のみが必要で、曲面点uおよびv非有理トリミング曲線の制御点には 、有理トリミング曲線の制御点には 、uおよび(重み) がv必要です。w
面は、頂点インデックス、テクスチャインデックス、法線インデックスのリストを使用して定義されます。形式は vertex_index/texture_index/normal_index で、各インデックスは 1 から始まり、参照される要素が定義された順序に応じて増加します。四角形などのポリゴンは、3 つ以上のインデックスを使用して定義できます。
OBJファイルは、 NURBS曲面のように曲線や曲面を用いてオブジェクトを定義する自由形状ジオメトリもサポートしています。
有効な頂点インデックスは、事前に定義された頂点リストの対応する頂点要素と一致します。インデックスが正の値の場合、それは頂点リスト内のオフセットを指し、1から始まります。インデックスが負の値の場合、それは頂点リストの末尾を相対的に指し、-1は最後の要素を指します。
各面は3つ以上の頂点を持つことができる。
f v1 v2 v3 ...
オプションとして、テクスチャ座標インデックスを使用して、面を定義する際にテクスチャ座標を指定できます。面を定義する際に、頂点インデックスにテクスチャ座標インデックスを追加するには、頂点インデックスの直後にスラッシュを付け、その直後にテクスチャ座標インデックスを記述します。スラッシュの前後にスペースを入れることはできません。有効なテクスチャ座標インデックスは1から始まり、事前に定義されたテクスチャ座標リスト内の対応する要素と一致します。各面には3つ以上の要素を含めることができます。
f v1/vt1 v2/vt2 v3/vt3 ...
オプションとして、面を定義する際に、法線インデックスを使用して頂点の法線ベクトルを指定できます。面を定義する際に頂点インデックスに法線インデックスを追加するには、テクスチャ座標インデックスの後に2つ目のスラッシュを付け、その下に法線インデックスを記述します。有効な法線インデックスは1から始まり、事前に定義された法線リスト内の対応する要素と一致します。各面には3つ以上の要素を含めることができます。
f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...
テクスチャ座標はオプションなので、テクスチャ座標なしでジオメトリを定義することもできますが、頂点インデックスの後に法線インデックスを記述する前に、スラッシュを2つ記述する必要があります。
f v1//vn1 v2//vn2 v3//vn3 ...文字「l」(小文字のl)で始まるレコードは、ポリラインを構成する頂点の順序を指定します。
l v1 v2 v3 v4 v5 v6 ...
OBJファイルは、テイラーやBスプラインなどのさまざまな補間方法を使用して高次の曲面をサポートしていますが[ 3 ]、サードパーティのファイルリーダーでこれらの機能がサポートされているわけではありません。OBJファイルは、メッシュ階層や、頂点スキニングやメッシュモーフィングなどのアニメーションや変形もサポートしていません。
ポリゴンの視覚的な側面を記述するマテリアルは、外部の.mtlファイルに格納されます。OBJファイル内からは、複数の外部MTLマテリアルファイルを参照できます。.mtlファイルには、1つ以上の名前付きマテリアル定義を含めることができます。
mtllib [外部.mtlファイル名] ...
このタグは、その後に続く要素のマテリアル名を指定します。マテリアル名は、外部の.mtlファイル内の名前付きマテリアル定義と一致します。
usemtl [マテリアル名] ...
名前付きオブジェクトとポリゴングループは、以下のタグを使用して指定します。
o [オブジェクト名] ... g [グループ名] ...
ポリゴン全体にわたる滑らかなシェーディングは、スムージンググループによって実現されます。
s 1 ... # スムーズシェーディングも無効にできます。 オフ ...
OBJファイルはリスト構造のため、頂点や法線などを絶対位置(1は最初に定義された頂点、NはN番目に定義された頂点を表す)または相対位置(-1は最後に定義された頂点を表す)のいずれかで参照できます。しかし、すべてのソフトウェアが後者の方法をサポートしているわけではなく、逆に一部のソフトウェアは(頂点オフセットなどを再計算することなく要素を追加できるという利便性から)本質的に後者の形式のみを書き込むため、時折互換性の問題が発生することがあります。
マテリアルテンプレートライブラリ形式(MTL)または.MTLファイル形式は、 Wavefront Technologiesによって定義された.OBJの補助ファイル形式で、1つ以上の.OBJファイル内のオブジェクトの表面シェーディング(マテリアル)特性を記述します。.OBJファイルは1つ以上の.MTLファイル(「マテリアルライブラリ」と呼ばれます)を参照し、そこから名前で1つ以上のマテリアル記述を参照します。.MTLファイルはASCIIテキストで、コンピュータレンダリングの目的で、 Phong反射モデルに従って表面の光反射特性を定義します。この規格はさまざまなコンピュータソフトウェアパッケージで広くサポートされているため、マテリアルの交換に便利な形式となっています。
MTLフォーマットは依然として広く使用されていますが、時代遅れであり、スペキュラーマップやパララックスマップといった最新技術を完全にはサポートしていません。しかし、このフォーマットはオープンで直感的な性質を持っているため、カスタムMTLファイルジェネレーターを使用すれば、これらの機能を簡単に追加できます。
MTLフォーマットは、いくつかのフォーマットを定義しています。[ 6 ] [ 7 ]
1つの.mtlファイルで複数のマテリアルを定義できます。マテリアルはファイル内で順番に定義され、それぞれ次のnewmtlコマンドで始まります。
# 'Colored' という名前のマテリアルを定義します ニュームトルカラー
マテリアルの環境色は を使用して宣言されます。色の定義は RGB で、各チャンネルの値は 0 から 1 の間です。Ka
# 白 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の範囲 10,000 ネパール
マテリアルは透明にすることができます。これは「溶解」と呼ばれます。実際の透明とは異なり、結果はオブジェクトの厚さに依存しません。「d」(溶解)の値が1.0の場合がデフォルト値で、完全に不透明であることを意味します。「Tr」の値が0.0の場合も同様です。溶解はすべての照明モデルで機能します。
# 一部の実装では「d」を使用します d 0.9 # その他は「Tr」を使用する(反転:Tr = 1 - d) Tr 0.1
透明な素材には、透過フィルターカラーを追加で指定することができ、これは「Tf」で表されます。
# 透過フィルターの色(RGBを使用) Tf 1.0 0.5 0.5 # 透過フィルターの色 (CIEXYZ を使用) - y と z の値はオプションであり、省略した場合は x と等しいとみなされます Tf xyz 1.0 0.5 0.5 # スペクトル曲線ファイルからの透過フィルターの色(あまり一般的ではありません) Tfスペクトル<ファイル名>.rfl<オプションの係数>
物質の表面には光学的密度が存在する。これは屈折率とも呼ばれる。
# 光学密度 Ni 1.45000
値の範囲は0.001から10までです。1.0の値は、光が物体を通過する際に屈折しないことを意味します。光学的密度を上げると、屈折量が増加します。ガラスの屈折率は約1.5です。1.0未満の値は奇妙な結果を生み出すため、推奨されません。[ 8 ]
マテリアルごとに複数の照明モデルが用意されています。「d」または「Tr」で透明度を実現するために透明な照明モデルを設定する必要はありません。また、最近の使用法では、透明なマテリアルであっても照明モデルを指定しないこともよくあります。照明モデルは以下のとおりです。
0. カラー照明オン、アンビエント照明オフ 1. カラー照明とアンビエント照明をオンにする 2. 強調表示 3. 反射と光線追跡 4. 透明度: ガラスオン、反射: 光線追跡オン 5. 反射:フレネルオン、レイトレーシングオン 6. 透明度:屈折オン、反射:フレネルオフ、光線追跡オン 7. 透明度:屈折オン、反射:フレネルオン、光線追跡オン 8. 反射と光線追跡 9. 透明度:ガラスオン、反射:光線追跡オフ 10. 見えない表面に影を落とす
イルム2
テクスチャ付きマテリアルは、上記と同じプロパティを使用するだけでなく、テクスチャマップも定義します。以下に、一般的なマテリアルファイルの例を示します。詳細については、Wavefrontファイル形式の完全なリファレンスを参照してください。
新しいテクスチャ Ka 1.000 1.000 1.000 Kd 1.000 1.000 1.000 Ks 0.000 0.000 0.000 d 1.0 イルム2 # アンビエントテクスチャマップ map_Ka キツネザル.tga # ディフューズテクスチャマップ(ほとんどの場合、 # アンビエントテクスチャマップ) map_Kd lemur.tga # スペキュラーカラーテクスチャマップ map_Ks キツネザル.tga # 鏡面反射ハイライトコンポーネント map_Ns lemur_spec.tga # アルファテクスチャマップ map_d lemur_alpha.tga # 一部の実装では、以下で「bump」の代わりに「map_bump」を使用しています map_bump lemur_bump.tga # バンプマップ(デフォルトでは画像の輝度チャンネルを使用) bump lemur_bump.tga # 変位マップ disp lemur_disp.tga # ステンシルデカールのテクスチャ(デフォルトは画像の「マット」チャンネル) デカール lemur_stencil.tga
テクスチャマップのステートメントには、オプションパラメータを含めることもできます(詳細な仕様を参照してください)。
# テクスチャ原点 (1,1,1) map_Ka -o 1 1 1 ambient.tga # 球面反射マップ refl -type sphere clouds.tga
-blendu on | off # 水平方向のテクスチャブレンドを設定します(デフォルトはオン) -blendv on | off # 垂直方向のテクスチャブレンドを設定します(デフォルトはオン) -boost float_value # ミップマップの鮮明度をブースト -mm base_value gain_value # テクスチャマップの値を変更します(デフォルトは0 1) # base_value = 明るさ、gain_value = コントラスト -ou [v [w]] # 原点オフセット (デフォルト 0 0 0) -su [v [w]] # スケール (デフォルト 1 1 1) -tu [v [w]] # 乱流 (デフォルト 0 0 0) -texres resolution # 作成するテクスチャ解像度 -clamp on | off # 0~1の範囲でクランプされたテクセルのみをレンダリングします(デフォルトはオフ) # クランプを解除すると、表面全体にテクスチャが繰り返されます。 # クランプされた場合、0-1の範囲内のテクセルのみ # 範囲がレンダリングされます。 -bm mult_value # バンプ乗数(バンプマップのみ) -imfchan r | g | b | m | l | z # ファイルのどのチャネルを使用するかを指定します # スカラーまたはバンプテクスチャを作成します。 r:赤、g:緑、 # b:青、m:マット、l:輝度、z:z深度。 # (バンプのデフォルト値は「l」、デカールのデフォルト値は「m」です)
例えば、
# bumpmap.tga の赤チャンネルをバンプマップとして使用するように指示しています bump -imfchan r bumpmap.tga
反射マップの場合…
-type sphere # "refl"反射マップ用の球体を指定します -type cube_top | cube_bottom | # キューブマップを使用する場合、各キューブのテクスチャファイル cube_front | cube_back | # 立方体の側面は別々に指定されます キューブ左 | キューブ右
ファイルの解析が容易であること、およびファイル形式が非公式に普及していることから、ファイルにはベンダー固有の変更が含まれている可能性がある。
仕様によると、オプションはテクスチャファイル名の前に記述することになっている。しかし、少なくとも1つのベンダーは、オプションをファイル名の末尾に記述したファイルを生成している。
# バンプ乗数0.2 bump texbump.tga -bm 0.2
オンライン3D編集およびモデリングツールであるClara.ioの開発者は、物理ベースレンダリング(PBR)マップとパラメータを指定できるようにMTLフォーマットを拡張することを提案しました。この拡張はその後BlenderとTinyObjLoaderに採用されました。拡張PBRマップとパラメータは次のとおりです。[ 9 ]
Pr/map_Pr # 粗さ Pm/map_Pm # メタリック Ps/map_Ps # 光沢 PC # クリアコートの厚さ PCR # クリアコートの粗さ Ke/map_Ke # 発光 異方性 # 異方性 アニソール # 異方性回転 法線 # 法線マップ(RGB成分は表面法線のXYZ成分を表す)
さらに提案されている拡張機能は、 MicrosoftのDirectXエンジン用の DirectXMesh ツールキットから来ており、モデルのプリコンパイル済み RMA マテリアルを定義する機能を可能にします。[ 10 ]
map_RMA # RMAマテリアル(粗さ、金属感、アンビエントオクルージョン) map_ORM # map_RMAの代替定義