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

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 を使ってアニメーションをする際の選択肢になるのでは?と思います。