Houdini 20.0 Solaris

LOPの挙動

Solaris LOP(Lighting Operator)がUSDを生成/変更する際の挙動について説明します。

On this page

まず最初にUSDの基本を読んで、USD用語を理解しておくと良いでしょう。

プロシージャルUSD

USDを編集するには、PrimsのツリーとPrims上のプロパティに変更を加える必要があります。 ツリー上のPrimsを選択してパラメータを直接編集することができるプログラムは、ノードのプロシージャルネットワークをクックした副産物としてツリーを生成/編集するようなHoudiniよりも理解しやすいかもしれません。 しかし、プロシージャルという概念は、USDを扱う上で魅力的な利点がいくつかあります:

  • USDを動的に生成することができます。

    本来のUSDは動的ではありません。 Solarisは、USDの上に動的レイヤーとして動作することができ、エクスプレッション、グローバル変数、スクリプト、データベースクエリ、必要であれば他の入力に基づいて、色々なUSD出力を生成します。

  • USDをプロシージャルに生成することができます。

    例えば、100個のライトのインスタンスが必要であれば、わざわざ100回参照をする必要はなくて、For-Eachループで作成すれば良いだけです。

  • もっと高いレベルで作業することができます。

    例えば、現在のところ、USDには拘束がありません。 Solarisでは、Look Atなどの拘束を用意しており、その拘束はLOPネットワーク内で“活動”しますが、USDを出力する時にベイクされます。

  • LOPネットワークの役立つ部分を再利用可能なデジタルアセットとして出荷することができます。

USDの扱い方

Solarisを使えば、あなたのスタジオのUSDの運用の仕方とパイプラインでのあなたの役割に応じて色々な方法でUSDを扱うことができます。 例えば、以下のワークフローは、HIPファイルとUSDファイルを色々な方法で使用します:

  • 空っぽのHIPファイルから開始して、LOPネットワークを構築し、最後に他の人が利用できるようにUSDを書き出します(例えば、シミュレーションしたジオメトリをベイクします)。

  • USDファイルから開始して、それをLOPネットワークに取り込み、それを修正したり何かを追加して、最後にその修正されたUSDを書き出します。

  • HIPファイルを作成し、LOPネットワーク内でUSDアセットを生成します。次に、LOPsを使ってそれらのアセットを読み込んで、それらのアセットを大きいなシーン/ショットに結合する“ハイレベル”なHIPファイルにします。

USDを扱う上で忘れてはいけない重要な事は、“アセット”とは、ジオメトリやテクスチャだけを意味しているわけではないことです。 USDアセットは、作成と改訂といった何枚ものレイヤーを表現していて、他のファイル(テクスチャやインポートしたジオメトリなど)とのリレーションシップを持っています。

レイヤー

LOPsがUSDレイヤーをどのように制御しているのかを理解することは、LOPsの処理を理解するのに役立ちます。

  • どのLOPノードの出力も、完全に合成されたUSDステージです。

    • 入力と出力を持ったノードは、入力ステージを受け取り、変更する必要のあるPrimsの修正したコピーを使って新しいステージを作成して、その修正されたステージを出力します。

    • ステージのルートレイヤーは、サブレイヤーのスタックを除いて常に空っぽです。

    • これらのサブレイヤーは、LOPノードで作成しても構いません。その場合、LOPノードで作成されたサブレイヤーは、メモリにしか存在しない匿名レイヤー(SOP Import LOPならSOPネットワークからジオメトリをインポートします)またはディスク上のレイヤー(Sublayer LOPはディスクからUSDファイルをインポートします)のどれかになります。

    • LOPノードは、ディスクから読み込まれたレイヤーを直接修正することを許可していません。編集する場合は、読み込まれたレイヤーより上層にあるオーバーライドレイヤーで行ないます。

  • 編集を適用するLOPsは、(通常では)サブレイヤースタック内で 一番強い In-Memoryレイヤーで処理が行なわれます。

    • ルートレイヤーは空っぽなので、つまり、LOPsノードは常にステージ上の一番強いオピニオンを持ったレイヤーを編集することを意味します。 各LOPノードが適用する編集は、ステージ内の他に強いオピニオンでオーバーライドさせることができないので、常にそのレイヤーは可視でなければなりません。

    • 一番強いサブレイヤーがディスク上のファイルである場合、編集を作成する次のLOPノードが自動的にIn-Memory匿名レイヤーを作成して、その編集を保持します。LOPネットワークは決してディスクからのレイヤーを修正することはなく、それより上層のレイヤーでそのレイヤーをオーバーライドするだけです。

    • Solarisでは、 Edit Target というUSDの概念を使用しません。しかし、Load LayerLayer ReplaceEdit Target Layerなどの特別化されたノードを使用して同様の結果を得ることができます。

  • 現在一番強いIn-Memory匿名レイヤーのことを、UIとドキュメントでは アクティブレイヤー と呼んでいます。

  • 一部のLOPノードは、サブレイヤースタック自体を修正します。

    • Merge LOPは、異なるノードチェーンからのレイヤー(ディスク上のレイヤー、In-Memoryレイヤー)を単一レイヤースタックにマージします。

    • Sublayer LOPは、USDファイルからサブレイヤーを読み込みます。

    • 一部のLOPノード(例えば、Layer Break LOPConfigure Layer LOP)は、レイヤースタック上に新しい匿名レイヤーを作成することができます。これらのLOPノードは、別レイヤーで編集(そして、別のUSDファイルで保存)する上でフルコントロールが必要な時に役立ちます。

    • LOPノードにはDebugフラグがあります。このフラグを有効にすると、このノードで加えた変更が常にそのノード自身の別レイヤーに入って、それらの変更内容を簡単に単独表示して検査することができます。

    • Stage Manager LOPは、レイヤースタックを1枚の新しい匿名アクティブレイヤーに平坦化して、そのレイヤーに編集を加えることができます。

    • Sublayer LOPReference LOPは、合成しても変わらない形式でレイヤーを並べ替えて、綺麗な構成でディスク上のUSDファイルを作成することができます。

