Houdini 20.0 Solaris

LOPs入門チュートリアル 4 レイアウト部署編: ショットレイアウト

前回作成したシーケンスレイアウトを使って、シーン内にいくつかアセットを配置して、“ショット”レベルでそれらのアセットを動かしていきます。これは、プロダクションパイプラインのステージの1つである レイアウト の小規模版です。

On this page

はじめに

まだ準備ができていない方は、必要なサポートファイルをダウンロードしてください。 このチュートリアルは単独で学習できるようになっているので、これまでのチュートリアルのアセットは不要ですが、サポートファイルは必要です。

このチュートリアルでは、再度“レイアウト”部署の役を演じましょう。 今回は、既に作成されたシーケンスレイアウトをベースに、いくつかショットレイアウトを作成します。 プロダクション環境では、各ショットレイアウトは、プロジェクトレイアウトまたはシーケンスレイアウトをベースにすることがほとんどです。 どのショットでも、例えばショットカメラ、レイアウト調整、FX、アニメーションなどのショット特有のカスタマイズが必要です。

さらに、USDの非常に重要な特徴であるレイヤーの凄さについて体験しましょう。

では、始めましょう。作業の度にlops_tutorial_4.1.hipのような名前でファイルを頻繁に保存することを忘れないでください。

開始

  • 新規でHoudiniを起動します。

  • Solaris デスクトップに切り替えます。

    Scene Graph Tree がパネルのどれかになっていることを確認します。

  • ネットワークエディタで、/stageに移動します。

    Note

    Houdini内のどのレベルでもLOPネットワークを作成することができますが、わかりやすくするために、/stage内で作業しましょう。

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

何枚かデフォルトレイヤーを作成することから始めます。 レイヤーレイヤー化 の概念は、USDの凄さを理解する上で重要なので、 必ず用語集のレイヤーに目を通してください

1枚目のレイヤーとして シーケンスレイアウト を取り込んでから、他の3枚の(現在は空っぽの)デフォルトレイヤーとして アニメーションFXライティング を作成していきます。 もちろん、パイプラインではもっと多くの部署が存在すると思いますが、このセットアップが非常に一般的です。

SideFXからダウンロードしたレイアウトを使うつもりですが、直近のチュートリアルで作成したレイアウトを使用しても構いません。 ただ微妙に違いがあるので、ここで説明されたとおりに従うことを推奨します。

  • Sublayer LOPを作成します。名前をSeq_Layoutに変更します。

    File

    $HIP/LOPS_DEMO_FILES/Library/Layout/FullScene.usd

  • このSeq_Layout LOPにもう1つ Sublayer LOP を接続します。名前をSeq_Animationに変更します。

    Handle Missing Files

    Ignore Missing Files

  • Seq_Animation LOPをコピーアンドペースして、それをSeq_Animation LOPに接続します。

  • 同じように再度コピーアンドペースして、それぞれ Seq_FXSeq_Lighting という名前に変更します。

これで一体何が達成できたのでしょうか? Scene Graph Layers パネル(またはノード上で ▸ LOP Actions ▸ Inspect Layers )を見てみると、レイヤーが空っぽではないことが分かります。 これらのレイヤーは、基本的にアーティストに何のレイヤーが必要なのかを思い出させるために、ここにあります。

Layer Break(レイヤー分離)

他の何かの操作をする前に、Layer Break LOPを追加する必要があります。 このチュートリアルの最後までスクロールして、これから行なう操作の概要を確認してみると、 ステージに“何かを”開始する前に Layer Break が発生していることがわかります。 これが意味する事は、USDファイルを書き出す際に、 Layer Break LOPより上流のすべてのレイヤー が無視されるという事です。 このLayer Breakを理解する事が、USDファイルを効率的に生成する上で重要です。

私たちが やりたくない 事は、データを重複して持つことです。 Layer Break LOP は、それを回避するのに重要になってきます。

