Houdini 20.0 PDG/TOPsを使ってタスクを実行する方法

アトリビュートの使い方

TOPアトリビュートはPointアトリビュートのようなもので、TOPアトリビュートを使用することで、ワークアイテムからコールされたHoudiniノードのパラメータを設定することができます。

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です。 pdgattribvalsを使用することで、アトリビュート配列のすべてのコンポーネントをスペース区切りの文字列として参照することができます。

アトリビュートタイプ

ワークアイテムは、Houdiniジオメトリとほぼ同様に基本的な文字列配列アトリビュート、浮動小数点配列アトリビュート、整数配列アトリビュートに対応しています。 どのプリミティブアトリビュートタイプも配列で、その配列長は任意の長さにすることができます。 ワークアイテムにもFileアトリビュートタイプがあります。これは文字列配列と同様ですが、ファイルタグやファイルの更新時刻などのメタデータが格納されています。 Fileアトリビュートは、ワークアイテムInfoパネル内でクリック可能なリンクとして表示され、TOPsのパスハンドリングの仕組みで使用することで、ローカルマシンでもファームマシンでもそのパスを利用可能にすることができます。

複雑に構造化されたデータを必要とするユースケースのために、ワークアイテム上に作成可能なアトリビュートの追加タイプが2つあります。 1つ目のタイプが Python Objectアトリビュート タイプです。 このアトリビュートには単一PyObject値を割り当てることができます。 TOPsは、このPython Objectの文字列表現を使ってアトリビュートの内容に関する基本的な情報を表示することしかできず、ほとんどのノードはそのタイプのアトリビュートに格納されているデータを直接操作することができません。 PDG Python APIを介するか、または、ShotGrid系ノードなどの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 ImportInvokeのTOPノードで使用し、現行Houdiniプロセスで直接ジオメトリを操作することができます。 Python Objectタイプと同様に、ほとんどのノードはそのアトリビュートに直接アクセスすることも利用することもできませんが、 ワークアイテムを生成するノードがジオメトリを使用できなくてもそのアトリビュートの内容をワークアイテム間で継承させることができます。 SOPネットワーク内のTOP Geometryノードは、出力ワークアイテム上のジオメトリアトリビュートをSOPsに戻すことができます。

アトリビュートフラグ

ワークアイテムアトリビュートには色々なフラグを設定することができます。 これらのフラグによって、それらのアトリビュートのアクセス方法や他のTOPネットワークでの表現方法が決まります。 よく使用するフラグには、アトリビュートを下流のワークアイテムにコピーしないことを示した No Copy 、プロセス外でクックされた時にアトリビュート値を環境変数としてエクスポートする Env Export があります。 対応しているフラグの全リストは、pdg.attribFlagドキュメントに載っています。

グローバル vs. ワークアイテムアトリビュート

デフォルトでは、アトリビュートを操作するノードは、自身のワークアイテム上に直接そのアトリビュートを作成します。 このようなアトリビュートのことを ワークアイテムアトリビュート と呼びます。 とはいえども、アトリビュートデータを グローバルに TOPグラフ(/topnet)自体に格納することで、アトリビュートがそのTOPグラフ内のすべてのノードにアクセスできるようにすることもできます。 このようなアトリビュートのことを グローバルアトリビュート と呼びます。

グローバルアトリビュートは、Attribute Create TOPノードを使用したり、Python Script TOPノードまたはPython Processor TOPノードでPDG Python APIを使用することで作成することができます。

シーン内に同じ名前のワークアイテムアトリビュートが存在しない場合に限っては@アトリビュート名構文を使うことで、または、PDG Python APIでアトリビュートデータの生成/照会するどれかのメソッド(例えば、pdg.AttributeOwnerpdg.Graphサブクラス)を使うことで、グローバルアトリビュートにアクセスすることができます。

グローバルアトリビュートはワークアイテムに バインド することができます。 つまり、ワークアイテムを削除すると、そのワークアイテムにバインドされているすべてのグローバルアトリビュートもグラフから削除されます。 これは、特定のワークアイテムで実行される処理がグローバルアトリビュートを生成する場面で役立ちます。 例えば、ワークアイテムが設定ファイルを読み込んで、そのファイルで見つかったフィールドに基づいてグローバルアトリビュートを設定する時がそうです。

