Skip to main content

「プロシージャルシーングラフ」とは

USD AdventCalendar2022 2 日目は、USD のプロシージャルシーングラフとはなにか?についてです。

USD は、今まで使用されていたファイルフォーマットと DCC ツールの関係とは 同じような側面と、新しい側面と両方存在しています。

今までの DCC ツールにおけるファイルフォーマット、例としては FBX がどのように使用されていたかというと

Blender の例に挙げると、このように「Import」メニューから FBX を選びシーンにロードします。

図に表すとこのようになります。 たとえば、Maya から Blender にモデルデータを持ち込みたい場合とすると Maya で Fbx を Export します。 そしてその Export したデータを Blender で Import します。 この Import するときに何がおこなわれているかというと、 Blender は FBX のシーングラフを解釈して、「Blender のシーングラフに変換して」ロードしています。

そのため、Maya - FBX - Blender この 3 つはそれぞれ別のシーングラフとして依存を持っているわけではありません。 Maya 側のシーンが更新されたら、FBX として再度エクスポートしなければいけないし Blender 側も、読み込んだモデルを削除してから読み直しをする必要があります。

もう 1 つ重要なポイントとしては、 Maya から Export した FBX を「Blender のシーングラフに変換」している部分です。 Blender 側は、あくまでも FBX のデータを解釈して 「対応しているデータのみを変換して、Blender のデータに変換」 しています。

そのため、「対応していないデータ」であったり、カスタムデータといったものは Import 時に消失してしまう可能性があります。 そして、そうして出力したデータをインポートするときに インポートするツール側が FBX に対応しきれていなかったら 対応していないデータは消失し、対応済のデータだけシーンにインポートされます。 Fbx と Blender には依存関係は持っていないので関係性は切れてしまいます。

しかし、扱う側の気持ちとしては 「対応していなかったとしてもデータは残してほしい」 ですし 「元の DCC ツールから出力されたシーングラフは維持してほしい」 ですし 「編集した差分だけ積み重ねていってほしい」 という気持ちがあります。

そういったことに対応するのが「プロシージャルシーングラフ」と呼ばれる考え方で、 USD を使用してパイプラインを構築する場合のとても重要な事柄になります。

USD とプロシージャルシーングラフ

この「プロシージャルシーングラフ」というのが何を意味しているかというと

プロシージャル 日本語で手続き型、数式や処理を組み合わせて何かの操作を行うこと 参考: https://entry.cgworld.jp/terms/%E3%83%97%E3%83%AD%E3%82%B7%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%AB.html

とある通り、シーングラフの構築を手続き的に 複数のシーングラフを組み合わせることで、非破壊で 1 つのシーングラフを構築すること を指しています。

たとえば、あるモデルのマテリアルを編集して、ライティングして、カメラを作成、レンダリングする場合。 このような工程があるとします。

従来の手法で Maya を使用してこの作業を行おうとした場合、 すべて 1 つの Maya シーンで行われるため、それぞれの作業シーンを明確に分離することはできませんし それぞれの操作を簡単に切り替えるのは、容易ではありません。 (リファレンスを使用すればできなくはない)

しかし、USD はコンポジションを使用することで、それぞれの編集を別ファイルに分離し それらをプロシージャルに合成できます。 分離したファイルを、各セクションの担当者が更新するようになります。

たとえば、pighead モデルをレンダリングするシーンを作る場合。 レンダリングするシーンは共通のカメラとライト、そしてレンダリング対象のマテリアルアサイン済モデルをロードします。 マテリアルはモデリング担当者とは別の人が担当するので別のレイヤーとして組み立てたい という場合は、このようにレイヤーを組み合わせて 1 つのレンダリングシーンを構築します。 それぞれの担当者は、自分の編集分を別のファイルに保存します。 これにより、前工程の担当者のデータを残した状態で 「非破壊で」自分の編集結果を保存することが可能になります。

このように、シーングラフを複数のファイルに分離してプロシージャルに合成できるのが USD の魅力の 1 つとも言えるし、これまで多くのケースで使用されてきた FBX と行ったフォーマットと 大きく異なるポイントであり、USD で扱うことの大きなメリットになる部分です。

各主要な DCC ツールでの対応状況の話

