LOPs 導入チュートリアル3: シーケンスレイアウト


この記事では、LOPsにおける、シーケンスレイアウトの方法について解説します。

このチュートリアルでは、レイアウト部門として、チュートリアル1で作成した樽のアセットと、チュートリアル2で作成した本棚、及びLOPS_DEMO_FILES下にあるアセットを利用して2通りの方法でシーケンスレイアウトを作成します。

まずは、USDレイアウトステージの構成を理解するためにマニュアルでシーケンスレイアウトを簡単に作成します。その後、Stage Managerを利用して本格的なシーケンスレイアウトを作成していきます。

マニュアルレイアウト

  1. Houdiniで新規シーンを作成します。

  2. DesktopSolarisに変更します。
    DesktopにSolarisがない場合は、Scene Graph Treeペインを作成してください。
     
  3. /stage 階層に移動します。
     
  4. Reference LOPを作成し、名前を Barrels に変更します。
    パラメータPrimitive Path/$OSとなっているので、パラメータを中ボタンクリックすることで[/ノード名]がパラメータに設定されていることがわかります。
    Reference FIleLOPS_DEMO_FILES/Library/Assets/Barrels/BarrelsAsset.usd に設定します。
     
  5. Reference LOPの下に、Set Variant LOP を追加します。
    Variant Nameをドロップダウンメニューから BarrelWithLid に設定します。
    Set Variant LOPを用いてアセットのバリアントのひとつを抽出します。
     
  6. Set Variant LOPの下に、Null LOP を追加し、名前をBarrelWithLid に変更します。
     
  7. Set Variant LOPとNull LOPを、2つ複製します。
     
  8. Set Variant LOPのVariant Nameをドロップダウンメニューより、 BarrelWithNoLid 及び BarrelNoLidV2 に設定し、Nullノードの名前対応するものに変更します。
     
  9. Scene Graph Treeを確認します。これらのバリアントが/Barrels 下にあることが確認できます。これからこれらのアセットを露店のシーンに「移植」していきます。

     
  10. X from LOPを作成し、名前をShopfrontに変更します。
    Create Primitives下のPrimitive KindAssembly に設定します。
    Xform LOPを追加することで、今回。「Shopfront」と名付けられたUSDファイル構造のトップレベルのTransformとルートフォルダを作成できます。プリミティブの種類を「アセンブリ」にします。これは、より小さなモデルのグループを整理するのに適した方法です。これらの組織構造(アセンブリ、グループ、コンポーネント、およびサブコンポーネント)の詳細については、SideFX社用語集を参照してください。

     
  11. Xfrom LOPの下に、Graft LOP を追加し、先ほど作成したNullノード3つを第2入力に接続します。
    Primitive Pathはデフォルトのままで、中クリックし、Shopfrontが設定されていることを確認して下さい。
    Primitive KindGroup に設定します。
    Destination Path Defaultを以下のように設定します。

    /Barrels⁄` opinput(".", $IIDX)` 

    Graftノードは、文字通りプリミティブをUSD階層に「移植」します。Graft操作の詳細については、SideFX社用語集を参照してください。基本的に、Graftノードは、他のLOPツリーをLOPネットワークに挿入するためのものです。(挿入後のUSDファイルを適切に構築します)
     
    現時点でノードネットワークは以下のようになっております。

    Destination Path Defaultに入力したエクスプレッションの opinput(“.” , $IIDX) についてですが。通常、パラメータのラベル上で中ボタンクリックを行うと、その式の結果が表示されますが。今回の場合、第2番入力の入力が複数存在し、処理がループするため、何も表示されません。適切に名前が付けられたサブフォルダの下のルート/ Barrelsフォルダに入るように、シーンに移植するプリミティブを強制しています。 「opinput」エクスプレッションは、input2の現在の入力の入力番号($ IIDX)を照会することにより、サブフォルダーの名前付けを処理しております。
     

  12. シーングラフツリーが以下のようになっていることを確認して下さい。

    現状、全ての樽アセットの座標が同じため、重なって表示されています。座標を動かすことでビューポート上に全ての樽を表示させてみます。
     
  13. ビューポート上で、Sキー(選択)を押します。ビューポートの上部を見ると、「すべて選択」、「ジオメトリの選択」などを可能にするアイコンの行が表示されます。

    Select Allが選択されていることを確認して下さい。
     
  14. 樽を選択したら、Tキーを押してEdit LOPを作成します。 
     
  15. Enterキーを押してハンドルツールに移行し、T,R,Eキーを使用して、移動、回転、スケールの変更を行います。今回は樽が重ならないように動かします。
    TransfromではなくEditを使ったのはこちらの方がより直観的な操作が可能であるからです。
     
  16. ここからビューポートの設定を少し変更します。
    Editノードを選択した状態で、Use Physicsにチェックを入れます。これでビューポートが物理モードになります。
    この状態で再びハンドルツールに移行し、樽のマニピュレータを操作すると、移動させた樽が他の樽に衝突するようになることが確認できるかと思います。

