LOPs 導入チュートリアル4: ショットレイアウト


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

ここでは既存のシーケンスレイアウトを利用して、いくつかショットレイアウトを作成します。
実際の制作現場では、各ショットレイアウトはプロジェクトやシーケンスレイアウトに基づいている可能性があります。
全てのショットはショット固有のカスタマイズ(ショットカメラ、レイアウト、アニメーション、FX)を取得します。

デフォルトレイヤーを作成する

まず、いくつかのデフォルトレイヤーを作成します。
レイヤーの概念はUSDにおける非常に重要な概念ですので、SideFX社用語集を確認しておくことを推奨します。

シーケンスレイアウトを最初のレイヤーとして取り込み、次に、アニメーション、FX、ライティングの3つのデフォルトのレイヤーを作成します(この時点でレイヤーは空です)。
チュートリアル3で作成したファイルを利用することもできますが、今回はLOPS_DEMO_FILES内のデータを利用します。

  1. Houdiniで新規シーンを作成します。
     
  2. DesktopSolarisに変更します。
    DesktopにSolarisがない場合は、Scene Graph Treeペインを作成してください。
     
  3. /stage 階層に移動します。
     
  4. Sublayer LOPを作成し、名前をSeq_Layoutに変更します。
    FIle$HIP/LOPS_DEMO_FILES/Library/Layout/FullScene.usd に設定します。
     
  5. Seq_Layoutノードの下に新たにSublayer LOPを接続し、名前をSeq_Animation に変更します。
    Handle Missing FilesIgnore Missing Files に設定します。
     
  6. Seq_Animationノードを2つ複製します。名前をSeq_FX 及びSeq_Lighting に変更します。

ここで、Scene Graph Layers ペイン上(またはSeq_Lighting右クリック ->LOP Actions -> Inspect Layers)でレイヤーを確認します。
空のレイヤーは表示されないことがわかるかと思います。

 

レイヤーブレイク

次の作業に進む前に、 Layer Break LOPを追加する必要があります。
このチュートリアルではステージに進む前にレイヤーブレイクを行っております。レイヤーブレイクを行うと、USDファイルを書き出すときにLayer Break LOPより上のすべてのものが無視されます。この意味を理解することが、効率的なUSDファイルを生成するための鍵となります。

LOPにおいて、一番避けたいことはデータの複製です。 Layer Break LOPは、これを実現するための手段となります。
ビューポート上に表示される結果は、データの重複の有無には影響しません。これは、LOPにおける課題の1つです。ディスク上のビューポート/画像ファイルのファイナルの画像にしかに関心がない場合は、シーングラフ階層にあらゆる非効率的な変更を加えても問題はなく、ほとんどのノードツリーでは、レンダリングイメージとして期待される最終結果が得られます。ただし、効率的なUSDファイルをディスクに書き出すためには、それとは異なるルールセットに従う必要があります。
新しいレイヤーを作成するとき、そのレイヤーが保存される場所、およびそのレイヤーが他のレイヤーにどのように含まれるかをScene Graph Layersを確認しながら常に意識する必要があります。

詳細につきましては、こちらの記事のレイヤーブレイクの項をご確認ください。

 

シーケンスのオーバーライド

