この記事では、LOPsにおける、FXの方法について解説します。
ここではFX部門として既存のショットレイアウトにRBDシミュレーションをアニメーションとして追加します。本来であれば、ここにはアニメーション部門の作業も含まれますが、このチュートリアルでは省略されております。USDのメリットは、各部門が独立して作業を行うことができる為、各部門の編集結果を独自に保存して、それをレイヤーとして積み重ねることで、最終ショットを作成できる点です。
従って、この作業の後にライティング部門は、レイアウト、アニメーション、FXの各USDファイルを読み込み、コンポジットして結果を確認することになります。そのうえでライティングUSDファィルを作成しファイナルのショットとしてレンダリングが行われます。各部門が独立しているので、表示の際には必要な個所のみを表示して確認を行うことが可能です。
レイアウトUSDを読み込む
最初にレイアウト部門のUSDファイルを読み込みます。これにはリファレンスとサブレイヤ―の2通りの方法があるため、これをひとつずつ見ていきます。リファレンスとサブレイヤ―については、USDの基礎のサブレイヤー/ リファレンスの項をご確認ください。
- Houdiniで新規シーンを作成します。
- DesktopをSolarisに変更します。
DesktopにSolarisがない場合は、Scene Graph Treeペインを作成してください。
- /stage 階層に移動します。
- Sublayer LOPを作成します。
チュートリアル4で作成したショットUSDをひとつロードします。
Fileを$HIP/tutorials/shot004_layout_v001.usda に設定します。
- Reference LOP を作成し、名前をScene に変更します。
チュートリアル4で作成したショットUSDをひとつロードします。
Reference Fileを$HIP/tutorials/shot004_layout_v001.usda に設定します。
- Scene Graph Treeより、ふたつのLOPでプリミティブの取り込まれ方にどのような差があるかを確認して下さい。
Sublayer LOPでは、/Scene 下にない、非アクティブなライトも読み込まれているのに対し、
Reference LOPでは、/Scene 下にないものは一切読み込まれていないことがわかります。
- Switch LOPを作成し、Sublayer LOPとReference LOPを配線します。
ディスプレイフラグを移しても、シーンが表示されない場合はSelect Inputのスライダを一度動かしてから戻してみてください。
この時点では、Sublayer LOPとReference LOPは同等に機能することが確認できます。
領域の剪定(Prune)
作業/確認したいシーンの箇所を剪定します。
- Switch LOPの下にPrune LOPを作成します。
Scene Graph TreeからPrimitive Patternに、パス /Scene/ShopBack/Shelves/Contents をPrimitive Patternにドラッグアンドドロップします。
MethodをDeactivate に設定します。
Prune Unselected にチェックを入れます。
- Prune LOPの下にLayerBreak LOPを作成します。
このレイヤーブレイクは、静的な瓶をアニメーションがついた瓶に置き換えるポイントになります。レイヤーブレイクにより上流の記述がレイヤーに書き込まれることをブロックする為、これ以降の処理は全てFXレイヤーのものとなります。レイヤーブレイクにつきましてはこちらの記事も併せてご参照ください。
FXの付与
これで、FXを棚に適用する準備が整いました。 今回は処理の軽量化を優先する為、本物のRBDシミュレーションは行いません。 また、シミュレーションを高速化するために、重いジオメトリであるherb-jarsを削除します。
※厳密なRBDシミュレーションを用いたセットアップを確認したい際は、LOPS_DEMO_FILES内の、FXLayerRBDsetup.hipをご確認頂ければと思います。
- Layar Break LOPの下に、Prune LOPを作成します。
プロセスの高速化のために、jarファイルから葉っぱのある瓶を削除します。
Primitive Patternを/Scene/ShopBack/Shelves/Contents/Prototypes/Stuff/HerbJarsAsset* に設定します。
- Prune LOPの下にExtract Instances LOPを作成します。
Instancesを/Scene/ShopBack/Shelves/Contents[*] に設定します。
Primitive Pathを/Scene/ShopBack/Shelves/RBD に設定します。
このノードは、インスタンスをアニメーション化できるUSDプリミティブに変換します。
※jarファイルの位置を単純に揺らしたいだけの場合、Modify Point Instances LOPを利用することをお勧めします。 今回はより高度なRBDシミュレーションとなるため、Extract Instances LOPを使用しています。
パラメータフィールドでポイントインスタンサーインスタンスを指定する場合、標準のパターンマッチングは使用されません。/Scene/ShopBack/Shelves/Contents の部分は、Point Instancerプリミティブを識別します。
角括弧内の部分は、インスタンスインデックスを選択するためのパターンです。 これは、SOPのpoint / primitiveグループと同じような数値パターンが利用できます。 したがって、「[0-19]」は最初の20個のインスタンスを選択します。 ただし、この場合、「[*]」は任意のインデックスに一致します。 (パターン選択の詳細については、SideFX社サイトの「Primitive matching patterns」ページを参照してください。)
ここでは、抽出したプリミティブを/Scene/ShopBack/Shelves/RBD というレイヤーに配置しています。
- Extract Instances LOPの下にSOP Modify LOP を作成します。
Primitivesを/Scene/ShopBack/Shelves/RBD に設定します。
- SOP Modify LOPの中に入ります。このノードの中はジオメトリ階層(SOP)となります。
※今回の場合はUSDプリミティブを動かすだけとなりますが、事前破砕やRBDシミュレーションなどの、Houdiniポリゴンを操作する必要のある高度な処理を行う場合は、Unpack USD SOPを接続し、traversalをComponentsに設定して作業する必要があります。
- Point Jitter SOPをGeometry from LOPs Switch 1 SOPとOutput SOPの間に挿入します。
Scaleを0.025 に設定します。
Seedを$FF に設定します。
- この状態で再生すると、瓶が揺れるのが確認できます。[U]キーで/stage階層に戻ります。
- SOP Modify LOPの下にConfigure Layer LOP を作成します。瓶のTransformの値を含んだUSDファイルをどこに保存するかをLOPネットワークに伝えます。
Save Pathにチェックを入れ、$HIP/tutorials/shot004/fx/fx_v001.usda に設定します。
Flatten InputをFlatten Input Layers に設定します。
- Sublayer LOPを作成し、下図のように接続します。
Sublayer TypeをSublayer Inputs に設定します。
これによって、ハーブが入った粘土の瓶が消え、残った瓶が揺れるようなシーンのFXレイヤーをレイアウトレイヤーに重ねました。Sublayer LOPをバイパスすることで、元のレイヤーを表示することが可能です。
Tips
SOP Modify LOPを右クリック -> Inspect Active Layer を選択すると、瓶のTransformのみが記録されている非常に軽量な操作であることが確認できます。
Scene Graph LayersのMute列のチェックボックスにチェックを入れることで、任意のレイヤーをミュートすることも可能です。ただし、この方法でミュートできるのは、ディスクからロードされているレイヤーのみとなります。LOPsネットワークで作成されたレイヤーについてはノードのバイパス及び切断によってレイヤーの非アクティブ化が可能です。
USDファイルを書き出す
今回は、FX Transformを $HIP/tutorials/shot004-fx_v001.usda に、FXのレイアウトを $HIP/tutorials/shot004-fx-and-layout_v001.usda にそれぞれ保存されます。このようなファイル命名規則は本来非推奨ですが、今回はチュートリアルの為、このように命名しております。
また、前述の通りパイプラインにつきましても、今回の手法はあくまで一例であり、FXを単体でUSDとして書き出す場合やまた違った形でサブレイヤーかを行う場合なども考えられます。
- Sublayer LOPの下にUSD ROP LOP を作成します。
Valid Frame RangeをRender Frame Range に設定し、Start/End/Incを1,100,1 に設定します。
Output Fileを$HIP/tutorials/shot004/fx/-fx-and-layout_v001.usda に設定します。
- 上部のSwitch LOPのInputが0になっていることを確認し、USD ROP LOPの[Save to Disk]ボタンをクリックし、USDファイルを保存します。
※保存時に以下のような警告が表示される可能性があります。
Warning: Some layers were stripped during flattening due to a Layer Break.
こちらにつきましては、無視していただいて問題ありません。
作業内容を確認する
- テキストエディタ等を利用して書き出したファイルを開き、データが必要最小限の情報のみをパイプラインに流せるようになっていることを確認します。
- Sublayer LOPを利用して$HIP/tutorials/shot004/fx/-fx-and-layout_v001.usda をロードし、シーン内で瓶が揺らいでいることを確認します。
- Switch LOPにおいて、Inputを切り替え、USDファイルを保存しても、先ほどと同一のファイルが生成されていることを確認します。
この次のチュートリアルでは、FXのみのUSDファイルを使用して、ライティングのためのレイアウトのみのUSDファイルを合成します。
※ファイルがバイナリ形式になっていて、テキストエディタで確認ができない場合は、ファイルの形式が.usda(ASCII)形式で保存されていることをご確認ください。