以上が手動セットアップの手順になります。また、こちらの完成のシーンはLOPS_DEMO_FILESディレクトリ内にFullSceneSetup.hipとして保存されております。

 

Stage Managerとは?

今回は以上のような手順で3つの樽を配置しました。今回配置したアセットは3つでしたが、これを大量に繰り返すことを考えると、この手法では非常に時間がかかってしまいます。
そこでSolarisには
Stage Managerという機能があります。これは、ディスクからアセットを参照し、3D空間上に配置、シーン空間を調整する一連の流れがワンストップロケーションになるように設計されております。
Stage Managerでは入力レイヤーをひとつのレイヤーに
平坦化し、これらの操作を任意の入力で実行できるようにすることができます。
ただし、この機能を使用すると、レイヤースタック内のすべてのレイヤーが結合されてしまいますので利用には注意が必要です。
この「平坦化」を行うことで、USDのサブレイヤ―が効果的に削除されます。
例えば、アニメーションが終わったタイミングで平坦化を行うことで、レイアウトレイヤーとアニメーションレイヤーのふたつのサブレイヤーがなくなります。

FXアーティストとしてステージマネージャーを使用してシーンの一部を置き換える場合、レイアウト部門がアセットを動かしたとしても、上流のネットワークの変更が伝わるのを効果的にブロックしています。
FXレイヤーにおける平坦化されたレイヤがオーバーライドされるので、レイアウト+アニメーション+FXを拾ってくるライティング部門はレイアウトの変更を確認することができません。それだけではなく、FXレイヤーを「ミュート」した状態でも、平坦化を行う前と同じプリミティブを表示する方法はありません。FXレイヤーをミュートすると、単純にプリミティブが消失し、レイアウトレイヤーとアニメーションレイヤーが表示されなくなります。

USDでは何がどこで参照されるかわからないことから、基本的には「削除」を行うことができないことに注意してください。よってUSDでは「ミュート」「可視性」「アクティブ化」がサポートされます。しかし、レイヤーの平坦化ではより弱いレイヤーを効果的に破壊することができます。
そうは言っても、おそらくStage Managerにはかなりの時間を費やすことになります。
しかし、Stage Managerを利用することで、シーンのレイアウト、整理、バリアントの選択にかかる時間を大幅に節約できます。

 

