コンテンツにスキップ

SOLARISでコンポジションアーク

前回で、SOLARISの中でUSDファイルを開いてみましたが
今回からノードを使って具体的なUSDオーサリングをやっていこうと思います。

コンポジションアーク

まず、やり方に行く前に「コンポジションアーク」についておさらい。

コンポジションアークとは、レイヤーを「プロシージャルに合成」していく時の
合成ルールのことです。

USDは、複数のファイルを合成して結果シーングラフを作りますが
合成するときに「どうやって合成する?」というルールがなければ
プロシージャルに合成するできません。

そのときのルールがこの「コンポジションアーク」であり、

  • サブレイヤー
  • バリアント
  • リファレンス
  • 継承
  • ペイロード
  • 特殊化

この6種類が存在します。

詳しくは、

https://fereria.github.io/reincarnation_tech/11_Pipeline/01_USD/05_comp_arc

こちらで解説しています。

では、このコンポジションアークがSOLARIS上でどう扱うかを見ていきたいと思います。

サブレイヤー

まず、最初はサブレイヤー。
SOLARISではすべてのノードはUSDのレイヤーなのですが
そのレイヤーをつなげた場合の多くはこのサブレイヤーで合成されます。

まずは単純なノードで見てみます。

SubLayerノードは、Input1とそれ以外のMultiInputをつけつけています。

今のLayer状況を「Scene Graph Layers Panel」で確認すると、
Input1の入力の子としてMultiInputのLayerがついているような構造になっています。

#usda 1.0
(
    subLayers = [
        @CUBE.usda@,
        @SPHERE.usda@
    ]
)

def Xform "BasePrim"
{
}

USDのSubLayerをUSDAファイルで記述するとこうなります。
このファイルをノードで表すと、
ファイル自身がInput1で、subLayersでセットしているusdaファイルがMultiInputの入力になります。

ただし、このレイヤーの解決順序はUSDの公式の順序ではなく
「Sublayer Position」で指定されたものを SubLayerの位置として認識します。
デフォルトの場合は、「Strongest Layer」になっていて
一番強いノード(この場合最後の入力である SPHERE)が出力されます。

通常のUSDと同じにしようとした場合「Strongest File Layer's Position」で
RootLayerのLocal(RootLayerに記載されているPrim)が優先されるのがデフォルトのUSD解決順序な気がします。

このSubLayer時の優先順序(どの順番で合成されているのか)は、Scene Graph Detailの「レイヤースタック」で
確認することが出来ます。

レイヤースタックとは、すべてのサブレイヤーを集めたものです。
レイヤーのPrimitiveや各種プロパティ・アトリビュートの値はレイヤースタックに積まれた順
(上のスクショの例だと、上のほうが強い)で上書きされていきます。
シーングラフを構築するときに、どのようにそれぞれのレイヤーが「解決しているか」は
このレイヤースタックを確認することでわかります。

サブレイヤーのアウトプット

このSubLayerのアウトプットでなにを返すかというと

確認するには lopinputprims 関数を使用すればわかります。

Collectionノードで確認してみると、「BasePrim」つまりは、Input1に入力されているPrimitiveが
編集されたPrimitiveとして取得されることが分かります。

あくまでも取得出来るのは「編集しているRootLayer」であり、
合成側のレイヤー(MultiInputに入力されている物)は含まないというのが注意する点です。
入力のPrimitiveを使用して、次のノードで何かをしたい場合( lopinputprimsで取得する場合)
合成した結果すべてを得られるわけではありません。

なお、この出力されるPrimitiveは Sublayer Position を変更しても変わらずInput1のPrimitiveが帰ってきます。

似た挙動をするノードとして「Merge」がありますが
こちらはSubLayerとは違い、入力したノードを並列で扱い合成し
結果できたレイヤーを返します。
なので、 lopinputprims で次のノードで取得した場合
すべてのPrimitiveを取得することができます。

SubLayerとMergeの違い

SubLayerとMergeは挙動がほぼ同じで、結果のシーングラフも同じです。
ですが、上に書いたとおり結果出力されるノードなどに違いがあります。
それが確認できるのが「Scene Graph Layers Panel」です。

まずは、SubLayerのレイヤー構造。
レイヤーの構造は、Input1 のレイヤーの子にMultiInputのノードが存在する状態です。

つぎにMergeを見てみると、
レイヤー構造は親子ではなく「並列」に扱われています。

Layer Flatten

サブレイヤーで合成されている各種レイヤーは ~ Layers という形でノードの右下に表示されています。

このLayersの数は、SceneGraphLayersPanelの「Implicit」になっているレイヤーの数です。
この複数のレイヤーを「1つに結合」するのが LayerFlatten です。

ConfigureLayersノードの「FlatetenInput」を

Flatten Input Layers に切り替えると、

レイヤーは1つに統合されます。
PhotoShopのレイヤー統合、あるいはAEのプリコンポーズのような処理で
各レイヤーをサブレイヤーで合成していった場合の結果を制御できるようにしてあります。

USDをSOLARISではなくそのまま使っていると問題になってくるのが、レイヤーのコンポジションの解決順序です。

https://fereria.github.io/reincarnation_tech/11_Pipeline/01_USD/05_comp_arc/

USDの解決順序は上のページの通りですが
SOLARISでは要所要所のノードでFlatten、あるいはノードの接続順によるプロシージャルな解決制御
をできるようにしているように感じました。


最終更新日: 2019-12-23 15:52:31