レイヤーをディスクに保存する方法

USDファイルを直接書き出す“純粋なUSD”ワークフローでは、あなたが求めているレイヤーの合成方法に基づいて、手動でデータをファイルに分けることになります。

ネットワークのクックの結果としてメモリ内にたくさんのレイヤーを生成することができるSolariのプロシージャルワークフローでは、Configure Layer LOPを使って、任意のレイヤーのファイルパスを指定することができます。 レイヤーにファイルパスがあれば、USDを出力する時に、そのレイヤーは、別のUSDファイルに書き出されます。

ディスクからインポート(参照またはサブレイヤー化)したレイヤーは、自動的にそのファイルのインポート元のファイルパスが設定されます。

Layer Breaks(レイヤー分離)

Layer Breaksは、 レイヤーを理解するのに非常に重要です 。 これによって、ディスク上のレイヤーファイルに書き出す内容を制御することができます。

Layer Break LOPは、以下の2つの処理を行ないます:

  • このノードより下流のLOPノードによって修正される新しいアクティブレイヤーを開始します。

  • 既存のすべてのサブレイヤーは、Layer Breakの前に編集済みとしてマークします。

これは、ステージの合成には何も影響を与えません。 シーンビューアでは、Layer Break前に作成されたサブレイヤーの効果がまだ表示されることでしょう。 しかし、Layer Breakは、一部のLOPノードがレイヤーを扱う方法とUSDレンダーノードがUSDとしてレイヤーを書き出す方法を変更します。

基本的には、USDレンダーノードがレイヤーをディスク上のレイヤーファイルに書き出す時、 Layer Break前のすべてが廃棄され 、ディスクには何も書き出されません。

これがなぜ役に立つのか?

あなたがライティング部署で作業していることを想像してください。 背景部署からファイルを受け取ったとします。 このファイルには、背景デザイナーが作成した/Lights/scratch_sun1という名前の適当なライトが使われた景観が含まれています。 あなたは、この適当なライトを削除するレイヤーを用意して、プロダクション品質のライティングを追加する必要があります。

  1. Sublayer LOPを使って、landscape.usdを読み込みます。

  2. Layer Break LOP を接続します。

    これは、 新しいレイヤーをディスクに書き出す時に、このノードより上流には何も含まれていない ことを示します。

  3. 要らないライト(/Lights/scratch_sun1)を選択して、Prune LOPを使って、そのライトを非アクティブにします。

    Note

    Layer Breakは、In-Memoryレイヤーの合成には影響を与えないので、Layer Breakより上流でもこのライトはまだ選択可能です。

  4. 新しいプロダクション品質のライトを追加します。

  5. USDレンダーノードを追加して、そのネットワークをlighting.usdという名前のレイヤーファイルとして書き出します。

    上記で説明したとおり、USDレンダーノードは、Layer Breakより上流のデータを何も書き出しません。 つまり、landscape.usdのどのデータもlighting.usdには含まれません。

    しかし、lighting.usdレイヤーは、/Lights/scratch_sun1を非アクティブにしたというオーバーライドを含んで います (Prune LOPはLayer Break LOPの後に接続したので、そこで編集したアトリビュートはLayer Break LOPの影響を受けません)。

    もちろん、/Lights/scratch_sun1lighting.usdには存在していません。 しかし、後でlandscape.usdの上にlighting.usdレイヤー化 すると、そのPrimパスはマッチして、そのライティングレイヤーは、その不要なライトを非アクティブにします。

