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"命令を使ってグループとして指定しれます。また、”スタティックメッシュとして入力”を指定すると読み込まれたポリゴンはメッシュアイテムではなくスタティックメッシュとして読み込まれます。



2011年11月2日水曜日

グラフ編集とバッチレンダリング

第4回勉強会での日比さんのセッションの後で、マテリアルなどの設定値をテスト的に設定したレンダリング結果をまとめて作成し、後で比較したいという質問があったと記憶しています。このブログでこの件に関して少し補足させていただきます。

modoではマテリアルなどさまざまな属性を時系列的に変更させるための機能が搭載されています。この機能を使ってアニメーションでレンダリングを行えばフレームごとに別々のレンダリング結果を得ることが可能です。アニメーション機能は静止画のレンダリングには関係ないと思われている方がいらっしゃるようですが、静止画の制作においてもmodoのアニメーションは有効な手法です。

シェーダツリーの各属性の値のフィールドには丸いボタンのようなアイコンが付加されています。このボタンの上で右マウスボタンを押すとコンテキストメニューが表示されますので、ここからグラフ編集を選択すると各アニメーションフレームでその属性の値をどのように設定するかを設定するグラフ編集画面が表示されます。この画面でフレームにキーフレームを作成し、各フレームでの値を変化させることが可能です。時系列で変化させることができる属性はディフューズなどのマテリアル属性だけでなく、大域照明の様々な設定値もありますので、いろいろな値をフレームごとに変えてアニメーションレンダリングすれば、連番ごとに異なるレンダリング結果を得ることが可能になります。




また、それでも別々のシーンを作成してまとめてレンダリングを行い、後から結果を比較したい場合には、バッチレンダリングという選択肢もあります。Fredrik Stenson氏のサイトには、複数のシーンをまとめてmodoに読み込んだ後で、まとめてレンダリングを行うためのスクリプトBatchRenderが公開されています。まず、BatchRenderをダウンロードし、圧縮ファイルを解凍すると、fs_BatchRender_scriptというフォルダが現れますので、これを付属のhow_to_use.rtfのドキュメントにしたがい、modoのユーザーフォルダにコピーします。fs_BatchRender_scriptはScriptsフォルダに、Form_ScriptsContainer.CFGは、Configsフォルダにそれぞれコピーします。ユーザーごとのフォルダの場所は下記の通りです。

OS X:
<user name>/Library/Application Support/Luxology/Configs
<user name>/Library/Application Support/Luxology/Scripts

Win XP:
C:\Documents and Settings\<user name>\Application Data\Luxology\Configs
C:\Documents and Settings\<user name>\Application Data\Luxology\Scripts

Win Vista:
C:\Users\<user name>\AppData\Roaming\Luxology\Configs
C:\Users\<user name>\AppData\Roaming\Luxology\Scripts

Win 7:
C:\Users\<user name>\AppData\Roaming\Luxology\Configs
C:\Users\<user name>\AppData\Roaming\Luxology\Scripts

上記をインストールした後、modoを起動するとシステムメニューにScriptsメニューが表示されます。




使い方は非常に簡単です。まず、レンダリングしたいシーンを片っ端からmodoに読み込み、上記のメニューからBatch Renderを起動します。すると、各シーンごとにレンダリングで保存する画像ファイルの名称と形式をしていするダイアログが表示されますので、全てのシーンに対して保存画像の指定を行うとレンダリングが開始されます。


また、Fredrik Stenson氏のサイトには、その他にも便利なツールが沢山用意されています。AfterFxIOは、AfterEffectにキーフレーム情報を入出力するためのツールで、modo 501のカメラ情報をAfterEffectに取り込むことが可能になります。modoは、Render OutputでZバッファの値や様々なレンダリングレイヤーを個別に出力することももちろん可能です。


AfterFxIO from Fredrik Stenson on Vimeo.