🔆

Maya/Houdiniで実践的なUSDワークフローを試したい

2024/12/12に公開

Advent Calendar 2024 12/12の記事です。

USDを使った実践的なプロダクション向け資料はないかと探していたところ、AYONのドキュメントの中にそれらしきもの(↓)がありましたので、読みながら手を動かしてみたいと思います。

概要

AYON USD Book
https://ayon.ynput.io/docs/category/usd/

開発元YnputのYoutubeチャンネルに 「OpenUSD in Small Studios」 という講演動画も上がっており、上記ドキュメントはこの講演の少し後くらいにまとめられたもののようです。

https://youtu.be/1KqrIRCi_EQ

ここで事例としてワークフローを実践したのはオランダのアニメーションスタジオ Colorbleed 社で、AYONパイプラインのUSD関連は同社のCTOでもあるRoy Nieterau a.k.a. BigRoyさんががっつり取り組んでおられるようです。

https://github.com/BigRoy

https://ayon.ynput.io

TL;DR

……と、この記事はドキュメントのワークフローを通しながら勉強させてもらおうみたいな気分で始めたのですが、
上記AYON USD Bookは(ほかのUSDドキュメントでもまれによくあるように)本稿時点ではTODO箇所がかなりあり、ワークフローを通してどうこうするには至りませんでした。

なのでこの記事自体は概ね薄味というか、なんだAYONの紹介かみたいになっています。
ただ、それはそれとしてAYON USD Bookは、欠けがありつつも読み応えのある資料なのでご一読をおすすめいたします。
他のUSDの重要資料への導線にもなると思います。


方針

AYON USD Bookの構成に沿って、Mayaではアセットワーク、Houdiniでショットワーク……のような想定で進めてみます。

ドキュメント中で度々言われているのは、「アセットは基本的にリファレンス」「ショットはサブレイヤー」、バリアントについては「アセットはあり」「ショットはなし」ということです。(※ほとんどの場合)

読み込み バリアント
@ アセットワーク リファレンス yes
@ ショットワーク サブレイヤー no

そしてこの辺りをパブリッシャー上の設定として提供しているのがayon-maya、ayon-houdini等、という構図になります。

Maya / アセットワーク

アセットはアプリボット社が公開しているエイビーを使いました。
モデルも背景も込みなのが嬉しいところです。
https://www.applibot.co.jp/recruit/3dadopt/3drig/
ここではアニメーションに関する内容は含まないためリグ関連ノードは外しています。

AYON上でアセット、ショット、タスクを登録しておいて、AYONランチャーでAB(アセット) > modeling(タスク)を選択してMayaを起動

Work FilesでとりあえずSave Asしてバージョン1を作っておきます。

シーン名はプロジェクト設定に応じて勝手に決まります。

モデリング作業が完了したとして(※今回は読み込んできたのですが。)、
パブリッシュしたいノードを選択して「Create...」を開き、
「Choose publish type」欄から「Maya USD」を選択。
バリアントはとりあえずMainのままで、Create asset hierarchy をONにして「Create>>」

すると、右側の「Product to publish」にパブリッシュタイプを登録できます。
複数登録しておくと、複数の所定のデータを一括でパブリッシュできます。
ここでは「usdMain」が登録されました。

次にPublishタブに遷移し、先ほどの「usdMain」を選択。

モデルを出力するので、Export Animation DataをOFFにしました。
変更したオプション項目は薄青色でハイライトされます。

↓パブリッシュタイプを多数登録してみた例

右下のPublishを押すと、データチェック(バリデーション)が走りデータが出力されます。

バリデーション項目はプラグイン化されており、AYONの設定画面でON/OFFして使います。

パブリッシュできました。

ここまでの手順は、Mayaに限らず後述するHoudiniほか、AYONパイプラインに統合されたどのツールでも共通です。

パブリッシュすると、所定の階層構造にファイルが出力されます。
エクスプローラー上はこう、