そのため、Solarisネットワークでは、データを読み込むことで、 編集用のコンテキスト を用意することができ、ネットワーク内のLayer Break LOPの前に“コンテキストデータ”を置くことで、その“コンテキストデータ”が書き出されないようにすることができます。

ペイロード

デフォルトでは、Houdiniはすべてのペイロードを読み込みます(ペイロードはリファレンスとまったく同じ挙動をします)。 しかし、Configure Stage LOPとScene Graph Treeペイン内のLoad Masksコントロールでは、このデフォルトのペイロードの読み込みを無効にして、読み込みたい特定のペイロードを選択することができます。

  • デフォルトでは、USDステージは 常に すべてのペイロードを読み込みます。 つまり、すべてのペイロードの内容が常にシーングラフツリー内に表示されます。 そのペイロードの内容はLOPノードのプリミティブパターンからマッチさせることができ、LOPノードで編集することもできます。

  • Scene Graph Treeペインでは、 ビューア に表示させるペイロードを選択することができ、そのペイロード内のジオメトリデータを読み込んで描画するかどうかを選択することができます。 さらにLOPネットワークはペイロード内のUSDプリミティブを編集することができます。これはビュー内に表示されているUSDプリミティブにのみ影響します。

ペイロードのアンロード

ペイロードであってもUSDツリーデータを読み込んで合成するのが遅い非常に重いシーンの場合、ペイロードのデータの読み込みと合成を無効にすることができます:

  • Configure Stage LOPは、Houdiniが特定のペイロードの読み込み/クックをしないように指定することができます。

  • 入力のないSublayer LOPは、Houdiniがレイヤー内のペイロードを読み込み/クックしないように指定することができます。

ペイロードがまったくクックされないようにすることで、非常に複雑なシーンの作業を高速化することができますが、ペイロードをクックしなかった場合は以下の結果を招くことを覚えておく必要があります:

  • ペイロードの内容がシーングラフツリー内に表示されません。

  • ペイロードの内容がLOPノードのプリミティブパターンにマッチしなくなります。

  • ペイロードの内容がLOPノードの影響を受けなくなります。

ペイロードを読み込み/クックしなかった場合、そのペイロードプリミティブはScene Graph Treeペイン内では赤いドットで表示されます。 これは、そのペイロードプリミティブを ビューア内に表示することができない ことを示します。 (技術的には、ビューアはディスクからペイロードのジオメトリをストリーム化することができますが、それをしてしまうと、もしペイロードがクックされた時にLOPネットワークがそのペイロードの内容を変更すると誤動作してしまう可能性があります。)

重要なノード

作成

  • 時には、どのノードがレイヤーにどのように影響を与えるのか確認できるように、いくつかのレイヤーを書き込むためだけにいくつかのPrimsを作成したいことがあります。SphereCubeConeCylinderのノードは、このような場合で役に立ちます。

  • Create Xform LOPは、単一のXform Primを作成し、そのトランスフォームを子Primsに適用します。

    Primitive LOPまたはStage Managerを使用することで、簡単に階層全体でXform Primsを生成することができます。

  • Light LOPは、ライトPrimを作成します。

  • Camera LOPは、カメラPrimを作成します。

  • Instancer LOPは、Primまたはポイントインスタンスのどちらかをセットアップすることができます。

レイアウト

  • Transform LOPEdit LOPは、それぞれTransform SOPとEdit SOPに似ています:Transform LOPは、選択したノードに単一トランスフォームを適用するプロシージャルノードです。Edit LOPは、作業する時に別々にPrimを選択して、移動/回転/スケールさせることができるインタラクティブツールで、物理干渉を使ってオブジェクトを自然に配置させることもできます。

SOPの扱い方

  • SOP Import LOPは、SOPのジオメトリをUSDジオメトリPrimとして取り込みます。

  • SOP Create LOPは、そのノード内部のSOPネットワークからの変換で“ゼロから”USDジオメトリを作成することができます。

  • SOP Modify LOPは、USDジオメトリを一旦SOPに変換し、そのノード内のSOPネットワークを介してそのSOPを編集してから、その出力をUSDに戻すことで、USDジオメトリを編集することができます。

  • LOP Import SOPは、USDジオメトリをSOPに取り込みます。

