On this page |
概要
ワークアイテムは、HoudiniジオメトリのPointアトリビュートと同様に何かしらの情報を含んだ アトリビュート を持っています。 ワークアイテムに関連付けられているスクリプトまたは実行ファイルにそのアトリビュートを読み込ませることで、そのワークの処理を制御することができます。 アトリビュートは、"親"ワークアイテムから生成されたワークアイテムに渡されるので、このアトリビュートを使用することで、ワークアイテムの結果を子ワークアイテムの処理に影響を与えたり、 ワークアイテムをまとめてグループ化したり、ネットワークを通じて情報を渡すことができます。
カスタムコードにアトリビュートを読み込ませることでワークアイテムの生成を制御することができますが、 アトリビュートを最もよく使うのは、 TOPノードのパラメータ、もしくは、TOPネットワークが参照するHoudiniのネットワークとノードのパラメータからそのアトリビュートを参照する 時です。
-
例えば、異なるレンダー品質を試行錯誤したいとしましょう。
Wedge TOPを使用して
pixelsamples
アトリビュートに異なる値を設定したワークアイテムを生成することができます。すると、ROP Mantra Render TOPの Pixel Samples パラメータでそのアトリビュートを参照できるように
@pixelsamples
を設定することができます。 -
他にも、TOPネットワークからコールされた外部のアセット/ネットワークのワークアイテムアトリビュートを参照することができます。例えば、
HDA Processorはワークアイテム毎にHoudiniアセットをクックすることができます。そのアセットのパラメータに
@attribute
参照を使用することで、そのワークアイテムから値を引き出すことができます。
@attribute.component
を使ってベクトルのコンポーネントを参照することができます。componentは0から始まる数値またはx
, y
, z
(それぞれ0
, 1
, 2
に該当)です。例えば、@pos.x
または@pdg_output.0
です。
アトリビュートタイプ
ワークアイテムは、Houdiniジオメトリとほぼ同様に基本的な文字列配列アトリビュート、浮動小数点配列アトリビュート、整数配列のアトリビュートに対応しています。 どのプリミティブアトリビュートタイプも配列で、その配列長は任意の長さにすることができます。 ワークアイテムにもFileアトリビュートタイプがあります。これは文字列配列と同様ですが、ファイルタグやファイルの更新時刻などのメタデータが格納されています。 Fileアトリビュートは、ワークアイテムInfoパネル内でクリック可能なリンクとして表示され、TOPsのパスハンドリングの仕組みで使用することで、ローカルマシンでもファームマシンでもそのパスを利用可能にすることができます。
複雑に構造化されたデータを必要とするユースケースのために、ワークアイテム上に作成可能なアトリビュートの追加タイプが2つあります。
1つ目のタイプが Python Objectアトリビュート タイプです。
このアトリビュートには単一PyObject値を割り当てることができます。
TOPsは、このPython Objectの文字列表現を使ってアトリビュートの内容に関する基本的な情報を表示することしかできず、ほとんどのノードはそのタイプのアトリビュートに格納されているデータを直接操作することができません。
PDG Python APIを介するか、または、Shotgun系ノードなどのPython Objectアトリビュートを明示的に利用するようなTOPノードでは、このオブジェクトにフルアクセスすることができます。
Python Objectが入れ子配列と辞書オブジェクトで構成されていれば、HScriptで@
オペレータを使ってそのオブジェクト内の値にアクセスすることができます。
例えば、@obj.key.subkey.2.value
はPythonコードのwork_item['obj'].object['key']['subkey][2]['value]
と等価です。
@obj
は常にPython Objectの標準文字列表現を評価します。
これは、Pythonのrepr(work_item['obj'].object)
と等価です。
2つ目のタイプが Geometryアトリビュート タイプです。
このアトリビュートにはネイティブHoudiniジオメトリデータを格納することができます。
このGeometryアトリビュートタイプは、主にGeometry Importや
InvokeのTOPノードで使用し、現行Houdiniプロセスで直接ジオメトリを操作することができます。
Python Objectタイプと同様に、ほとんどのノードはそのアトリビュートに直接アクセスすることも利用することもできませんが、
ワークアイテムを生成するノードがジオメトリを使用できなくてもそのアトリビュートの内容をワークアイテム間で継承させることができます。
SOPネットワーク内の
TOP Geometryノードは、出力ワークアイテム上のジオメトリアトリビュートをSOPsに戻すことができます。
アトリビュートフラグ
ワークアイテムアトリビュートには色々なフラグを設定することができます。 これらのフラグによって、それらのアトリビュートのアクセス方法や他のTOPネットワークでの表現方法が決まります。 よく使用するフラグには、アトリビュートを下流のワークアイテムにコピーしないことを示した No Copy 、プロセス外でクックされた時にアトリビュート値を環境変数としてエクスポートする Env Export があります。 対応しているフラグの全リストは、pdg.attribFlagドキュメントに載っています。
エクスプレッションでアトリビュートを使用する方法(Pull)
TOPネットワークの処理の一部としてノードが"コール"された時(例えば、TOPsがHDA Processorをクックした時、または、
ROP Mantra Renderを使ってフレームをレンダリングした時)、その時点でクックしているワークアイテムのアトリビュートがそのノードの
@attribute
参照に入力されます。
Tip
ビューアで表示するためにノードをクックすると、現在選択されているワークアイテムのアトリビュートがそのノードの@attribute
参照に入力されます。
つまり、ワークアイテムをクリックしてネットワークの変化の出力を表示することで、選択したワークアイテムの出力を反映させることができます。
このような参照のことを"Pull"参照と呼びます。
特定のパラメータでTOPs固有のエクスプレッションを使いたくないのであれば、代わりに別の"Push"の仕組みを使用することができます。 この仕組みだと、TOPネットワークが実行された時に上書きするパラメータを指定することができます。
文字列パラメータ
@attribute
参照は、それ自体がch('../geo1/tx') * 2
のようなエクスプレッションと同様の HScriptエクスプレッション です。
@attribute
参照をHScriptエクスプレッションの一部として使用することで、ノードパラメータの値を計算することができます。
文字列パラメータにエクスプレッションを使用したい場合は、そのエクスプレッションをバッククォート(`
)で閉じなければならないことを忘れないでください。
例えば、ファイルパスのパラメータでワークアイテムのビルトインのoutput
アトリビュートを参照するには、そのアトリビュート参照をバッククォートで閉じなければなりません:
`@pdg_output`
パラメータ内の"通常の"テキストの中にエクスプレッションを組み込むことができます。ファイルパスの中にワークアイテムのフレーム番号を使用する例:
$HIP/output/$OS_`@pdg_frame`.exr
Note
@attribute
エクスプレッションが参照する内容が曖昧な場合(例えば、ジオメトリのPointアトリビュートとTOPワークアイテムのアトリビュートが同じ名前の場合)、TOPワークアイテムアトリビュートよりもSOPアトリビュートが優先されます。
実行時にパラメータの内容を置換する方法(Push)
Wedge TOPを使ってパラメータ値を色々と変更させる時に、他のノードにTOP固有のエクスプレッションを使用したくない場合(例えば、レンダリングしたいROPが他のパイプラインと共有されている場合や手動で使用したい場合)、
実行時にWedgeノードのパラメータ値をWedgeアトリビュートに置換することができます。
レンダリング時にパラメータをオーバーライドする方法は、Wedge TOPのヘルプを参照してください。
ビルトインのアトリビュート
Note
ビルトインのアトリビュートを参照する時は、@pdg_name
を使用します。例えば@pdg_index
です。
index
ノード内のワークアイテムを並べ替える際のキーとして使用します。
name
インターフェース内で個々のワークアイテムを区別するのが簡単です。
frame
このワークアイテムが動作するフレーム番号。もちろん、必ずしもすべてのワークアイテムをレンダリングするわけではありませんが、フレーム番号を格納する必要性が多いので、私たちはビルトインのアトリビュートにこれを入れました。
input
このワークの入力として使用するファイル名のリスト。例えば、そのワークアイテムが"レンダリングした画像の上にテキストを描画する"を表現していた場合、ここには、制御される画像のパスが入ります。
inputsize
入力ファイルの数。
output
このワークの出力として生成されるファイル名のリスト。例えば、そのワークアイテムが"レンダリングした画像の上にテキストを描画する"を表現していた場合、ここには、その画像の上にテキストを描画した出力画像のパスが入ります。
outputsize
出力ファイルの数。
Tip
プロセッサ系ノードは入力のワークアイテムから新しいワークアイテムを生成するので、"親"ワークアイテムのoutput
アトリビュートには自動的に"子"ワークアイテムのinput
アトリビュートが入ります。
アトリビュートパターン構文
Attribute Deleteや
Attribute Copyのようなノードを使用する時、パターンを使用してアトリビュートのリストを指定した方が便利な事が多いです。
PDGには特別なアトリビュートパターン構文が用意されています。
この構文を使用することで、複数アトリビュートに対して動作可能なノード内でマッチさせるアトリビュートを指定することができます。
このパターンは、左から右に向かって適用され、以下に載せている記号を使用してマッチ条件をスペースで区切ったシーケンスで構成します。
Python Scriptまたはカスタムノード内でパターンマッチング機能を使用することもできます。
文字列からpdg.AttributePatternオブジェクトを構築し、そのオブジェクトをpdg.WorkItem.attribMatch関数に使用することで、ワークアイテム上のアトリビュートにそのパターンを適用することができます。
別の方法として、直接pdg.AttributePattern.contains関数をコールすることで、指定したアトリビュート名とタイプでマッチングをすることもできます。
パターン |
意味 |
---|---|
|
すべてのタイプのすべてのアトリビュート名に合致します。 |
|
指定したアトリビュート名に合致します。 |
|
この接頭辞で始まるすべてのアトリビュート名に合致します。例えば、 |
|
この接尾辞で終わるすべてのアトリビュート名に合致します。例えば、 |
|
先行パターンの結果からこのパターンに合致したアトリビュートを除外します。
例えば、 |
|
指定したpdg.attribTypeのアトリビュートにのみ合致するパターンを示した接尾辞。
|
値パターン構文
値パターンを使用することで、標準構文で値のシーケンスを指定することができます。
例えば、Attribute Array TOPノードでパターンを使用することで、文字列配列または数値配列を作成することができます。
パターン内の値は左から右に向かって処理されます。
パターンの間にスペースを入れることで、パターンまたは定数を複数指定することができます。
文字列値に特殊文字を入れたい場合は、その文字列値をダブルクォーテーションで閉じるか、または、その特殊文字の前に\
エスケープ文字を使用することで可能です。
例えば、regular "quoted string" escaped\ string
といったパターンは、['regular', 'quoted string', 'escaped string']
の文字列配列を生成します。
Python Script TOPノードやカスタムノードでも、この値パターン機能を使用することができます。
文字列からpdg.ValuePatternオブジェクトを構築して、そのオブジェクトのpdg.ValuePattern.contains関数を使用することで、値がそのパターンに含まれているかどうかをテストすることができます。
パターンにマッチした値の配列全体がpdg.ValuePattern.floatArray、pdg.ValuePattern.intArray、pdg.ValuePattern.stringArrayの関数で利用可能です。
値の範囲は、開始値と終了値が数値の場合、または、接尾辞が数字の文字列値である場合にのみ使用することができます。
文字列の接頭辞は必ずどちらも同じでなければなりません。
例えば、node1-node10
は有効なパターンですがnode1-other10
は無効です。
値の範囲のステップサイズは、文字列ではなくて必ず純粋な数値でなければなりません。
パターン |
意味 |
---|---|
|
定数。浮動小数点、整数、文字列が使用可能です。 |
|
|
|
ステップサイズを使った値の範囲。浮動小数点シーケンス、整数シーケンス、接尾辞が数字の文字列のみが利用可能です。 |