デフォルトのライトを無効にします。

  1. Seq_Lightingの下にLayer Break LOPがまだ接続されていなければ、Layer Break LOP を接続します。
     
  2. Layer Break ノードの下に新たにPrune LOPを接続します。
    Primitive Pattern/lights/Layout/* に設定します。
    MethodDeactivate に設定します。
     
    非アクティブ化(Deactivate)は、シーンライティングを削除してキャラクター固有のライトを注視する際など、何らかの効果なしにシーンを確認する際によく使用されます。
    Houdiniと同じように、「アクティベーション」と「表示」は異なる概念です。 ただし、Houdiniでは、ライトの「表示」をオフにしても、シーンへのライトの寄与には影響しませんが、LOP / USDでは、ライトの表示をオフにすると、実際にはその寄与がオフになります。
    LOP / USDでは、ほとんどの場合において、「アクティベーション」と「可視性(表示/非表示)」の間に違いはありません。 

 

ショットのオーバーライド

次に、いくつかのショットオーバーライドを行います。 ショットカメラを作成してから、ショットライティングを追加します。 その後、他のショットにおいても同様のことを実施します。

カメラ

実際の制作現場であれば、この時点で既にカメラはUSDファイルとしてアセット化している場合もあるかと思いますが、今回はチュートリアルですので、ここでカメラを作成します。

  1. カメラを配置したい位置にシーンビューを動かします。
     
  2. Cameras and Lights シェルフより、[Ctrl]キーを押しながらCameraをクリックすることでカメラを作成します。
    必要に応じて、微調整を行った上、名前を
    shot001_cam に変更します。
    Primitive Path/Scene/Cameras/$OS に設定します。

更なるショットのオーバーライド

以下のLOPネットワークの画像を参考に、さらにシーケンスよりショットを作成します。 すべてのチェーンの最後にNullノードを追加し、名前をショットの名前に変更します。

  • Shot002では、カメラのみ新たに作成します。
  • Shot003では、プロップ(樽のアセット)をひとつ移動しています。
  • shot004では、Prune LOPを利用してshot_001において作成したカメラのみを削除して、ライトのみにしたものと、新たに作成したカメラをとMerge LOPで取得しています。
    Prune LOP のPrimitive Pattern/Scene/Cameras/shot* に設定します。
    MethodDeactivate に設定します。
    ※各カメラのPrimitive Pathに「/Scene/Cameras/$OS」が入力されていることを確認してください。
    Merge LOPのMerge StyleFlatten into Input Layer に設定します。


カメラの場合、「Make Invisible」は単にカメラを非表示にしますが、カメラ自体は使用可能です。
「Deactivate」にすると、カメラが表示されなくなり、かつ使用することができなくなります。

USDの場合、「アクティベーション」と「可視性」はほぼ全ての場合、同一であると紹介しましたが、カメラはこの例外となります。

また、Scene Graph Treeを確認しますと 「/Scene」プリミティブの下で、すべてがグループ化されていることが確認できるかと思います。 これにより、プリミティブがひとつになったことで、Sublayer LOPを使用して、別のUSDステージにプリミティブを取り込むことができます。

 

ショットスイッチャーの作成

ここまでで、4つのショットを作成することができました。次に、後流工程の部門の為にショットのピックアップを行い、各ショットごとにUSDを出力するようなネットワークを作成します。

  1. Switch LOPを作成して各ショットのNullノードを順番通りに入力に接続します。
    Input Name Default`opinput(“.”, chs(“input”))` に設定します。

Switch LOPはSwitch SOPと同様の手順で利用することが可能です。ここでは、opinput()関数を利用して、デフォルトの名前を選択された入力ノードの名前を参照するようにしています。

 

シーケンスレベルのレイヤーブレイクを追加する

次に、最終的なUSDファイルにシーケンスレベルのプリミティブを追加します。 ただし、各ショットのUSDファイルにそのショットに属するプリミティブのみが含まれ、他のプリミティブは他のプロセスによって含まれるようなパイプラインではこの処理は必要ありません

しかし、この構造を表すUSDファイルツリー全体を再度書き出すことは望ましくなく、元ファイルへのポインタ参照が望まれます。 Merge LOPではこれを単純に入力に接続するだけで実現が可能です。

  1. Merge LOPをSwitch LOPに追加し、Seq_Lighting Sublayerノードを入力に追加します。
     
  2. [Shift+R]キーで接続順を入れ替えます。

 

USDファイルを出力する

  1. Merge LOPの下にUSD ROP LOPを追加します。
     

  2. Switch LOPのInput Name Default FieldCopy Parameterします。
     
  3. USD ROPノード上のOutput Path$HIP/tutorials/ を入力します。
     
  4. 更にOutput Pathを右クリックしてPaste Relative References をクリックします。
     
  5. ファイルパスの末尾に _layout_v001.usda を追加します。
    ※usda形式を利用すると、ファイルがASCII形式で保存されるので、後でテキストエディタでファイルを確認することができます。
     
  6. Switch LOPのSelect Input0に設定し、USD ROP LOPの[Save to Disk]ボタンを押すことで、shot001のシーンがUSDファイルとして出力できます。
     
  7. 同様の手順で、shot002-004についても出力を行います。

これで、レイアウト部門が作成したショットとなる、4つのUSDファイルが保存されました。
次のチュートリアルでは、今回作成したUSDファイルのひとつをロードし、USDファイルを調べて内部を確認し、
その上でFX部門として作業を行い、新しいUSDファイルをエクスポートします。

 

作業内容を確認する

まず、Houdini内でのステージの様子を見てみましょう。 LOPsでは、Scene Graph Tree Scene Graph Layersの両方を確認する必要があります。 これらを監視しながら、LOPネットワークを確認し、LOPのバイパスや、パラメータの変更を行います。 ここではいくつかの例を示します。

  1. prune camera LOP バイパスします。 Scene Graph Treeで何が起こるでしょうか。
     
  2. Layer Break LOPをバイパスします。 Scene Graph LayersScene Graph Treeでは何が起こるでしょうか。
     
    レイヤーブレイクをバイパスしても、Scene Graph Treeには目に見える変化はありません。 したがって、このシーンをレンダリングするだけであれば、バイパスには気付かない可能性があります。
     
    ただし、Scene Graph Layersでは、レイヤーブレイクをバイパスすることでシーケンスレベルプリミティブツリーが2つ表示されることがわかります。これより、バイパスすることで、冗長的で非効率なUSDファイルが作成されてしまっていることが確認できます。

次に、shot_004用に保存した.usdaファイルを確認します。 まずテキストエディタ等で開き、最上部に以下のような記述があることを確認します。

#usda 1.0
(
    endTimeCode = 29
    framesPerSecond = 24
    metersPerUnit = 1
    startTimeCode = 29
    subLayers = [
        @../LOPS_DEMO_FILES/Library/Layout/FullScene.usd@
    ]
    timeCodesPerSecond = 24
    upAxis = “Y”
)

プリミティブの情報がファイルパスのポインタとして参照されており、実体はこのファイル上には存在しないことが確認できます。

次に、Layer Break LOPをバイパスして再度USD ROP LOPより.usdaファイルを出力し、ファイルを確認します。先ほどのファイルが5KBほどだったのに対し、こちらのファイルは1.6MBと、非常に容量が大きくなっている事が確認できます。
テキストエディタ等で開きますと、実際のプリミティブの情報などがUSDファイル上に書き込まれていることが確認できます。