2011年11月6日日曜日

OBJ形式


modoはネイティブのシーンフォーマットであるLXO形式以外に幾つかの外部フォーマットをサポートしています。OBJ形式は、モデルデータを入出力するためのファイル形式でさまざまな3DCGソフトウェアでサポートされています。このフォーマットは、Wavefront社のThe Advanced Visualizerでモデルデータを定義するファイルフォーマットで、そのほかにもバイナリー形式の(.mod)やシーンデータを記述する(.pv)などがありましたが、モデルデータをテキスト形式で記述する(.obj)だけがモデルデータの中間フォーマットとして現在でも幅広く使用されています。ちなみにWavefront社は、1995年にシリコングラフィクス社にカナダのAlias Research社と共に買収され、当時次世代ソフトウェアとして開発中だったサイクロンプロジェクトは現在のAutodesk社のMayaの開発に引き継がれていったのを記憶しています。



OBJ形式が現在でも広く中間フォーマットとして利用されている理由を考察してみました。

  • テキスト形式であり簡単に読み書きするためのパーサーが作れる。
  • 多角形を取り扱うことができる。
  • テクスチャのUV座標値、頂点法線ベクトルが記述できる。
  • その他、グループ、マテリアルの指定などが可能。


実は、OBJ形式はThe Advanced Visualizer 3.0から、シンタックスが拡張されBezierやB-Splineカーブ、Nurbsパッチまでも記述できるようになっていますが、拡張されたシンタックスをサポートしているソフトウェアは多くないため、あまり使用されていないようです。

下記は、立方体を記述しているOBJファイルの例です。OBJの詳しい仕様に関してはwikiなどのサイトで公開されています。
o Mesh
v -0.5 -0.5 -0.5
v 0.5 -0.5 -0.5
v 0.5 -0.5 0.5
v -0.5 -0.5 0.5
v -0.5 0.5 -0.5
v 0.5 0.5 -0.5
v 0.5 0.5 0.5
v -0.5 0.5 0.5
vn 0 -1 0
vn 0 0 -1
vn 1 0 0
vn 0 0 1
vn -1 0 0
vn 0 1 0
vt 0.25 0
vt 0.5 0
vt 0.5 0.333333
vt 0.25 0.333333
vt 1 0.666667
vt 0.75 0.666667
vt 0.75 0.333333
vt 1 0.333333
vt 0.5 0.666667
vt 0.25 0.666667
vt 0 0.666667
vt 0 0.333333
vt 0.25 1
vt 0.5 1
mtllib cube.mtl
usemtl Default
g Default
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/2 6/6/2 2/7/2 1/8/2
f 6/6/3 7/9/3 3/3/3 2/7/3
f 7/9/4 8/10/4 4/4/4 3/3/4
f 8/10/5 5/11/5 1/12/5 4/4/5
f 5/13/6 8/10/6 7/9/6 6/14/6


"o Mesh"は、オブジェクトの名称を定義する行です。この行は省略されている場合もありますが、定義しておくとモデル名称を指定することができます。

"v -0.5 -0.5 -0.5"は、頂点の座標値を表しています。ソフトウェアによってデフォルトの単位系は異なりますので、読み込み時に変換されるか、読み込んだ後にスケールなどで調整する事になります。vで指定された頂点は、出現順に連番が付けられます。

"vn 0 -1 0"は、頂点の法線ベクトルを記述しています。法線ベクトルは長さ1.0に正規化されていることが前提になっています。法線ベクトルの指定はオプションであり、省略可能です。

"vt 0.25 0"は、テクスチャのUV座標値を指定しています。テクスチャ座標値もオプションであり、省略可能です。

"mtllib cube.mtl"は、マテリアルライブラリのファイル名称を記述しています。OBJではマテリアルは外部ファイル(.mtl)で別に記述し、そのファイルに記述されているマテリアルをOBJの中で参照します。本家のThe Advanced Visualizerでは、マテリアルライブラリのファイルの場所は、WF_MTL_DIR環境変数で指定されていましたが、ファイル名称のみを記述し、(.obj)ファイルと同じフォルダに置いておくのが一般的なようです。下記は、cube.mtlファイルの一例です。newmtl指定子でマテリアルの名称を指定し、その後にディフューズなどマテリアル属性を記述しています。

newmtl Default
Kd 0.8 0.8 0.8
Ns 256
d 1
illum 2
Ka 0 0 0
Ks 0.2 0.2 0.2

"usemtl Default"で、以下に定義するポリゴンでどのマテリアルを使用するかを記述しています。以下に出現するポリゴンは、Defaultというcube.mtlに記述されているマテリアルが適応されます。

"g Default"は、グループを指定しています。これはちょうどmodoのパート名称のポリゴンタグと一致します。