つまりは、USD を扱おうとした場合には 2 通りがあって、

  1. 今まで通りの DCC ツールへの Import、いわゆる DCC ツールのシーングラフを行き来するためのフォーマット
  2. プロシージャルにシーンを編集・オーサリングする

この 2 種類が存在しています。 もちろん、DCC ツールのシーンデータをエクスポートし、ほかの DCC ツールでインポートする といったことが可能になるというのもメリットではあります。 しかし、DCC ツールでの対応がそれだけだと、あくまでもモデリングしたデータを出力するといったような スタート地点の、不可逆的なポジションに限定されてしまいます。

それよりも、レイアウト → ライティング → レンダリング 個々のパートの編集が別のファイルで保存され、それらがプロシージャルに合成されていてほしいわけです。 USD を扱いたい場合、これらの各レイヤーをプロシージャルに合成し USD のレイヤーに記載されている情報やコンポジション情報を失うことなく「非破壊で」更新できることが DCC ツール側に必要になります。

それを踏まえて、各ツール 現時点でよく使用されているツールである Maya Blender Houdini この 3 つの 対応状況を、プロシージャルシーングラフという観点で、それぞれ見ていきたいと思います。

Blender の場合

USD にはコンポジションの仕組みが存在して、ファイルを分割することで 同時編集を可能にする…というのは何度か説明してきたかと思いますが、 プロシージャルシーングラフを扱うということは、シーンの編集をこのコンポジションを 活用して行うということを指します。

残念なことに、Blender における USD は従来の扱いと同様で Import / Export のメニューから Blender のシーンを USD として出力したり、USD を Blender のシーングラフに Import する処理のみで プロシージャルシーングラフを扱うことができません。

AMD が開発している ProRender アドオン(以前の紹介記事はこちら) では、USD ノードを使用することで限定的ですが プロシージャルに扱うことができます。 (ただし、非常に限定的)

そのため、Blender はモデリングしたデータを USD で出力することはできても USD で、ライティングしたりレンダリングしたりするのは現状だと難しいです。

Maya の場合

Maya における USD の取り扱いは、現状 3 種類あって 1 つ目は Maya のシーングラフとして Import する方法です。 これは、いわゆる従来の FBX を使用して DCC ツール間を行き来していた時と同じ扱いです。 この場合は非破壊ではなく、プロシージャルでもありません。 (Import した段階で未対応のデータは喪失する)

2 つ目は Maya2022 までの段階で実装されていた Create > UniversalSceneDescription(USD)の Stage with New Layer を使用する場合です。

この場合、Maya は USD をどのように扱っているかというと 「mayaUsdProxyShape ノード」と呼ばれるノード(mesh ノードなどではない)に対して Usd ファイルをロードします。 そして、そのノード以下には Maya にモデルを Import した時のように Transform ノードっぽいものが並びますが、 これらの ♦ マークがついているノードは Maya の構造ではなく USD のシーングラフであり その USD のシーングラフに含まれている Prim になっています。

mayaUsdProxyShape ノードを確認すると、Usd のレイヤーが指定されていることがわかります。

Attribute Editor を見ると、Data Model と呼ばれる形式になっていて、 Usd Stage を Maya のシーン内に一時的に展開しているような状態になっています。

つまりは、一見すると Import したように見えますが mayaUsdProxyShape ノードを介して Usd のシーングラフを Maya のシーン上に表示している状態 になっています。 そのため、ロードした USD のファイルが更新されれば、Maya 上でロードされているシーンもリロードが可能です。

さらに、mayaUsdProxyShape 以下のノードを右クリックすると「Usd Layer Editor」メニューがあります。

この Layer というのは、USD のレイヤー すなわち USD ファイルを指しています。 mayaUsdProxyShape 以下は「UsdStage」になるので、 編集するファイルを変更して(この場合サブレイヤーで)扱うことができます。

これの何が重要かというと、 Stage with New Layer を使用して USD を Maya にロードした場合というのは Maya のシーングラフに変換することなく「USD のシーングラフを」編集していることになります。

例として、Kitchen_set を Maya にロードした場合。 USD Layer Editor でレイヤーを新規追加し、編集対象にします。 編集対象にてから Kitchen_set を Z UP だったので向きがおかしいので直した場合、 Kitchen_set.usd は編集せず(元のまま)、Rotate を anonymousLayer1 に追加しています。 レイヤーを分離しているので、 ON/OFF で編集した結果を反映したりなかったことにできています。 (これは、Photoshop のレイヤーの表示・非表示と同じ)