Notes

  • グローバルアトリビュートは、In-ProcessとOut-of-Processの どちらでも 動作します。

  • TOP NetworkSave Graph Attributes to .hip パラメータを 有効 にすると、バインドされていないすべてのグローバルアトリビュートが.hipファイルに残ります。

`

エクスプレッションでアトリビュートを使用する方法(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

重要

@attributeエクスプレッションが参照する内容が曖昧な場合(例えば、ジオメトリのPointアトリビュートとTOPワークアイテムのアトリビュートが同じ名前の場合)、TOPワークアイテムアトリビュートよりもSOPアトリビュートが優先されます。

ただし、エクスプレッションで@演算子に 接頭辞 を使用することで、そのような状況を回避することができます。 その接頭辞によって、@演算子が 特定のソース のデータを使用するように強制されます。 有効な接頭辞は次のとおりです: ジオメトリには G 、コンテキストオプションには C 、PDGワークアイテムアトリビュートには P 。 例えば、エクスプレッションにP@sizeを使用すると、同じ名前のコンテキストオプションが利用可能だったり、同じ名前のジオメトリアトリビュートが存在していても必ずsizeワークアイテムアトリビュートが取得されます。 この@演算子のテクニックは、同じTOPネットワーク内に同じ名前のコンテキストオプションやPDGアトリビュートを混在させて使用したい場合に非常に役に立ちます。

実行時にパラメータの内容を置換する方法(Push)

Wedge TOPを使ってパラメータ値を色々と変更させる時に、他のノードにTOP固有のエクスプレッションを使用したくない場合(例えば、レンダリングしたいROPが他のパイプラインと共有されている場合や手動で使用したい場合)、 実行時にWedgeノードのパラメータ値をWedgeアトリビュートに置換することができます。

レンダリング時にパラメータをオーバーライドする方法は、Wedge TOPのヘルプを参照してください。

ビルトインのアトリビュート

Note

ビルトインのアトリビュートを参照する時は、@pdg_nameを使用します。例えば@pdg_indexです。

index

ノード内のワークアイテムを並べ替える際のキーとして使用します。

id

ワークアイテムの固有ID。

name

インターフェース内で個々のワークアイテムを区別するのが簡単です。

nodename

ワークアイテムを生成したノードの名前。

schedulername

ワークアイテムのノードに割り当てられているスケジューラの名前。

label

ワークアイテムのラベル。 ワークアイテムにカスタムラベルがなければ、代わりにnameが使用されます。

frame

このワークアイテムが動作するフレーム番号。もちろん、必ずしもすべてのワークアイテムをレンダリングするわけではありませんが、フレーム番号を格納する必要性が多いので、私たちはビルトインのアトリビュートにこれを入れました。

input

このワークの入力として使用するファイル名のリスト。例えば、そのワークアイテムが“レンダリングした画像の上にテキストを描画する”を表現していた場合、ここには、制御される画像のパスが入ります。

inputsize

入力ファイルの数。

output

このワークの出力として生成されるファイル名のリスト。例えば、そのワークアイテムが“レンダリングした画像の上にテキストを描画する”を表現していた場合、ここには、その画像の上にテキストを描画した出力画像のパスが入ります。

outputsize

出力ファイルの数。

Tip

プロセッサ系ノードは入力のワークアイテムから新しいワークアイテムを生成するので、“親”ワークアイテムのoutputアトリビュートには自動的に“子”ワークアイテムのinputアトリビュートが入ります。

アトリビュートパターン構文

Attribute DeleteAttribute Copyのようなノードを使用する時、パターンを使用してアトリビュートのリストを指定した方が便利な事が多いです。 PDGには特別なアトリビュートパターン構文が用意されています。 この構文を使用することで、複数アトリビュートに対して動作可能なノード内でマッチさせるアトリビュートを指定することができます。 このパターンは、左から右に向かって適用され、以下に載せている記号を使用してマッチ条件をスペースで区切ったシーケンスで構成します。

Python Scriptまたはカスタムノード内でパターンマッチング機能を使用することもできます。 文字列からpdg.AttributePatternオブジェクトを構築し、そのオブジェクトをpdg.AttributeOwner.attribMatch関数に使用することで、ワークアイテム上のアトリビュートにそのパターンを適用することができます。 別の方法として、直接pdg.AttributePattern.contains関数をコールすることで、指定したアトリビュート名とタイプでマッチングをすることもできます。

パターン

意味

*

すべてのタイプのすべてのアトリビュート名に合致します。

name

指定したアトリビュート名に合致します。

prefix*

この接頭辞で始まるすべてのアトリビュート名に合致します。例えば、file*

*suffix

この接尾辞で終わるすべてのアトリビュート名に合致します。例えば、*size

^pattern

先行パターンの結果からこのパターンに合致したアトリビュートを除外します。 例えば、* ^size*のパターンは、“size”で始まるアトリビュートを除くすべてのアトリビュートに合致します。

:type

指定したpdg.attribTypeのアトリビュートにのみ合致するパターンを示した接尾辞。 typeには、floatintegerstringfilegeometrypyobjectのどれかを指定することができます。 例えば、size*:float *:integer ^sizesmallは、sizesmallという名前のアトリビュートとすべてのintegerアトリビュートを除くsizeで始まるすべてのfloatアトリビュートに合致します。

値パターン構文

値パターンを使用することで、標準構文で値のシーケンスを指定することができます。 例えば、Attribute Array TOPノードでパターンを使用することで、文字列配列または数値配列を作成することができます。

パターン内の値は左から右に向かって処理されます。 パターンの間にスペースを入れることで、パターンまたは定数を複数指定することができます。 文字列値に特殊文字を入れたい場合は、その文字列値をダブルクォーテーションで閉じるか、または、その特殊文字の前に\エスケープ文字を使用することで可能です。 例えば、regular "quoted string" escaped\ stringといったパターンは、['regular', 'quoted string', 'escaped string']の文字列配列を生成します。

デフォルトでは、範囲構文は最初のエレメントを含みますが、その範囲構文の最後のエレメントを含みません。 例えば、1-5のパターンは1, 2, 3, 4の値の数列を意味します。 値の範囲は、開始値と終了値が数値の場合、または、接尾辞が数字の文字列値である場合にのみ使用することができます。 文字列の接頭辞は必ずどちらも同じでなければなりません。 例えば、node1-node10は有効なパターンですがnode1-other10は無効です。 値の範囲のステップサイズは、文字列ではなくて必ず純粋な数値でなければなりません。

接頭辞の後に数値の範囲を括弧で閉じた[..]を付けることでも範囲指定が可能です。 これは、共通する文字列の接頭辞の後に範囲の値の接尾辞が追加された文字列リストを指定するのに役立ちます。 例えば、prefix[1-3]のパターンは、prefix1, prefix2, prefix3の文字列リストを生成します。

Range Generateなどの一部のノードは、範囲構文の最後のエレメントを含むようになっています。 これによって、値パターンを開始値、終了値、ステップ値を受け入れる他のフレーム範囲パラメータと同様の挙動をさせることができます。 Pythonコードで独自のpdg.ValuePatternインスタンスを作成すれば、値範囲内の最後のエレメントの挙動も設定することができます。

パターンの頭に^排他文字を置くことで、1個以上の値を含めないようにすることができます。 その排他パターンにマッチした部分は、パターン内のそれ以前に定義されたパターン部分から無視されるのに対して、それ以降に定義されたパターン部分には適用されません。 排他パターンは範囲構文として定義することもできます。 例えば、1-10 ^4-6のパターンは1, 2, 3, 6, 7, 8, 9の値の数列を生成します。 排他パターンの後に別のパターンを追加しても、その排他パターンはその後のパターンには適用されません。 例えば、1-10 ^4-8 5 6のパターンは1, 2, 3, 5, 6, 7, 9の値の数列を生成します。

Python Script TOPノードやカスタムノードでも、この値パターン機能を使用することができます。 文字列からpdg.ValuePatternオブジェクトを構築して、そのオブジェクトのpdg.ValuePattern.contains関数を使用することで、値がそのパターンに含まれているかどうかをテストすることができます。 パターンにマッチした値の配列全体がpdg.ValuePattern.floatArraypdg.ValuePattern.intArraypdg.ValuePattern.stringArrayの関数で利用可能です。

パターン

意味

value

定数。浮動小数点、整数、文字列が使用可能です。

start-end

startからendまでの値の範囲。浮動小数点シーケンス、整数シーケンス、接尾辞が数字の文字列のみが使用可能です。

start-end:step

ステップサイズを使った値の範囲。浮動小数点シーケンス、整数シーケンス、接尾辞が数字の文字列のみが利用可能です。

^pattern

前方のパターン部分でマッチした値をパターンから除外します。 patternには有効な値パターンをいくつも指定することができます。 例えば、1-20 ^4-15 5 61, 2 3, 5, 6, 15, 16, 17, 18, 19の値の数列を生成します。

prefix[start-end:step]

共通する文字列の接頭辞の後に範囲の値の接尾辞を付けた文字列リストを生成します。 例えば、prefix[2-10:2]は、'prefix2', 'prefix4', 'prefix6', 'prefix8'の文字列リストを生成します。

フィルターパターン構文

フィルターパターン構文は、値パターン構文の拡張形式で、アトリビュートの名前とそのアトリビュートにマッチさせるパターンを指定することができ、pdg.FilterPatternクラスを使用してそのパターンをワークアイテムに適用することができます。 フィルターパターンは、スペース区切りでルールセットを構成します。 各ルールは、アトリビュート名で始まり、次に>=のような比較演算、そしてそのアトリビュートと比較する値パターンを指定します このアトリビュート名には、オプションで配列インデックス接尾辞を含めることもでき、文字や数字を使ってアトリビュート名を指定します。 例えば、@pdg_id>5@scale.x <= 2.0f @scale.z <= 3.0 @array[5]=10はどちらとも有効なフィルターパターンです。

アトリビュート名には、有効なワークアイテムアトリビュート名、または、次のビルトインのアトリビュート名を使用することができます: @pdg_id@pdg_index@pdg_frame@pdg_loopdepth@pdg_name@pdg_label@pdg_output

=!=の演算子は、値の範囲を含む任意の値パターンと比較することができます。 例えば、@name=task[2-10]は、nameアトリビュートと該当する組み合わせの文字列値のリストを比較します。 >>=<<=の演算子は、右側のパターンが単一スカラー値を生成する場合にのみ有効です。つまり、範囲を使用することができません。 例えば、@scale.z>5は有効ですが、@scale.z>1-5は無効です。

パターン内のエントリーの頭に^トークンを付けることで、そのエントリーを除外対象にすることができます。 例えば、@width>5 ^@height<4のパターンは、widthアトリビュートが5より大きいすべてのワークアイテムにマッチし、そこから、heightが4未満のワークアイテムを除外します。

PDG/TOPsを使ってタスクを実行する方法

基本

初心者向けチュートリアル

次のステップ

リファレンス

  • すべてのTOPsノード

    TOPノードは、データをネットワークに送り込んでワークアイテムに変換し、色々なノードでそれを制御するワークフローを定義します。たいていのノードは、ローカルマシンまたはサーバーファーム上で実行可能な外部プロセスを表現しています。

  • プロセッサ系ノードコールバック

    プロセッサ系ノードはスケジューラで実行可能なワークアイテムを生成します。

  • パーティショナー系ノードコールバック

    パーティショナー系ノードは複数の上流ワークアイテムを単一パーティションにグループ化します。

  • スケジューラ系ノードコールバック

    スケジューラ系ノードはワークアイテムを実行します。

  • 独自のファイルタグとハンドラー

    PDGはファイルタグを使用して出力ファイルのタイプを決めます。

  • Python API

    ディペンデンシーグラフを扱うためのPython PDGパッケージのクラスと関数。

  • Job API

    ジョブスクリプトで使用するPython API

  • ユーティリティAPI

    Python pdgutilsパッケージのクラスと関数は、PDGノードでの使用だけでなく、スクリプトやプロセス外のジョブスクリプトでの使用も想定されています。