"f 1/1/1 2/2/1 3/3/1 4/4/1"は、四角形の面ポリゴンを記述しています。前述した頂点、法線ベクトル、テクスチャ座標値は出現順に1から番号が付けられ、3つのインデックスの対としてポリゴン頂点が記述されています。2/2/1は、第2頂点、第2法線ベクトル、第1テクスチャ座標を指定していることを意味しています。法線ベクトルを省略する場合は"2//1"、テクスチャ座標を省略する場合は"2/2"、両方を省略する場合は"2"のように記述します。テクスチャ座標値は、1つしか記述することができません。

次にmodoがOBJフォーマットをどのようにサポートしているかを解説したいと思います。modoのOBJ入出力は、SDKを使用したプラグインとして実装されており、LXSDKにはobjioフォルダにサンプルコードとして全ソースコードが公開されています。入出力に関する詳細や仕様のカスタマイズが必要な場合はこのSDKのサンプルコードが役に立ちます。

下記はmodoのobjioでサポートされているOBJファイルの命令です。

v   頂点座標値
vt   テクスチャ座標値
vn   法線ベクトル
o   オブジェクト名称
g   グループ
f   面ポリゴン
usemtl マテリアル名称
mtllib マテリアルライブラリ

頂点座標値は、メッシュアイテムの頂点座標が出力されます。もし、モーフマップが頂点マップリストで選択されていた場合は、基本の頂点座標にモーフマップの値が適用された座標値が出力されます。座標系はアイテムの座標系が付加されたグローバル座標系です。

modoでは、複数のUVテクスチャを頂点マップとして持つことができますが、OBJでは一組のUVマップだけしか持つことができません。OBJで出力するUVマップは現在頂点マップリストで選択されているマップのテクスチャ座標値が出力されます。

modoでは、法線ベクトルは面法線ベクトルとスムージング角度を元に頂点の法線ベクトルが計算されます。OBJにはこの計算された法線ベクトルが出力されます。また、OBJファイルに記述されている法線ベクトルは法線ベクトルマップとしてmodoには読み込まれます。この法線マップは読み込んだメッシュを後で編集する場合には事前に削除しておくことをおすすめします。modoは法線ベクトルが存在する場合は、動的に法線ベクトルを計算せずに法線マップのベクトルを優先して使用します。

オブジェクトの名称を指定する"o"は、modoではメッシュアイテムの名称として使用されます。シーン上に複数のメッシュアイテムが存在する場合は、現在選択されているメッシュアイテムが一つのファイルにまとめて出力され、"o"命令によって新しいメッシュが分離されて出力されます。modoにこのOBJファイルを読み込んだ場合は、メッシュアイテムはこの"o"命令を元に復元されますが、アイテムの座標値はリセットされてしまいます。

o Cube1
v -0.5 -0.5 -0.5
v 0.5 -0.5 -0.5
  :
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/2 6/6/2 2/7/2 1/8/2
o Cube2
v 1.5 -0.5 -0.5
v 2.5 -0.5 -0.5
  :
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/2 6/6/2 2/7/2 1/8/2

modoには、ポリゴンタグというポリゴンをグループ化するためのデータがあります。modoのパート、マテリアルは、それぞれOBJの"g"、"usemtl"に対応します。

modoの面ポリゴン、サブディビジョンサーフェイス、Catmull-Clarkサーフェイスは全て"f"命令で面ポリゴンとして出力されます。

マテリアルに関しては下記の属性がサポートされています。括弧の名称はmodoでの対応するマテリアル属性です。

Ka   アンビエント(ルミナンスの色)
Kd   ディフューズ(ディフューズの色)
Ks   スペキュラー(スペキュラーの色)
d   ディゾルブ(1.0 - 透過量)
Ns   スペキュラー係数(スペキュラー量)
map_Kd ディフューズマップ(ディフューズの画像マップ)
map_refl   リフレクションマップ(リフレクションの画像マップ)
map_Bump バンプマップ(バンプの画像マップ)
map_D ディゾルブテクスチャ(透過の画像マップ)
map_Ks スペキュラーテクスチャ(スペキュラーの画像マップ)
map_Ka アンビエントテクスチャ(ルミナンスの画像マップ)

その他、modoの初期設定には、OBJファイル入出力に関するオプションが幾つか用意されています。”メッシュをグループとして出力”を指定した場合は、メッシュアイテムは"o"命令を使って別々にオブジェクトとして出力されずに"g"命令を使ってグループとして指定しれます。また、”スタティックメッシュとして入力”を指定すると読み込まれたポリゴンはメッシュアイテムではなくスタティックメッシュとして読み込まれます。



0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。