この記事では、Houdini18.0で新しく実装されたオペレータである、LOPs(Lighting Operator)について紹介します。
プロシージャルUSD
USDを編集するには、プリミティブのツリーとプリミティブのプロパティに変更を適用する必要があります。 ツリー上のプリミティブを選択してパラメータを直接編集できるプログラムは、ノードの手続き型ネットワークをクックする副作用として、ツリーを生成/編集するHoudiniよりも理解しやすいかもしれません。 ただし、プロシージャルなパラダイムには、USDを操作するためのいくつかの魅力的な利点があります。
- USDの動的生成
USDは本質的に動的ではありません。 Solarisでは、USDの上の動的レイヤーとして機能し、エクスプレッション、グローバル変数、スクリプト、データベースクエリ、または必要なその他の入力に基づいて、別のUSD出力を生成できます。
- プロシージャルなUSD生成
たとえば、100個のライトのインスタンスが必要な場合、100個の参照を記述する必要はなく、for-eachループを使用して簡潔に作成することが可能です。
- より高いレベルでの動作
たとえば、現在USDには制約がありません。 Solarisは、LOPネットワークで「ライブ」ですが、USDを出力するときにベイクアウトされるLook Atなどの制約を提供します。
- より高度な再利用性
LOPネットワークの有用な部分を再利用可能なデジタルアセットにバンドルします。
USDを使用する方法
Solarisを使用して、スタジオのUSDへの依存度やパイプラインの場所に応じて、さまざまな方法でUSDを操作できます。
たとえば、次のワークフローでは、HIPファイルとUSDファイルをさまざまな方法で使用します。
- 空のHIPファイルから始めて、LOPネットワークを構築し、最後に他の人が利用できるようにUSD(たとえば、シミュレートされたジオメトリをベイク)を書き出します。
- USDファイルから始めて、LOPネットワークに取り込み、それを修正し、追加し、最後に修正されたUSDを書き出します。
- HIPファイルを作成して、LOPネットワークでUSDアセットを生成します。 次に、LOPを使用してこれらのアセットをロードし、それらを結合してより大きなシーン/ショットにする「高レベル」HIPファイルを作成します。
USDで覚えておくべき重要なことの1つは、「アセット」は単なるジオメトリやテクスチャを意味するものではないということです。 USDアセットは、作成および改訂の複数のレイヤーを表し、他のファイル(テクスチャやインポートされたジオメトリなど)との関係を持っている場合があります。
レイヤー
LOPノードの機能を理解するのには、LOPがUSDレイヤーを処理する方法を理解することが近道となります。
- すべてのLOPノードの出力は、完全に構成されたUSDステージです。
- 入力と出力を持つノードは入力ステージを取得し、変更する必要があるプリミティブの変更されたコピーを持つ新しいステージを作成し、変更されたステージを出力します。
- ステージのルートレイヤーは、サブレイヤーのスタックを除き、常に空です。
- これらのサブレイヤーは、LOPノードによって作成される場合があります。その場合、メモリ内にのみ存在する匿名レイヤー(たとえば、SOP Import LOPはSOPネットワークからジオメトリをインポートします)、またはディスク上のレイヤー(Sublayer LOP ディスクからUSDファイルをインポートします。)になります。
- LOPノードでは、ディスクからロードされたレイヤーを直接変更することはできません。 編集は、ロードされたレイヤーの上のオーバーライドレイヤーに移動します。
- 通常、編集を適用するLOPは、サブレイヤースタック内の最も強力なメモリ内レイヤーに入ります。
- ルートレイヤーは空であるため、これはLOPノードがステージ上で最も強い意見を持つレイヤーを常に編集していることを意味します。 これにより、各LOPノードによって適用された編集は、ステージ内の他の強力な意見によって上書きされないため、常に表示されます。
- 最も強力なサブレイヤーがディスク上のファイルである場合、編集を行う次のLOPノードは、編集を保持するために匿名のメモリ内レイヤーを自動的に作成します。 ネットワークはディスクからレイヤーを変更することはなく、上位レイヤーのレイヤーのみをオーバーライドします。
- Solarisは、ターゲットの編集というUSDの概念を使用しません。 ただし、Load Layer、Layer Replace、Edit Target Layerなどの特殊なノードを使用して同様の結果を得ることができます。
- 現在最も強力なメモリ内の匿名レイヤーは、アクティブレイヤーと呼ばれます。
- 一部のLOPノードは、サブレイヤースタック自体を変更します。
- Sublayer LOPは、USDファイルからサブレイヤーをロードします。
- 一部のLOPノード( Layer Break LOP、Configure Layer LOP など)は、スタックの最上部に新しい匿名レイヤーを作成できます。 これらは、どの編集が異なるレイヤーにあるか(および異なるUSDファイルに保存されるか)を完全に制御する必要がある場合に役立ちます。
- LOPノードにはデバッグフラグがあります。 このフラグがオンの場合、常に独自の個別のレイヤーに配置され、ノードによって行われた変更が常に分離して検査しやすくなります。
- Stage Manager LOPは、レイヤースタックを単一の新しい匿名アクティブレイヤーに統合し、その1つのレイヤーを編集できます。
- Sublayer LOPおよびReference LOPは、レイヤーを合成的に同等の形式に再配置し、ディスク上のUSDファイルをよりクリーンな構造に作成します。
レイヤーのディスクへの保存
USDファイルを直接書き込む「純粋なUSD」ワークフローでは、レイヤーの構成方法に基づいてデータを手動でファイルに分離します。
ネットワークのクックの結果として、多くのレイヤーをメモリ内に生成できるSolarisプロシージャルワークフローでは、Configure Layer LOPを使用して、任意のレイヤーのファイルパスを指定できます。 レイヤーにファイルパスがある場合、USDを出力すると、レイヤーは別のUSDファイルに書き込まれます。
ディスクからインポート(リファレンスまたはサブレイヤー)したレイヤーには、インポート元のファイルに設定されたファイルパスが自動的に設定されます。
レイヤーブレイク
レイヤーブレイクは非常に重要な概念で、ディスク上のレイヤーファイルに書き込まれる内容を制御するものです。
Layer Break LOPは以下の2つのことを行います:
- 次のLOPノードによって変更される新しいアクティブレイヤーを開始します。
- 既存のすべてのサブレイヤーが、レイヤー分割前に作成されたものとしてマークされます。
これはステージの構成には影響しません。 シーンビューアーでは、ブレイク前に作成されたサブレイヤーの効果が引き続き表示されます。 ただし、ブレイクにより、一部のLOPノードがレイヤーで動作する方法、およびUSDレンダリングノードがレイヤーをUSDとして書き出す方法が変わります。
基本的に、USDレンダーノードがディスク上のレイヤーファイルにレイヤーを書き込むと、レイヤーブレイク前のすべてが破棄され、ディスクには書き込まれません。
これの機能はどのような場合に便利になるでしょうか。
例えばライティング部門で作業しているとします。 セットドレッシング部門からファイルを受け取ります。 これには、セットデザイナーによって作成された/Lights/scratch_sun1と呼ばれる仮のライトのある風景が含まれています。仮のライトを削除し、プロダクション品質のライトを追加するレイヤーを作成する必要があります。
- Sublayer LOPを使用して、landscape.usdにロードします。
- Layer Break LOPを追加します。
これは、新しいレイヤーがディスクに書き込まれるときに、このノードの上に何も含めるべきではないことを示しています。 - 仮のライト(/Lights/scratch_sun1)を選択し、Prune LOPを使用して非アクティブにします。
レイヤーブレイクはメモリ内のレイヤーの構成に影響を与えないため、ライトはレイヤーブレイクの上から来たとしても選択できます。 - 新しいプロダクション品質のライトを追加します。
- lighting.usdという名前のレイヤーファイルとしてネットワークを書き出すために、USDレンダーノードを追加します。
上記で説明したように、USDレンダーノードはレイヤーブレイクの上は何も書き込みません。 このファイルには、landscape.usdのデータがlighting.usdに含まれません。
ただし、lighting.usdレイヤーには、/Lights/scratch_sun1を非アクティブ化するというオーバーライドが含まれています。(Pruneはレイヤーブレイクの後であり、作成したアトリビュートには影響しません。)
もちろん、lights.usdには/Lights/scratch_sun1は存在しません。 ただし、後でlandscape.usdの上にlighting.usdを重ねると、プリミティブパスが一致し、ライトレイヤーが仮のライトを非アクティブにします。
したがって、Solarisネットワークでは、データをロードして編集のコンテキストを提供し、ネットワーク内のレイヤーブレイクノードの前に置くことにより、「コンテキストデータ」がディスクに書き込まれないようにすることができます。
重要なノード
作成
- Sphere LOP, Cube LOP, Cone LOP, Cylinder LOP
ノードがレイヤーに与える影響を確認するためのサンプルとしてプリミティブを作成できます。 - Create Xform LOP
単一のXformプリミティブを作成し、その子孫に変換を適用します。 - Primitive LOP, Stage Manager LOP
Xformプリミティブの階層全体をすばやく生成できます。 - Light LOP
Lightプリミティブを作成します。 - Camera LOP
Cameraプリミティブを作成します。 - Instancer LOP
プリミティブまたはポイントのインスタンス化をセットアップできます。
レイアウト
- Transform LOP, Edit LOP
SOPのTransform SOP, Edit SOPに類似しており、Transform LOPは選択したノードに単一の変換を適用し、 Edit LOPは衝突物理学を使用してオブジェクトを自然に配置するなど、作業中にさまざまなプリミティブを選択、移動、回転、スケーリングできるインタラクティブなツールです。
SOPの使用
- SOP Import LOP
SOPからUSDジオメトリプリミティブにジオメトリをインポートします。 - SOP Create LOP
ノード内のSOPネットワークをゼロから作成し、そこから変換されたUSDジオメトリを作成できます。 - SOP Modify LOP
USDジオメトリをSOPに変換し、ノード内のSOPネットワークで実行してから、出力をUSDに戻すことにより、USDジオメトリを編集できます。
レイヤーと参照
- Merge LOP
異なるノードチェーンのレイヤー(ディスク上および/またはメモリ内)を出力の単一レイヤースタックにマージします。 - Sublayer LOP
レイヤーをファイルからレイヤースタックにインポートします。 - Reference LOP
ルートプリミティブとその子孫をファイルからインポートし、特定のブランチでシーングラフツリーにアタッチします。 - Stage Manager LOP
カスタムユーザーインターフェイスを使用して、シーングラフツリーの多くの場所を一度にすばやく参照できます。 - Layer Break LOP
※上記レイヤーブレイク 参照
Output
- Configure Layer LOP
レイヤーにメタデータ値を設定できます。 これを使用して、メモリ内レイヤーに保存パスを与えることができるため、USDをレンダリングするときにUSDファイルに保存されます。 - USD render LOP
LOPネットワークによって作成されたステージを.usdファイルに書き込みます。 - Karma render LOP
USDから画像をレンダリングするための「ワンストップショップ」です。 レンダー設定とレンダー製品のパラメータが組み込まれています。(Render SettingsノードとRender Productノードを使用して、対応するUSDプリミティブを個別に設定することもできます。)
Low-level power
- Edit Properties LOP
スキーマAPIを使用してアトリビュート値を変更できます。 アセットとしてパッケージ化することもできます。 これにより、より高いレベルのユーザーインターフェイスを使用してアセットを作成し、独自のカスタムスキーマアトリビュートを変更できます。 - Attribute Wrangle LOP
VEXスニペットを使用してアトリビュートを変更できます。 - Graft LOP
シーングラフツリーからブランチを「切り離し」、別の親に「再接続」できます。 これは通常、純粋なUSDで行うのは非常に面倒です。 - Python Script LOP
USD Python APIを使用して、編集可能なステージオブジェクトを直接変更できます。
コンテキストオプション
コンテキストオプションはHoudini 18.0で新しく追加されました。 Edit -> Context Optionsを使用して編集できるグローバルオプションのセットがあります。 LOPネットワークでは、ブロック内にのみ新しいオプション、または新しいオプション値が存在するブロックを作成することもできます。 @optionnameエクスプレッションを使用してコンテキストオプション値を挿入できます。
たとえば、shot_nameグローバルコンテキストオプションを作成し、@ shot_nameをベースとしてファイル名を生成するようにすべてのレンダーノードを設定し、1つのグローバルオプションを変更するとすべてのレンダー出力が変更されます。
アニメーション
・LOPノードは常に一度に1つのフレームのみをクックします。(Cache LOPを使用する場合を除く)
つまり、アニメーション化されたLOPノードを使用している場合でも、LOPノードによって作成された匿名レイヤーには、データの単一の時間サンプルしかありません。 プレイバーでフレームからフレームに移動すると、LOPノードがリクックし、レイヤーにはまだ1つのタイムサンプルしかありませんが、常に現在のフレーム番号のタイムサンプルになります。
- USDレンダーノードを使用してUSDを書き出すと、すべてのフレームをクックし、フルタイムのサンプルをUSD出力に書き込むことができます。