🍣

続々・ざっくりOmniverse - MayaとOmniverse

2020/12/23に公開

今回も引き続きOmniverse検証やっていきましょう。
最初の回で、MayaとOmniverseの接続方法を書きましたが、そのあたりを
もう少し具体的に掘り下げつつ、どちらで何ができるかとか
どういうふうに作業すればいいのかを考えてみようとおもいます。

おさらい

まず、Maya側とOmniverse側でどちらで何ができて・何ができないのかを
考えてみます。

Maya側は、Drive以下にある「USDファイル」を指定してMayaシーンに開きます。

まずはOmniverseでNew Scene。
そしてRootLayerに対してCubeを1つ作ります。

Cubeができました。
そのレイヤーを保存します。

そしてSyncします。

そのシーンをMaya側でConnect to USDで開きます。

Mayaのアウトライナーをみると、このように開いたUSDのシーングラフが
Mayaのシーングラフとして展開されます。

すると、今はこのような状態になります。
OmniverseのUSDのレイヤーのうち1つが、Mayaのシーンとして展開されている状態です。
こうすることで、「あるレイヤー」をMaya側のシーングラフで操作できます。

このMayaシーンは、Mayaの世界を保ちつつもUSDのレイヤーそのものになっていて
この中をMayaのノードで編集することで、間接的にUSDのシーングラフを操作していること
になります。

例えば、Mayaのシーン側でPlaneを追加します。

Mayaのシーングラフに追加されたオブジェクトが
USDのシーングラフにも追加されました。

ここまでは最初にやった内容と同じです。

複数レイヤーがあった場合

1つのレイヤーのみだとわかりやすかったですが、これが複数だった場合は
どうなるか見てみます。

まずは、このようにレイヤーを2つ作成します。
そして、片方に先程作成したCubeとPlaneを入れておきます。

複数レイヤー間の移動はDrag&Dropで可能です。

そして、 move.usd を Authoring Layerに指定します。

そして、このとき注意が必要なのは
レイヤーの順を geom.usd より move.usd を上にしておきます。
こうしないと、Omniverse上でオブジェクトを動かそうとしてもうまくいきません。

なぜかというと、
このLayerの階層は、Treeの子が親にサブレイヤーで含まれている...
記述でいうと
rootLayer.usd に

subLayers = [move.usd,geom.usd]

という記述になっているため、上のような階層のだと move.usd は geom.usdにある
Meshに何があるかを知らないからです。

そのため、この状態で move.usd をMayaで開いても

なにも表示されません。

ざっくりあらわすとこうなります。

このように move.usd に geom.usd をぶら下げておけば

move.usd を開いたときでも
Maya側も、別のレイヤー(geom.usd)に記載されているMeshを読み込むことができます。

こうなります。

この状態で、Omniverse側でCubeを動かすと

Authoring Layerに指定した move.usd に、移動したという値が「over」で
追記されました。
つまり、Meshの定義自体は geom.usd のままですが
移動値のみが別レイヤーになったわけですね。

次に move.usd をMayaで開いて、Cubeを動かしてみます。

すると、 over ではなく 実体でCubeが作成されました。
ちょっとこれは想定外。
Maya側でシーンを開くと、サブレイヤーであっても実体としてロードされているのが
気になっていましたが、いい感じに差分をOverで書き出してくれるわけではなさそうです。

これが想定どおりなのかバグなのかはわかりませんが
仕様なのだとしたら、サブレイヤーなどコンポジションされた状態を
Maya側で触れると、あまり意図しない状態になりそうです。

ノード名変更・階層変更

次にノード名の変更や階層変更について。
よくありそうな操作ですが、今のところOmniverseでこの処理をする方法が見つかりませんでした。

例えば、あるオブジェクトを別レイヤーに移動した場合

この場合は、階層を維持した状態で別レイヤーに移動されます。
移動したノード以下は over でPrimの階層が作成されます。

次にMaya側で操作してみます。

Maya側で操作すると、見ての通り指定のレイヤー内のノード階層や名前を
編集できていて、それがOmniverse側に反映できていることがわかります。

ですが、試しに geom.usd にあるCubeを move.usd で動かしていた場合。
geom.usd のCubeをリネームしてみます。

すると、 move.usd の「Cubeを動かす」という記述と geom.usd のCube名が一致
しなくなるため、 move.usd の編集結果は無効になります。
ただし、「移動した」という over の記述のみがのこっているため
geom.usd 側のCubeの名前をもとに戻せば
move.usd での編集結果が元通り反映されます。

まとめ

ここまで見てきてわかったことは、
Maya側でConnect to USDをすると、ConnectしたUSDを
コンポジションなどをすべてひっくるめた状態でMayaのノードとして展開し、
その編集を、実体化した上でUSDに書き戻している事がわかります。

そのレイヤーのネームスペースは、Mayaの階層構造と一致し
USDレイヤーのコンポジション情報などは持っておらず
あくまでも開いたレイヤーを編集 します。

対して、Omniverse側での操作は USDのコンポジション・ネームスペースを考慮して
コンポジションの編集、Authoring Layerへの編集を行います。
もしかしたらBatchNamespaceEditなどをすれば、階層構造をまとめて編集など
できるのかもしれませんが、
あくまでも各レイヤーが別のレイヤー、別作業者として作業しているとして
(LiveSyncされている事も含め)
操作しているのかなーと想像しました。

それ以外だと、Omniverse側ではモデリングや
USDのアセットセットアップ(バリアント設定など)は
今の所できなそうです。
なので、各コンポーネント単位でのモデリングであったりセットアップは
Maya、HoudiniなどといったDCCツール側で行い
Omniverse側では、レイヤー操作・配置・マテリアルのアサインなどを
行うのが良さそうです。

レイヤーの切り方も、それらを踏まえて考えると
マテリアルをOmniverse側でやる場合も、
オブジェクト単位であれば名前が一致していれば別レイヤーでの編集は維持されるので
モデリング(Maya or Houdini)マテリアル(Omniverse)といった作業に切り分けも
できそうです。

LiveSyncしながらMaya側でマテリアルを作るのも試してみました
若干不安定。。。
全体的に、がんがんいじるとMayaが高確率で死んでしまうので、
このあたりの安定化は今後の課題かなとおもいます。

引き続き色々調べていこうと思います。

GitHubで編集を提案

Discussion