ローダーから見るとこう。

階層構造としては↓こうですが、

AB
    - work
        - ...
    - publish
        - workfile
        - mayaScene
        - usd
            - usdAsset
                - v001
                    - AC24_AB_usdAsset_v001.json
                    - AC24_AB_usdAsset_v001.usd
                    - payload.usd
            - usdAsset_model
                - v001
                    - AC24_AB_usdAsset_model_v001.json
                    - AC24_AB_usdAsset_model_v001.usd
            - usdMain
                - v001
                    - AC24_AB_usdMain_v001.json
                    - AC24_AB_usdMain_v001.usd

データとしては↓

usdAsset
    - デパートメントレイヤー(モデルとかルックとかアニメーションとか。ここではusdAsset_model)
        - バリアント(メインとかダメージとか。ここではusdMain)

となっていて、アセットやショットに一つ、usdAsset or usdShot が用意され、その下に各部門のレイヤー。バリアントは、なければメインのみが置かれる(ショットの方はなし)。

ちなみにデパートメントレイヤーの種類は、AYONのcoreアドオンから設定できます。

また、同様に階層構造やシーンファイル名のテンプレートも編集できます。

こうしたストラクチャには普遍的な正解はない(あるいはいろいろな正解がある)ものの、共同作業で構築していくという点は変わりません。これについてNVIDIAのOpenUSDの記事の中では、コーディング時のスネークケースvsキャメルケースを引き合いに出しつつ、一貫性が無いと共同作業時の摩擦になると言及しています。
https://docs.omniverse.nvidia.com/usd/latest/learn-openusd/independent/asset-structure-principles.html#what-makes-asset-structure-necessary
また関連して、AYONコミュニティのUSDのスレッドの中では「すべてを『pixary(ピクサー的)』に保つべき」との発言もありました。
https://community.ynput.io/t/ayon-and-usd/682/10

まとめると

  • 構造はどうすることもできる
  • でも共同作業の範囲内では一貫した規則を適用するべき
  • ピクサー的な作り方が大きな目安

ピクサー的な作り方・構造に沿うのが吉ということで、やはり先ずKitchen Setより始めよということですね。
ただ、Kitchen Setにはデパートメントレイヤーはないのでそこは注意かもしれません。


続いて建物もパブリッシュしました。

パブリッシュしたUSDをロードする際はこう。ローダーを開いて、ロードしたいアセットを右クリックすると、目的に応じた読み込みコマンドを実行できます。アセットのどのバージョンを読むかメニューから選択することも可能です。

MayaでのUSDアセット出力はここまでです。
Mayaワークフローのドキュメント末尾には現在以下のようなTODOが記載されています。

  • アセットコントリビュートでルックレイヤーを公開するためのLookdevXルックワークフローを説明
  • Mayaでの一般的なショット ワークフローを説明
  • ショットワークフローのためにアニメーションをパブリッシュするRig -> アニメーション ワークフローを説明

いずれも大変読みたくなる内容です。


ちなみに、ここではそういう趣旨なのでUSD周りばかり言及していますが、AYONパイプラインはUSD絡まずとも機能します。
Mayaメインウィンドウ左下にはツールアイコンが追加されたり、

メインメニューには「Cusotm Tools」なるカスタムなツールメニューが追加されます。

Houdini

つづいてHoudiniでのワークフローです。ショットのタスクを選択してランチャーからHoudiniを起動します。

AYONパイプラインにはUSDのリファレンス、サブレイヤー用にLOPノードが用意されています。

  • AYON Load Asset
  • AYON Load Shot

それぞれ、現在のタスクとファイルのバージョンがわかれば自動でふさわしいUSDを読むというものです。「ファイルを探して読む」ではなくなるべき状態になるのでパイプラインって感じ(??)がします。

↓AYON Load Assetでアセットを読んだところ。


とりあえずローダーからキャラをリファレンス読みしてみます。