詳細は、SOPジオメトリをUSDにインポートする方法を参照してください。

レイヤーと参照

  • Mergeは、異なるノードチェーンからのレイヤー(ディスク上のレイヤー、In-Memoryレイヤー)を出力内の単一レイヤースタックにマージします。

  • Sublayer LOPは、ファイルからレイヤー(s)をレイヤースタックに取り込みます。

  • Reference LOPは、ファイルからルートPrimと子Primsを取り込み、シーングラフツリー上の特定のブランチに追加します。

  • Stage Manager LOPは、カスタムユーザーインターフェースを使って、一度に簡単にシーングラフツリー内の多くの場所に多くのファイルを参照することができます。

  • Layer Break LOP(上記のLayer Breaks(レイヤー分離)を参照)。

詳細は、参照とサブレイヤーの違いを参照してください。

出力

  • Configure Layer LOPは、レイヤー上にメタデータ値を設定することができます。このLOPを使用することで、In-MemoryレイヤーにSave Pathを追加することができるので、USDに出力する時にそのレイヤーがそのUSDファイルに保存されます。

  • USDレンダーノードは、LOPネットワークで作成されたステージを.usdファイルに書き出します。このノードは、レンダーネットワークまたはLOPネットワークで使用することができます。

    詳細は、USDの出力を参照してください。

  • Karmaレンダーノードは、USDから画像をレンダリングする“one stop shop”です。このノードには、便宜的にRender Settings LOPとRender Product LOPのパラメータが組み込まれています(Render Settings LOPRender Product LOPを使って該当するUSD Primsを別々にセットアップすることもできます)。

ローレベルパワー

  • Edit Properties LOPは、Schema APIを使ってアトリビュート値を編集することができます。これをアセットとしてパッケージ化することもできます。これによって、あなた独自のスキーマアトリビュートを編集するハイレベルなユーザーインターフェースを持ったアセットを作成することができます。

  • Attribute Wrangle LOPは、VEXスニペットを使ってアトリビュートを編集することができます。

  • Graft Stages LOPは、シーングラフツリーからブランチを“取り外し”、それを別の親に“付け替えます”。これを純粋なUSDで行なうとなると、非常に面倒なことでしょう。

  • Python Script LOPは、USD Python APIを使って、編集可能なステージオブジェクトを直接編集することができます。

コンテキストオプション

コンテキストオプションは、Houdini18.0で新しく導入されました。 Edit ▸ Context Options を実行すると、編集可能な一連のグローバルオプションが表示されます。 LOPネットワークでは、新しいオプションまたは新しいオプション値がブロック内にのみ存在するようなブロックを作成することもできます。 @optionnameを使ってエクスプレッション内にコンテキストオプション値を挿入することができます。

例えば、shot_nameグローバルコンテキストオプションを作成して、すべてのレンダーノードがベース名として@shot_nameを使ってファイル名を生成するように設定すれば、1個のグローバルオプションを変更するだけで、すべてのレンダー出力を変更することができます。

詳細は、コンテキストオプションを参照してください。

アニメーション

  • LOPノードは、(Cache LOPを使用しない限りは)常に一度に単一フレームだけをクックします。

    つまり、LOPノードをアニメーションさせていても、そのLOPノードで編集された匿名レイヤーは、1個のタイムサンプルのデータしか持たないことを意味します。 プレイバーでフレームを動かすと、そのLOPノードは再クックされ、そのレイヤーもまた1個のタイムサンプルのデータしか持ちませんが、常に現行フレーム番号でのタイムサンプルになっています。

  • USDレンダーノードを使ってUSDを書き出すと、すべてのフレームがクックされ、USD出力には全時間のサンプルが書き出されます。

  • USDレンダーノードがアニメーションを書き出す方法を参照してください。

  • USDジオメトリをSOPsに取り込む時、そのPrimsが変換される Time は、デフォルトだとシーンの開始フレームです。アニメーションさせたUSDジオメトリを取り込みたいのであれば、 Time$FFに設定します。しかし、この設定によって遅くて非効率になることが多いです。シーン内に取り込んだUSD Packed Prims上のusdFrame IntrinsicをWrangleを使ってアニメーションさせることで、もっと高速に結果を取得することができます。

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レンダリング

チュートリアル