メインコンテンツまでスキップ

MayaのUSDReferenceを理解する

今回は、Maya でアニメーション作業をしながら USD を扱う場合の手順について解説していきます。

全体の構造​

まず、USD の重要なポイントとして「USD はリグを持てない」というものがあります。
この「リグ」というのが何を指すかというと、内部で何かしらの計算をするようなもの全般を指していて
唯一スケルトンとウェイトなどは入っていますが、それ以外は基本的には入っていません。
なので、USD を使用してキャラクターアニメーションを扱う場合は
スケルトンにアニメーションをベイクするか、ジオメトリキャッシュを作成するかの 2 択になります。

ですが、USD を使う以上は非破壊かつプロシージャルな構築がしたいよね?ということで
Maya では Reference を使用した Maya と USD のワークフローが用意されています。

ので、順番に試していきます。

Reference する​

まず、何かしらセットアップ済のモデルが必要なので、

https://mox-motion.com/freerig/

今回は、MoxMotion 様のモモちゃん RIG で試してみます。(多分ほかのモデルであっても同様にできると思います)

まず、作成> UniversalSceneDescription で、UsdProxyShape を作成します。

作成したら、AnonymousLayer だとまずいのでまずレイヤーを保存します。

保存したら、ProxyShape に対して「Add New Prim」で XformPrim を作り
名前を「Root」とします。

作成するとこのようになります。

そして、この RootPrim を選択したうえで「Add Maya Reference...」を選びます。
ProxyShape に直接だと NG ですので、かならず Prim を作りましょう。

Add Maya Reference...でモモちゃん RIG の Maya シーンを選択します。

このように、キャラクターを読み込むことができました。

アウトライナーを確認すると、このようになっています。
なんかムズムズする感じは置いておいて、最初に作った「Prim」以下に
リグ付きのアニメーション用モデルが Maya リファレンスされているのがわかります。

※以降、紛らわしいので Maya 側のリファレンスは「Maya リファレンス」、
USD のコンポジションのリファレンスなら「リファレンス」と呼称します※

HyperGraph 上ではこのようになっています。
mayaUsdノードという特殊なノード以下に、リファレンスが読み込まれています。

これでアニメーション作業の準備ができました。

アニメーションする​

現在の状態は、しいて言うならば「Maya モード」と呼ばれる状況下にあります。
Maya モードなので、Maya の機能でリギングされたキャラクターは
Maya で扱うのとまったく同じ状態になっていて
これまでの Maya と同じ感覚でアニメーションをつけることができます。

凄く適当で申し訳ないですが、こんな感じでポーズを変更してみました。
ここまでだと特に変化はありません。

USD モード​

ここで、新しい要素が「USD モード(私が勝手に命名)」への切り替えです。
アニメーション作業までの段階では、
ProxyShape 以下にノードはあるものの、基本的には Maya のシーングラフです。

USD の世界のデータではないので、他のツール(Houdini 等)には持って行くことができません。

なので、このアニメーション用のシーンに対して USD の世界を作成します。

MayaReference の階層を選んで右クリックすると「Cache to USD...」というメニューがあるので
これを実行します。
これは、その名の通り 現在のキャラクターの Mesh や Skel を USD の世界にキャッシュ
してくれます。

実行すると、ファイルを保存する場所を聞かれるので
アニメーションの保存場所を指定します。
※ここで指定した場所に、アニメーションデータが出力されることになります※
今回は、ProxyShape を保存したフォルダに、 anim.usd という名前で保存しました。

保存するときには、USD キャッシュをどのように作成するか聞かれるので
アニメーションの場合は Animation タブ以下の Frame Range Start/End で
キャッシュしたいフレームを指定します。
デフォルトは 1Frame だけなので、アニメーションが出力されないので
必ず設定してください(私は忘れてはまりました)

キャッシュを作成すると、このように Maya のコントローラーが消えます。

UsdProxyShape を見ると、Maya のリファレンスは消えて USD のシーングラフになっているのがわかります。
Maya リファレンスは、このように無効化されています。

Maya モードと USD モード​

一度キャッシュを取ったらもう戻れないのか?というとそういうわけではありません。

Root ノード(Maya リファレンスを追加した Prim)を右クリックし、
Variant Set > Representation  と選んでいくと「Cache」と「MayaReference」が
選べるようになっています。

ここが、USD モードと Maya モードの切り替え場所で
Cache だと USD、MayaReference だと Maya モード扱いになります。

MayaReference に切り替えてみます。

切り替えると、Maya モードに戻りました。
これで、アニメーション作業を再開することができます。

他ツールとの連携​

上記の USD シーンを Houdini で読んでみます。
読むのは、UsdProxyShape で読んでいる base.usd です。

こちらも MayaReference と Cache のバリアントセットがあり
MayaReference では何もノードがありませんが「Cache」を選択すると

Houdini 側でもキャラクターアニメーションが Skel にベイクされた形で
出力されます。

構造を理解する​

最後に、どのような構造になっているか
USD シーンを確認してみます。

UsdProxyShape で読み込んでいる USD レイヤー(base.usd)を確認すると
このようになっています。
MayaUSD の機能として、MayaReference スキーマに mayaReference アトリビュートがあると
USD の世界を介して Maya のモデルをロードします。

そして、CacheToUSD で USD にキャッシュした場合は、キャッシュ(今回の anim.usd )
に対して、モデルのエクスポートとアニメーションのエクスポートを行います。
これを、VariantSet を Cache に切り替えるたびにキャッシュが行われ
結果、別ツールで見た場合は「USD のデータとして」アニメーションを
扱えるようになります。

Maya シーン側のアニメーションデータなどは、 従来の Maya リファレンスと同様です。

USD キャッシュ化時の動作は、MayaExport で USD を選択した時とおそらく同様の挙動ですが
今回の手順でリファレンスを作成した場合
USD 側に Maya のモデルとの依存関係を持つことになるので
Maya での作業と他ツールでの作業の一貫性を保つことができます。

また、Maya シーン内でライティングやレンダリングをしたい場合
Cache に切り替えたデータは USD の世界のデータ扱い(Maya ノードではない)
になるので、シームレスで USD でのオーサリングやライティングなどが可能になります。

個人的にはかなり怖い感じがしますが、
とはいえアニメーション作業をする環境も他にはないため、USD を使ってアニメーションをする際の選択肢になるのでは?と思います。