チュートリアル / 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
第69回:Maya のシーンフォーマットを知ろう!
- Maya
- ゲーム
- コラム
- チュートリアル
- 学生・初心者
- 教育
- 映画・TV
「三日坊主」というのは三日で飽きてしまうということですので、せめて四回はAPI周りの小難しい話をしたかったのですが、なんとなく反応の薄さを背中から感じた気がしたので、今回は別のMaya話にしたいと思います:P
四回目はそのうちやるということで…。
Mayaには専用のファイルフォーマットがあります。Maya ASCIIとMaya Binaryです。それぞれの違いについて、また実際に仕事で使う上でのテクニックについても解説したいと思います。Mayaを使っているとよく使うフォーマットとしてFBXがあります。それとちょくちょく使用するOBJ形式というものもありますので、合わせて後ほど説明してきます。
ファイルフォーマットの違いを理解するとMayaをより快適に使えますし、FBXやOBJを理解すると他のソフトとの連携も行いやすくなりますので、3DCGアーティストとしてのスキルもアップも間違い無しです!
Mayaのシーンファイルの中身ってなに?
Maya ASCIIとMaya Binaryは、その名前の通りアスキーファイル(テキストファイルで開けて読める文字列)とバイナリファイル(人が読めない謎のデータ。読める超人もいる)で保存されています。中身はどちらも同じようなものです。
Mayaはプロ用途の3DCGソフトですので扱うデータや仕組みがとっても複雑そうで、シーンファイルの中身もややこしそうですが…実はすごくシンプルです。
複雑そうに見えるシーンでも、よくよく見てみるとシーンの中で重要な情報は次の3つだけです。
・ノード(いわゆるオブジェクト、メッシュ、作業履歴とか)
・アトリビュート(設定している値)
・コネクション(ノード同士の接続。テクスチャをマテリアルのカラーにつなげるなど)
Mayaのファイルにはこれらが上記の順で書かれています。
シーンを開くときは順に実行していきます。
つまり、Mayaでいろいろ作業した結果をもっともシンプルなコマンドに置き換えたものがMayaのシーンファイルです。
この発想はとても面白く、しかも重要です。
たとえば次の操作をしてモデルを作るとします。
1. 球を作る。
2. フェースを削除する。
3. フェースを押し出す。
4. 保存する。
5. 履歴を削除する。
6. 保存する。
4の時に保存したシーンには「球を作る(polySphere)」「フェースを削除する(deleteComponent)」「フェースを押し出す(polyExtrudeFace)」のそれぞれの履歴がノード・アトリビュート・コネクションとして保存されます。
GUIを使って行った作業が、ファイルにはcreateNode, setAttr, connectAttrといったコマンドに全て変換されるということです。maファイルでは実際に次の図のように記述されます。
6の時に保存したシーンには作業履歴がないため、データとしてシーン内にあるのはメッシュのデータだけです。ファイルにはメッシュの頂点の位置やUV情報が保存されます。
保存したmaファイルを見てみると、createNode meshの後にメッシュの情報がsetAttrされていることがわかります。履歴を保存していた4のファイルと比べると、頂点の情報を全て記録する必要があるため、通常はファイルサイズが大きくなります。
こんな感じですので、Mayaのシーンファイルの中身はMELスクリプトと同じです。もしMayaのGUIを使わず、自分でテキストエディタを使ってcreateNodeなど組み合わせてシーンを記述し、melではなくmaとして保存すればどうなるでしょうか?
実はMayaでシーンファルとして開くことが出来ます。たとえば「createNode mesh;」と書いて.maという拡張子にして保存してMayaで開くと、いくつかエラーが出るものの、シーン内にメッシュが作られます。
(逆にMaya ASCIIをスクリプトエディタで実行してシーンを復元することも可能です。この場合はいくつか取り除いておかないといけないコマンドがあります。Mayaがシーンを開くときは、MELを実行しているようなものですが、厳密にはMELを実行するときと異なり、スペシャルなモードで実行されます。)
まるでアーティストはGUIを介してプログラムをしているみたいですよね!グラフィカルなプログラミングをものすごくアーティストよりにしたような感じで、二十年以上前に作られたとは思えない面白い発想です。
この特性を理解すると、Mayaのシーンファイルに自分でスクリプトを追加すれば、シーンを開いたときに好きなコマンドを追加で実行できることに気付くと思います。
createNodeなどシーンを加工するコマンドなら、次にシーンを保存するときにも保存されます。(書いたものがそのまま保存されるのではなく、Mayaに解釈し直されて保存されます。)
printなどあらゆるMELコマンドが使用可能です。printはシーンを加工するわけではないので、次に保存する時にその行は消えてしまいます。
でも使い方はいろいろ考えられ、たとえばMaya ASCIIファイルを直に加工した時、それが分かる目印として、maファイル内に「print “このシーンは直に加工されています\n”;」と書いておけば、シーンを開いたときにユーザに加工されたという情報を出すことが出来ます。
次の例では、アーティストをビビらせるのに十分な効果を得られるであろう呪いを、シーンファイルに吹き込みます…。
開くと、そういうメッセージがScript Editorに表示されます。でもシーンを保存して開き直しても、二度とメッセージは出て来ません。
ファイルにバージョンがある?上位下位互換性は?
Maya ASCIIで保存してテキストエディタで開くと、始めに次のコマンドを確認できます。
requires maya "2017ff04";
requiresコマンドは、このシーンファイルでMayaもしくはプラグインのどのバージョンが使われているかを示すものです。
このコマンドが無くても実はシーンは再構築可能ですが、作成時のバージョンを記録しておくことでデータとプログラムの不一致を防げます。
(Ignore Versionという機能がありますが、あれはコレを無視するようになります。自分でrequiresの行を削除してからシーンを開くのも同じことです。昔のMayaユーザは皆そうしてましたし。)
ファイル自体にはMELのコマンドが書かれているだけですので、特にはどのMayaのバージョンに対応するということもなく、コマンドが実行できればシーンを開くことが出来ます。
ですので、実はシーンファイルにバージョンというものはありません。
(ただしMaya Binaryについてはバイナリのフォーマットの種類が関わってくるため、読めなくなる事があります。たとえばMaya2014以降ではバイナリフォーマットが変更されているため、それ以前のMayaで直接開けません。「http://tech.autodesk.jp/faq/faq/adsk_result_dd.asp?QA_ID=8062」)
つまり新しいMayaで作ったシーンを昔のMayaで開くときは、昔のMayaにもあったコマンドで作っている限りは読み込み可能です。
時々悪さをするコマンド、アトリビュートがありますので、それは事前に取り除いておく必要があります。
たとえばMaya2013でmeshノードに追加された-ch(capacityHint)の記述があると、Maya2012以前で開けなくなりますので、事前に取り除いておく必要があります。
Maya2016以降で採用されているノードのUUIDも、それ以前のMayaで開くときに問題を起こすことがありますので、必要に応じて取り除く必要があります。
ちなみにMayaのファイルバージョンは、「about -file」と実行することで確認できます。
上位互換性はありますが、コマンドを実行しているだけですので、Mayaのバージョンを大きく飛び越える場合、たとえばMaya2008のファイルをMaya2017で開こうとすると、場合によっては問題が起きる事があります。コマンドを実行した内容が、2008と2017で全く同じなら問題ありません。普通はなるべく同じ動作をするようにしていますが、アトリビュートの値を変えなければいけない様なときは、Mayaが感知できずにデータがおかしくなる事があります。なるべく1バージョンずつ上げていくのが良いです。
下位互換性は基本的にありませんが、新しいMayaのコマンドを古いMayaのコマンドで実行しても、無視されるだけなので問題ないことが多いです。
まとめ
今回はMayaのファイルフォーマット全般について紹介しました。
ややこしいソフトの割にはすごくわかりやすいファイルフォーマットですので、ユーザのアイディア次第で様々な運用が可能です。シーンファイルを直接加工しても、何かミスっていれば開くときにエラーが出るだけでMayaが落ちるということも特には無いので、Mayaのバッチコーイ精神が垣間見れます:)
ファイルフォーマットを正確に理解することで、問題が起きた時の対処方法を見つけやすくなりますし、原因箇所を取り除けばシーンは復帰します。
作業を滞りなく進めるためにはぜひ身につけておきたい知識です。
次回はもっと細かく、Maya ASCIIとBinaryそれぞれについて特徴や使い分け方を紹介していきます。