Stage Managerを利用したレイアウト

  1. Houdiniで新規シーンを作成し、construction planeの表示をオンにします。

  2. /stage階層に移動し、Stage Manager LOPを作成して名前をfront に変更します。
     
    Stage Managerよりファイルをロードします。LOPS_DEMO_FILES内にある、末尾が「Aseet.usd」で終わるファイルをロードしていきます。これらのUSDファイルにはマテリアルとバリアントが含まれています。まずはBarrelsAsset.usdから行っていきます。
     
  3. BarrelsAsset.usdファイルをStage Managerパラメータペイン左上のbrowserから選択し、
    Scene Graph Path上に
    ドラッグアンドドロップします。

    この状態でシーンビュー上にはアセットのデフォルトのバリアントが表示されております。別のバリアントに切り替えるにか、以下のふたつの方法が挙げられます。
    A. アセットを選択し、シーンビュー上で右クリック-> Edit Variants (または[CTRL+E]キー)を選択し、バリアントを選択します。
    B. パラメータの「Variants」の横のフィールドをクリックしてバリアントを選択します。
     
  4. Enterキーでハンドルモードに移行し、マニュピレータを動かすことでアセットを任意の場所に配置します。 
      
  5. 同様の手順でセットの前景にアセットを配置していきます。必要に応じてリファレンスのバリアントを変更します。

    Tips
    シーンビュー上で[Ctrl+D]キーを使用することでもプリミティブの複製が行えます。

     

  6. Scene Graph Treeを確認します。今回こちらでは、このようなアセットを配置しました。

    すべてのアセットがUSDツリーのルート直下にあり、煩雑になっていることがわかります。前のチュートリアルでは、緑の[+]ボタンをクリックして、Stage Manager上で本棚を整理しました。同じことはここでも行うことができますが、LOPとUSDの理解を深めるために、今回は別の方法を紹介します。

  7. Xform LOPを作成し、名前をtent_scuneに変更します。
    Create Primitives下のPrimitive KindAssembly に設定します。
     
  8. tent_scuneノードの下にGraft LOPを作成し、第2入力にfrontノードを接続します。
    Primitive KindGroup に設定します。

     
  9. 再度、Scene Graph Treeを確認します。tent_sceneグループを及び下位コンポ―ネントによってツリーが少し整理されたことが確認できます。

     
  10. もうひとつStage Manager LOPを作成し、名前をback に変更し、graft1の第2入力に追加します。
     
  11. 先ほどと同様の手順で、例えばTentAssetを以下のようにシーンの背景に追加していきます。

 

物理ベースのレイアウト

次にテーブルに本を配置してみます。従来の手法だと、この種の配置作業は大変面倒なものでした。しかし、Solarisでは物理ベースでのレイアウトを行うことができるのでこの作業が非常に簡単になります。

ただし、現状、Stage Managerではこの機能はまだサポートされておりませんので、Editノードを接続してレイアウト作業を行います。

  1.  frontノードを選択した状態でStage ManagerBooksAssetを追加します。
     
  2. このアセットを配置したい数分複製し、必要に応じてバリアントの変更を行います。
     
  3. 次にテーブルに本を積み重ねます。Graftノードディスプレイフラグを設定します。
     
  4. シーンビュー上で[S]キーを押して、選択モードに移行し、本を選択します。
     
  5. [Enter]キーを押してハンドルツールに切り替え、Tabメニューからeditと入力してEditツールを起動します。
     
  6. [Shift+P]キーを押すか、シーンビュー上で右クリック -> Use Physics にチェックを入れることで、物体同士が衝突するようになります。

     
  7. この状態で本を動かすことで、積み上げることができます。

 

仕上げとライトの追加

ここでは背景にホリゾント(Cyclorama)を追加します。

  1. 新たにReference LOPを作成し、名前をCycloramaに変更します。
    ※もし、名前を変更しない場合は、Reference File$HIP/LOPS_DEMO_FILES/Library/Assets/Cyclorama/CycloramaAsset.usdを設定する必要があります。
     
  2. Edit LOPの下にGraft LOPを追加し、第2入力にCycloramaを接続します。
    Primitive Path/tent_scene/Background に設定します。
    Primitive KindGroup に設定します。
     
  3. 次に、デフォルトのシーケンスライトを追加します。
    Graft LOPの下にSublayer  LOPを追加します。
    Sublayer TypeSublayer Inputs に設定します。
     
  4. ライトを照射したい位置にシーンビューを移動します。
     
  5. Lights and Camerasシェルフより、Distant LightArea Light[Ctrl]キーを押しながらクリックして作成します。
    各ライトのPrimitive Path/tent_scene/lights/Layout/$OS に設定します。
     
  6. 必要に応じてライトの強度を調整します。
     
  7. シェルフから作成したライトは正しく配線されませんので、以下の画像のようにSublayer LOPの第2入力に接続し直します。

     
    ステージの階層は次のようになります。
    「tent_scene」はアセンブリ、「back」、「front」、「background」はグループ、残りはコンポーネントとなります。

 

USDファイルの保存

  1. Sublayer LOPの下にUSD ROP LOPを接続します。
    Output File$HIP/tutorials/TentScene.usd に設定します。
    Layer Metadata下のDefault Primitive/tent_scene に設定します。
     
  2. [Save to Disk]ボタンをクリックし、このネットワークで生成したUSDファイルを保存します。


こちらのデータの完成版は、 LOPS_DEMO_FILES/Libaray/Layout/FullScene.usd となります。