つまり、この場合は元のデータを編集することなく非破壊で USD のシーンを編集しているということになります。 そのため、元のデータ(今回の場合は Kitchen_set.usd)が更新されたとしても リロードすることが可能ですし、元のデータに含まれている情報は失うことなく編集することが可能です。

コンポジションを使用して USD ファイルを分離して、各種ツールで編集したとしても USD ではなく「DCC ツールのシーングラフとしてロード」した場合、 コンポジションによってファイルを分離したとしてもコンポジションによる依存関係は消失します。 そうなると、プロシージャルに、非破壊でシーングラフを構築することはできません。

USD のシーングラフを維持したまま、「プロシージャルに」「非破壊で」構築することができてこそ USD の真の力を発揮するのです。

!!! info

このあたりの対応ができているかどうかが、USD対応の大きな差になってくると 個人的には思っています。

Maya は、この Stage with New Layer を使用した主にサブレイヤーを使うことでの編集と 2023 で Bifrost を使用して、もう少し複雑な操作が可能になっていますが Bifrost での取り扱いは、今回の記事では割愛します(別の記事で詳細な対応状況を書こうかと思います)。

Houdini の場合

さて、最後が Houdini の場合。 Houdini の SOLARIS は「USD のシーングラフそのもの」といえるものです。 この USD のシーングラフそのものというのが何を指しているかというと LOP のノードは基本すべて「USD のシーングラフに対する編集操作」で、そのすべてをプロシージャルに行っています。 つまりは、Houdini の SOLARIS はプロシージャルにシーングラフを扱えるようになっています。

LOP は「Stage」と名のついている通り、USD の世界です。 つまりは、この世界ではすべて USD のシーングラフを編集しているわけです。

ノードは、この Stage(UsdStage)に対しての何かしらの操作を「プロシージャルに」行います。

たとえば、Pighead を動かしたりした場合「Edit ノード」が作成されます。 これは、Input の Stage に対して

xformOp を使用することで、移動する…という編集を行っています。 これらのノードは「Implicit Layers(AnonymousLayer)」という、メモリ上にのみ存在している 個別のレイヤー扱いになっていて、それらがコンポジション(基本はサブレイヤーで)されているような構造をしています。

すべてのノードが別レイヤーとして扱われているのが、どのようなメリットがあるかというと、 1 つ目が、どのようなレイヤー(usd ファイル)単位で出力するかというのを ノードで制御できるというのがあります。

Implicit Layers(個々のメモリ上に分離されたレイヤー)は、最終的に USD ROP でどのようなレイヤーに 保存するか確定しますが(基本 Flatten = ImplicitLayers 部分は 1 つのレイヤーにマージされる) SOLARIS 上のノードで操作している段階では別々のレイヤーとして存在しています。

しかし、場合によってはモデル本体と移動は別ファイルに分離したいこともありますし 1 つの hip ファイル上でも、複数のパターンでレイヤーの攻勢を変更したいということが発生します。 そんな時でも、それらの処理をプロシージャルに編集できます。

もう 1 つが、元のファイル(別のレイヤー)を非破壊で編集することができることです。

USD ROP で Flatten Stage した場合は別にして(これはいわゆるコンポジションをすべてなくして 1 つのレイヤーに統合すること) すべてのノードが別レイヤーで編集が行われているということは、 Reference や Payloads したレイヤーというのは直接編集せずに、 すべて別のレイヤーとして編集されているので、元のデータを非破壊で編集していることになります。

そのため、リファレンスしている元のレイヤーに Houdini では未対応のデータが存在していたとしても データはそのまま保持した状態になります。

!!! info

HoudiniでのLayer操作は このあたりにまとめてあります。

まとめ

ここまでで、プロシージャルシーングラフとはなにかと プロシージャルシーングラフというキーワードを中心に各 DCC ツールの USD の対応についてをまとめてきました。

今までのように Import / Export するというだけだと、従来のフォーマットの違いを 感じ取ることはできないのですが、 各 DCC ツールでの対応を見ることで、その違いが感じ取れるのではないかと思います。