ビューポートに表示される最終結果は、データが重複しているかどうかに関係なく同じです。 このLayer Break LOPは、LOPsに関する挑戦的なノードの1つです。 ビューポート/ディスク上の画像ファイルでの最終画像にしか興味がないようだと、シーングラフ階層に対して、あれよこれよと非効率に変更を加えてしまいます。 たいていのノードツリーなら多かれ少なかれレンダリング画像としてあなたが求めている最終結果が得られることでしょう。 しかし、USDファイルをディスクに効率的に書き出せるようにしたい場合、まったく異なったルールに従わなければなりません。 新しいレイヤーを作成するタイミング、そのレイヤーの保存場所、そのレイヤーを他のレイヤーに含ませる方法を常に意識しなければなりません。 Scene Graph Layers Panel を見張ってください。

詳細は、LOPの挙動Layer Breaks(レイヤー分離) セクションを参照してください。

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

デフォルトのライティングを非アクティブにしようと思います。

  • まだLayer Breakを実行していない場合は、ノードチェーンにLayer Break LOPを接続します(このチュートリアルの最後付近にある完成したLOPネットワークの画像が参考になります)。

  • Prune LOPを接続します。

    Primitive Pattern

    /lights/Layout/*

    Method

    Deactivate

    Note

    Prune LOP のPrimitive Patternパラメータを一番簡単に設定する方法は、 Scene Graph Tree からドラッグすることです。

Deactivate(非アクティブ化)は、何かしらの効果を無効にしてシーンを可視化したい時によく使用します。 例えば、キャラクタに特化したライトを表示させたいのであれば、シーンのライティングを削除した方が良いでしょう。 Houdiniと同様に、アクティブ化と表示は考え方が異なります。 しかし、Houdiniでは、ライトの表示を無効にしても、そのライトのシーンへの寄与には何も 影響しません 。 LOP/USDでは、ライトの表示を無効にすると、実際にその寄与が 無効になります 。 そのため、今回の場合(ほとんどの場合)だと、アクティブ化と可視性には違いがありません。

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

では、ショットのオーバーライドをいくつか実行していきます。 ショットカメラを作成して、ショットライティングを追加することから始めます。 その後、他のいくつかのショットで同様の操作を続けます。 このチュートリアルの最後付近にある完成したLOPネットワークの画像を見て、これから行なう操作の概要を確認します。

カメラ

もちろん、洗練されたパイプラインでは、カメラは既に出荷されて、サブレイヤーとして読み込めるようにUSDファイルとして利用可能になっていることでしょう。 しかし、ここでは、このチュートリアル用にカメラを作成します。

  • 好みの視点になるようにシーンビューをタンブルします。

  • Cameras and Lights シェルフタブをクリックして、 Camera アイコンをCTRL + クリックします。これによって、そのビューでカメラが作成されます。 必要に応じて、そのカメラ視点のビューをロックした状態で、ビューポートを動かして、そのビューを微調整します。

    • このカメラの名前をshot01_camに変更します。

      Primitive Path

      /Scene/Cameras/$OS

ライト

  • さきほど説明した方法を使って、ショット固有のライティングを追加します。

もちろん、最終的なライティングは、後でライティング部署が行ないますが、通常作業やライティング前の他の部署で何か役立てるようにするために、レイアウト部署で特別な時刻指定ライトを配置しても構わないでしょう。

このセクション(ショット固有のライティングを作成)をスキップしたいのであれば、単に上流の Prune LOPを無効にしてください。

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

以下に示した完成したLOPネットワークの画像を参考にして、シーケンスに対してもっとショットの作成を続けます。 すべてのチェーンの最後にNull LOPを接続して、そのショットの名前に変更してください。

  • shot_002では、新しいカメラを追加しただけです。

  • shot_003では、プロップの1つを動かしました。

  • shot_004では、 Prune LOP (カメラを削除して、ライトを残します)を使ってshot_001からライティングを取得して、 Merge LOP (シーンにライトをレイヤー化)を追加しました。

    • Prune LOP:

      Primitive Pattern

      /Scene/Cameras/Shot* (“shot”で始まるすべてのカメラを削除します)

      Method

      Deactivate

    • Merge LOP:

      Merge Style

      Flatten Into First Input Layer

  • 重要: 各カメラの Primitive Path は、どれも/Scene/Cameras/$OSにしてください。

Note

カメラ に関しては、“Make Invisible”は、単にカメラを非表示にするだけで、そのカメラはまだ存在していて利用可能です。 “Deactivate”は、そのカメラを非表示にし、且つ、利用不可にします。 この挙動は、USDの他のほとんどのPrimsと 異なる ことに注意してください。他のPrimsでは、“アクティブ化”と“可視化”は同じです。

上図のshot004 Null LOPを選択してから、 Scene Graph Tree を見てみると、Prune(削除)したライトがまだそこに存在しているものの、アクティブにはなっていないことに気づくことでしょう。 USDでは、(他の何かがそれを参照しているかもしれないので)何も削除されないことを忘れないでください。 Scene Graph Tree 内の Layout Xform をアクティブにすると、シーケンスライトを表示することができます。 必要に応じて Layout Xform 下のライトをアクティブにすることができます。

/Scene Prim下ですべてのPrimsがどのようにグループ化されているのかにも注目してください。 (Sublayer LOPを使用すると、1個のPrimだけを取り込むことができるので)このステージは、 後で Sublayer LOP を使って他のUSDステージに取り込むことができます。

ショットスイッチを作成する

他の部署に渡せるようにUSDファイルを書き出す準備が整いました。 このファイルには、4つのショットが入っていて、ショット毎に1個のUSDファイルを書き出したいです。 以下には、その単純な方法を説明しており、明らかに洗練されたパイプラインでは、これをもっとプロシージャルにすることができます。

  • Switch LOPを追加し、以下のネットワークの画像のように、4つのショットを接続します。

    Input Name Default
    `opinput(“.”, chs(“input”))`

上記のエクスプレッションは、現行の“Select Input”パラメータに呼応したノードの名前を取得します。 つまり、Select Inputパラメータのスライダを“0”に動かすと、このエクスプレッションはshot001を返し、“1”に動かすと、shot002を返します。 “Input Name Default”パラメータのラベルをクリックしてからスライダを動かすと、その値を確認することができます。 もし、これが機能しないようでしたら、 Choose Input By Input Name を使った方法を試してください。

シーケンスレベルのレイヤーを追加し直す

パイプラインによっては、これが不要である場合があります。 一部のパイプラインでは、ショットのUSDファイル毎に、そのショットに属したPrimsのみを格納し、それ以外のPrimsは、他の工程でプロシージャルに格納します。 しかし、ここではそのような贅沢はせずに、最終USDファイルには、シーケンスレベルのPrimsを格納したいです。

しかし、再びこの構造を表現したUSDファイルツリー全体を書き出したくないです。 単にオリジナルファイルを指したポインタだけが欲しいです。そして、それらのPrimsを単にツリーにマージしたいだけです。

  • Switch LOPMerge LOPを追加して、下図の完成したLOPネットワークのように接続します。

USDファイルを書き出す

  • Merge LOPUSD ROP LOPを接続します。

    • 上流のSwitch LOPの“Input Name Default”パラメータのフィールド上で ▸ Copy Paramater を選択します。

    • USD ROP LOPのOutput Fileパラメータで、まず最初に、USDファイルの保存先となるディレクトリを入力します。

      • 例: $HIP/tutorials/

    • 次に、そのパスの最後をクリックしてカーソルを置いた状態で、 ▸ Paste Relative References を選択します。

    • そのパスの最後に_layout_v001.usdaを足します。

    Note

    usdaファイル形式を使用すると、ASCIIファイルで保存されるので、後でテキストエディタを使ってその出力結果を読み込むことができます。

  • 次に、 Switch LOP でスライダを0に動かしてから、USD ROP LOPのSave to Diskボタンを押すと、shot001のUSDが保存されます。

    • 残りの3つのショットも同様に繰り返します。

これで、レイアウト部署から出荷されたショットの状態を表現した4つのUSDファイルが保存されました。 次のチュートリアルでは、これらのUSDファイルの1つを読み込んで、そのレイヤー上にFX作業を行なって、FX部署による変更を含んだ新しいUSDファイルをエクスポートします。 が、その前に、それらのUSDファイルを調べて、その中がどうなっているのか見てみましょう。 では、シーンファイルを保存してください。

ここまでの作業を振り返る

まず最初に、作成したステージがHoudini内でどのように見えるのか確認してみましょう。 Scene Graph TreeScene Graph Layers Panel の両方を開いてください。 これら2つのビューアを見張りつつ、LOPネットワークをパンさせて、一部のLOPを無効にしたり、パラメータを変更してみます。 以下にいくつか例を載せます:

  • prune camera という名前を付けたLOPを無効にします。 Scene Graph Tree で何が起きたでしょうか?

  • Layer Break LOPを無効にします。 Scene Graph Layers Panel で何が起きたでしょうか? Scene Graph Tree で何が起きたでしょうか?

    • Layer Break を無効にしても、 Scene Graph Tree では何も見た目は変わりません。そのため、あなたの目的がこのシーンのレンダリングであれば、この問題に気づかないことでしょう。

    • しかし、 Layer Break LOP を無効にすると、シーケンスレベルのPrimツリー全体を Scene Graph Layers Panel 内に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”
)

シーケンスレベルのPrimチェーン全体が単にディスク上のファイルへのポインタになっていることに注目してください。

次に、 Layer Break LOP を無効にして、再度.usdaファイルに保存します。 まず第一に、この新しいファイルが以前のファイルと比較してどれほど大きいのかに注目してください… 約5KBから1.6MBに増えました。 テキストエディタでこのファイルを開くと、全体のシーンレベル構造が2回含まれています: 1回目がファイルポインタとして、2回目が巨大なASCIIテキストブロックとして含まれています。

仕上げ

では、次のチュートリアルに進む準備ができました。 ここで保存したusdaファイルを次のチュートリアルで使用します。

Solaris

USD

ジオメトリ

  • SOP Geometry I/O

    HoudiniがSOPジオメトリをUSDに変換する方法、その工程を制御する方法の詳細。

  • Component Builder

    Component Builderツールは、マテリアル、バリアント、ペイロード、レイヤーをサポートし、SOPからUSDモデルを作成するためのネットワークスニペットを配置します。

レイアウト

  • Editノード

    ビューア内でインタラクティブにPrimsをトランスフォームさせます。物理衝突を使用して、プロップを現実的に配置することができます。

  • Layoutノード

    インスタンス化されたUSDアセットをシーンに取り込むツールが備わっています。個々にコンポーネントを配置したり、カスタマイズ可能なブラシを使って色々な方法でコンポーネントをペイント/スキャッターしたり、既存のインスタンスを編集することができます。

  • カスタムレイアウトブラシ

    Layout LOPの挙動をカスタマイズして利用可能なレイアウトブラシデジタルアセットの作成方法。

ルック開発

  • MaterialX

    HoudiniにはMaterialXシェーダノードに呼応させたVOPノードが用意されています。これらのノードを使用してシェーダネットワークを構築したり、既存のMaterialXベースのシェーダをインポートすることで、(HoudiniのUSDレンダラーの)KarmaでMaterialXシェーダノードを利用することができます。

  • UDIMパス

    テクスチャ空間の異なるタイルを、それぞれ別の解像度で、異なるテクスチャファイルにエンコードすることができます。その後、kaiju.exrといったテクスチャファイル名を指定すると、Houdiniがロード時にそのトークンを特定のタイルアドレスに置き換えてくれます。

  • シェーダ変換フレームワーク

    シェーダノードのUSDプリミティブへの変換を含む、Solarisシェーディングフレームについて説明しています。

Karmaレンダリング

チュートリアル