ロードしたあとのアセットはinventoryでこのように確認できます。

そしてひとまずパブリッシュしてショットUSDを用意し、AYON Load Shotの挙動を試そう。
と思ったのですが、


※ちなみにパブリッシュ時の設定は、Target Product = usdShot、Initialize as = shot、Add as variant = OFF。

Apprenticeではパブリッシュできない。それはそう。

ということで、手順としてはこういうことをするんだなというさわりの部分だけ確認した次第。
HoudiniアドカレもApprenticeの方にしとくべきだったのではと反省。。。
ショットワーク周りの検証は、ほとんどそれらしいことはできずでしたがここまでです。


こうしてできたデータは、ファイル階層に関しては人間が探索したりする前提ではなく、「データ的に整理されている」ことが第一になると思います。実際、今回できあがったファイル階層を手作業で降りたり登ったりするのはかなり避けたいですし、他方、作業中はパイプラインツールに仲介され階層を意識することは全くありませんでした。
こうしたデータ的な合理性とアクセス性のギャップを埋めてくれる要素として、OpenAssetIOあたりが整備されていくのがさらに次の大きな流れとかなのかなと思います。(ちなみにOAIOの指すアセットは「アセットワーク」「ショットワーク」のアセットではなく、スタジオの資産=アセットのデータとかショットのデータとか、アートや画像連番……等を指すようです)

http://docs.openassetio.org/OpenAssetIO/


このほかHoudini用の記載としては、Layer Break、レイヤーのミュート、明示的・暗黙的なレイヤー保存パスについてがあります。

レイヤーのミュートについては、どのレイヤーをミュートしたかはUSD内に書き込まれないのでそれ用のHDAを用意したということのようですね。便利。Mayaにも欲しい。

ちなみに、先ほどの二つのLOP以外にもいくつかのLOPと、

objレベルやoutレベルにもHDAが追加されています。


outに多数追加されているCreate系のものは、手動で使うというよりはパブリッシャーのCreate時に追加されるものということのようです。


Houdiniワークフローのドキュメント末尾には、現在以下のようなTODOが記載されています。

  • 暗黙のレイヤー保存パス(Implicit Layer Save Paths)とフラット化のためのUSD ROPの設定(the USD ROP settings for flattening)を説明する
  • Houdini USD Rop: すべてのレイヤーを平らにする

MayaドキュメントのTODOも含め、これらが追記されたらすごく充実した内容になりそうなので今後に期待。

余談

AYON(当時OpePype)のUSD周り開発中のチケット内に、Maya/USDでのルックデヴテストのデモ動画がありました。この記事をだいぶ書き進んでから気づいたので、紹介まで。
https://github.com/ynput/OpenPype/pull/5925

デモ動画は5つ貼られています。

  • maya_houdini_usd_lookdev_testing_compressed.mp4
  • houdini_usd_shot_prototype.mov
  • maya_usd_asset_prototypes.mov(+こちらはちょっと古いらしいです。>  openpype_mayausd_prototype_lets_create_a_cube.mov)
  • blender_usd_asset_prototype.mov

本稿冒頭の講演動画ではBlenderヘイトが漏れたりBMD Fusionを「チープなNuke」と呼んで笑いをとったりなかなかエスプリが利いていましたが、これらのデモ動画でもスザンヌの歌を口ずさんだり非常に楽しそう(?)です。


以上、Maya/HoudiniでAYONパイプラインを使って実践USDワークフローを試したい記事でした。
参考にしたドキュメントが更新されたら、内容追記したいところです。

Mayaアドカレ シリーズ1 の明日の記事は @9boz さんの 「ポリゴンのはなし」
Houdiniアドカレの明日の記事は @kickbase さんの 「複数のジオメトリをロードするHDAの話」
USDアドカレ の明日の記事は @fereria さんの 「ALabを詳しく見よう」
です!

Discussion