Houdini 20.0 Solaris

プリミティブマッチングパターン

USDプリミティブマッチング構文の使い方。

On this page

概要

多くのLOPノードには、そのノードが適用されるUSD Primsを選択するための Primitives パラメータがあります。 たいていの場合は、単にGUIを使ってビューア内またはツリーからPrimsを選択します。 このパラメータには、選択したパスをスペース区切りのリストで指定します。例:

/house/chair1 /house/chair2 /house/table1

しかし、Pathパターン、プリミティブアトリビュートに合致させる文字列を手動で作成したり、ブール演算子などを使ってマッチングを組み合わせることもできます。

プリミティブのパターンマッチング構文は、Houdiniの他のパターンマッチング言語と同様です。 例えば、スペース区切りのパターンのリストを使用した場合、デフォルトでは各パターンで“選択された”プリミティブが“or”(論理和)によって組み合わせが行なわれます。 このプリミティブパターン構文は、“and”(論理積)や“not”を使ったパターンの組み合わせにも対応しています。

構文

Pathパターン

Pathパターンでは、*は、(名前の中の)0個以上の文字に合致します。**は、0以上のレベルの階層に合致します。?は任意の1文字に合致します。[...]は、大括弧内のどれかの文字に合致します。

/Kitchen/Table/Leg1パスのプリミティブに合致します。

/Kitchen/Table/Leg1

/Kitchen直下のすべての子プリミティブに合致します。

/Kitchen/*

名前がChairで始まる/Kitchen直下のすべての子プリミティブに合致します。

/Kitchen/Chair*

名前がHandle1Handle2Handle3Handle4/Kitchen 以降 のすべての子プリミティブに合致します。

/Kitchen/**/Handle[1234]

RoomAのように名前がRoomの後に1文字付いた/House直下のすべての子プリミティブに合致します。

/House/Room?

コレクション

コレクション内のすべてのプリミティブに合致させるには、そのコレクションアトリビュートを保持したプリミティブまでのフルパスと(collection:接頭辞を付けて)そのアトリビュート名を指定してください:

/House/LivingRoomプリミティブ上のKeyLightsコレクションで指定されたすべてのプリミティブに合致します。

/House/LivingRoom.collection:KeyLights

省略形として、代わりに%path_to_prim/collection_nameを使用することができます:

/House/LivingRoomプリミティブ上のKeyLightsコレクションで指定されたすべてのプリミティブに合致します。

%/House/LivingRoom/KeyLights

あなたのコレクションが/collectionsプリミティブ上にある場合、さらに%collection_nameの短い形式を使用することができます:

/collectionsプリミティブ上のKeyLightsコレクションで指定されたすべてのプリミティブに合致します(以下の構文は/collections.collection:KeyLightsと同じです)。

%KeyLights

オートコレクション

プリミティブパターンは、オートコレクションと呼ばれるコレクションライクな仕組みに対応しています。 このオートコレクションは、コレクション構文( %auto_type:auto_argument )、または、もっと長いエクスプレッション関数( %auto_type(auto_argument1, auto_argument2, ...) )を使用して呼び出します。 この関数構文は、オプションの引数を名前で指定する方法と名前を指定せずに順番で引数を指定する方法のどちらにも対応しています。 ほとんどのオートコレクションは、1、2個の必須の引数のみを受け取るので、名前指定の構文には対応していません。 必須の引数とオプションの引数に関する詳細は、各オートコレクションのドキュメントを参照してください。

いくつかのオートレクションタイプがSolarisでネイティブに対応しており、HDKを使用することで、対応させたいオートレクションタイプを追加することができます。 オートコレクションを使用した場合のシーングラフの走査は、できるだけ高速に走査できるようにオートコレクションタイプ毎に異なります。 そのため、特定のプリミティブKindを検索する時に、USDモデル階層のルールが原因で、シーングラフの大部分の走査がスキップされることが多いです:

%abstract(bool=true)

抽象であるプリミティブ(オプションのbool引数に0nofalseのどれかを指定した場合は、抽象でないプリミティブ)すべてにマッチさせます。 抽象プリミティブとは、classspecifier(指定子)を持つプリミティブ、または、親プリミティブが抽象であるプリミティブのことです。 階層内にclassプリミティブを持たない他のすべてのプリミティブは、抽象ではないです。

抽象プリミティブすべてにマッチさせる構文

%abstract
%abstract(true)
%active(bool=true)

アクティブなプリミティブすべてにマッチさせます(オプションのbool引数に0nofalseのどれかを指定した場合、非アクティブなプリミティブすべてにマッチさせます)。 非アクティブなプリミティブはビューポートには表示されず、シーングラフツリー内にはその子プリミティブが表示されません。

非アクティブなプリミティブすべてにマッチさせる構文

%active:false
%active(false)
%ancestors(primpattern, strict=bool)

他のプリミティブまたはプリミティブグループの親プリミティブすべてにマッチさせます。 1個の必須の引数(プリミティブパターン)を受け入れます。 オプションのstrict引数に0nofalseのどれかを設定すると、親プリミティブに加えて、ソースパターンのメンバーも返すことができます。

すべてのcomponentプリミティブの親プリミティブすべてを検索する構文

%ancestors(%kind:component)
%authoredpurpose(purpose1,purpose2,...)

明示的にPurposeのどれかに設定されたプリミティブすべてにマッチさせます。 複数のPurposeを指定することができます。 親プリミティブのPurposeは考慮されず、各プリミティブのPurposeアトリビュート値のみが考慮されます。

直接proxyまたはguideに設定されたプリミティブすべてにマッチさせる構文

%authoredpurpose:proxy,guide
%authoredpurpose(proxy, guide)
%bound(primpath | min, max)

境界ボックスまたはカメラフラスタム内に入ってるプリミティブ、または、任意の境界ボックス内に入ってるプリミティブすべてにマッチさせます。 これらの異なる機能があるので、いくつかの異なるシグネチャに対応しています。

/cameras/camera1のカメラのフラスタム内にあるプリミティブすべてにマッチさせる構文

%bound:/cameras/camera1
%bound(/cameras/camera1)

/world/geo1プリミティブの境界ボックスに入ってるプリミティブすべてにマッチさせる構文

%bound:/world/geo1
%bound(/world/geo1)

カメラを後方に仮想的に動かしてカメラフラスタムの境界を広げたいのであれば、オプションのdolly引数を使用します

%bound(/cameras/camera1, dolly = 50)

特定の最小位置と最大位置をワールド空間で定義した境界ボックスに入っているプリミティブすべてにマッチさせる構文

%bound(min = [-1, -1, -1], max = [1, 1, 1])

特定の位置と境界ボックスサイズで定義された境界ボックス(上記で定義した境界ボックスと同等)に入っているプリミティブすべてにマッチさせる構文

%bound(center = [0, 0, 0], size = [2, 2, 2])

これらのシグネチャだけでなく、すべてのモードがt引数に対応しています。 このt引数には、各プリミティブの境界ボックス(またはフラスタム)が計算される時間範囲を指定することができます。 この範囲には単一の浮動小数点値を指定することができますが、その場合では、その時間のみが境界ボックスの評価されるタイムコードになります。 2成分ベクトルを指定した場合では、境界ボックスの評価されるタイムコードは、1番目の値がその開始時間、2番目の値がその終了時間で、サンプル間のタイムステップは1.0となります。 3成分ベクトルを指定した場合では、境界ボックスの評価されるタイムコードは、1番目の値がその開始時間、2番目の値がその終了時間で、3番目の値がサンプル間のタイムステップとなります。

時間範囲を明示的に指定しなかった場合(その場合、プリミティブの境界ボックスが現行時間で評価されます)、このオートコレクションによってプリミティブパターンに時間依存が生じるようになります。

%children(primpattern, strict=bool)

他のプリミティブまたはプリミティブのグループの子プリミティブすべてにマッチさせます。 1個の必須の引数(プリミティブパターン)を受け入れます。 オプションのstrict引数に0nofalseのどれかを設定すると、子プリミティブに加えて、ソースパターンのメンバーも返すことができます。

/Worldの直属の子プリミティブすべてを検索する。これは/World自体を返します

%children(/World, strict=false)
%closerthan(primpath, distance)

プリミティブから特定の距離内に入ってる境界ボックスを持ったプリミティブすべてにマッチさせます。

/cameras/camera1から10ユニット以内にあるプリミティブすべてにマッチさせる構文

%closerthan:/cameras/camera1,10
%closerthan(/cameras/camera1, 10)

さらに、このオートコレクションはオプションのt引数に対応しています。 このt引数には、各プリミティブの境界ボックスが計算される時間範囲を指定することができます。 この範囲には単一の浮動小数点値を指定することができますが、その場合では、その時間のみが境界ボックスの評価されるタイムコードになります。 2成分ベクトルを指定した場合では、境界ボックスの評価されるタイムコードは、1番目の値がその開始時間、2番目の値がその終了時間で、サンプル間のタイムステップは1.0となります。 3成分ベクトルを指定した場合では、境界ボックスの評価されるタイムコードは、1番目の値がその開始時間、2番目の値がその終了時間で、3番目の値がサンプル間のタイムステップとなります。

時間範囲を明示的に指定しなかった場合(その場合、プリミティブの境界ボックスが現行時間で評価されます)、このオートコレクションによってプリミティブパターンに時間依存が生じるようになります。

%commonroots(primpattern)

指定したパターンのプリミティブすべてを含んだ最も深くネストされたプリミティブにマッチさせます。 複数のルートプリミティブ下のプリミティブがこのパターンに含まれていた場合、各ルートプリミティブ下のプリミティブが別々に処理されます。 そのため、このオートコレクションは、指定したパターン内のルートプリミティブブランチ毎に1個のプリミティブを返します。 このオートコレクションは、コレクションマテリアルバインドの編集先となるシーングラフ階層内の位置を求めるのに役立ちます。 というのも、このコレクションマテリアルバインドのバインド先は、そのマテリアルにバインドされるプリミティブすべてが含まれたプリミティブ上になければならないからです。

シーン内のすべてのコンポーネントが表示される最も外側のネストされたプリミティブを検索する

%commonroots(%kind:component)
%defined(bool=true)

定義済み(または、オプションのbool引数に 0nofalseのどれかを指定した場合は定義済みでない)プリミティブすべてにマッチさせます。 定義済みプリミティブとは、defまたはclassのspecifier(指定子)を持つプリミティブ、すべての親プリミティブが定義済みのプリミティブのことです。 overspecifier(指定子)を持つプリミティブ、または、親プリミティブがoverspecifier(指定子)を持つプリミティブは、定義済みプリミティブではありません。

定義済みでないプリミティブすべてにマッチさせる構文

%defined:false
%defined(false)
%descendants(primpattern, strict=bool)

他のプリミティブまたはプリミティブのグループの子孫プリミティブすべてにマッチさせます。 1個の必須の引数(プリミティブパターン)を受け入れます。 オプションのstrict引数に0nofalseのどれかを設定すると、子孫プリミティブに加えて、ソースパターンのメンバーも返すことができます。

すべてのMaterialプリミティブの子孫プリミティブすべて、そして、そのMaterialプリミティブ自体を検索する

%descendants(%type:Material, strict=false)
%fartherthan(primpath, distance)

プリミティブから特定の距離よりも遠くにある境界ボックスを持ったプリミティブすべてにマッチさせます。

/cameras/camera1から10ユニットよりも遠くにあるプリミティブすべてにマッチさせる構文

%fartherthan:/cameras/camera1,10
%fartherthan(/cameras/camera1, 10)

さらに、このオートコレクションはオプションのt引数に対応しています。 このt引数には、各プリミティブの境界ボックスが計算される時間範囲を指定することができます。 この範囲には単一の浮動小数点値を指定することができますが、その場合では、その時間のみが境界ボックスの評価されるタイムコードになります。 2成分ベクトルを指定した場合では、境界ボックスの評価されるタイムコードは、1番目の値がその開始時間、2番目の値がその終了時間で、サンプル間のタイムステップは1.0となります。 3成分ベクトルを指定した場合では、境界ボックスの評価されるタイムコードは、1番目の値がその開始時間、2番目の値がその終了時間で、3番目の値がサンプル間のタイムステップとなります。

時間範囲を明示的に指定しなかった場合(その場合、プリミティブの境界ボックスが現行時間で評価されます)、このオートコレクションによってプリミティブパターンに時間依存が生じるようになります。

%foreach(primpattern, per_path_pattern)

第一にprimpatternにマッチした各プリミティブに対してper_path_patternを実行した和集合にマッチしたすべてのプリミティブにマッチします。

Note

primpatternの結果は、さらにper_path_patternのどれかにもマッチしない限り、返されるプリミティブの一部にはなりません。

per_path_patternは、各primpatternマッチに対して、@pathをそのPrimのフルパスに置換し、@nameをそのマッチしたPrimの名前に置換するといった単純な文字列置換を行なうことで再構築されます。

各コンポーネントプリミティブ下の“geo”という名前の子にマッチさせる

%foreach(%kind(component), @path/geo)

メッシュプリミティブより上位にあるコンポーネントプリミティブを検索する

%foreach(%type(Mesh), %ancestors(@path) & %kind(component))

これらのパターンは、非常に膨大な数のサブパターンを実行してしまうので、この構文を使用すると実行時間が極めて長いパターンが生成される可能性があることに注意してください。

%geofrommat(primpattern, bindingpurpose)

マテリアルにバインドされているプリミティブすべてにマッチさせます。 1番目の引数には、マテリアルプリミティブのパスを指定します。マテリアルのPurposeを指定することもできます。

プレビューマテリアルとして/materials/previewsurface1マテリアルが割り当てられているプリミティブすべてにマッチさせる構文

%geofrommat:/materials/previewsurface1,preview
%geofrommat(/materials/previewsurface1, preview)

マテリアルにバインドされているプリミティブすべてを検索する方法の特別な使い方として以下のようにすることで、マテリアルにバインドされていないプリミティブすべてにマッチさせることもできます。

%geofrommat:none
%highest(primpattern)

包囲パターンにマッチし、且つ、そのパターンにマッチする親プリミティブを持たないプリミティブセットにマッチさせます。 このルールは、minimalsetオートコレクションに似ており、同等の結果を生成するために作成する必要のあるオピニオンの数を最小限に抑えるのに役立ちます。 これは、包囲パターンに直接マッチしたプリミティブのみを返すという点では、そのオートコレクションと異なります。

シーン内の最も浅くネストされたグループプリミティブを検索する

%highest(%kind:group)
%instance(primpath=None)

指定したプリミティブとインスタンスプロトタイプが共有されているプリミティブすべてにマッチさせます。 プリミティブを指定しなかった場合、何かしらのインスタンスプロトタイプを持ったプリミティブすべてがパターンにマッチします。

/instances/treeと同じマスタープリミティブのインスタンスであるプリミティブすべてにマッチさせる構文

%instance:/instances/tree
%instance(/instances/tree)
%instanceproxy(bool = true)

インスタンスプロキシであるプリミティブ(オプションのbool引数に0nofalseのどれかを指定した場合は、インスタンスプロキシでないプリミティブ)すべてにマッチさせます。

インスタンスプロキシでないプリミティブすべてにマッチさせる構文

%instanceproxy:false
%instance(false)
%keep(primpattern, start=int, end=int, count=int, interval=int, keepoutsiderange=bool)

指定したprimpatternにマッチしたプリミティブのサブセットを保持します。 マッチしたプリミティブは、各プリミティブのパスに基づいたアルファベット順のリスト内にあると見なされます。 startからendまでの範囲でintervalの間隔毎にcount個のプリミティブが保持されます。 start前またはend後のプリミティブに関しては、keepoutsiderangetrueなら、それらのプリミティブは保持され、 そうでないなら、その範囲外のプリミティブは削除されます。

これらの引数のデフォルト値は、start0で、endがプリミティブの数です。 countのデフォルト値は1で、interval2です。 つまり、デフォルトではプリミティブは1つおきに保持されます。 keepoutsiderangeのデフォルト値はfalseです。 startendcountintervalには、マイナス値を使用することができます。 マイナス値を使用した場合、primpatternにマッチしたプリミティブの数からその値の大きさを引いた数が設定されます。

/world/props/rocks/*のすべての子プリミティブの3分の2にマッチさせる構文

%keep(/world/props/rocks/*, count=2, interval=3)
%keeprandom(primpattern, seed=float, fraction=float)

指定したprimpatternにマッチしたプリミティブのサブセットを保持します。 マッチしたプリミティブは、各プリミティブのパスとseed値によってランダムに決定された順番で配置されます。 このランダム(でも安定した)順で配置すると、指定したfractionのみが残っている限りプリミティブは削除されます。 fractionには0.0から1.0までの範囲の値を指定してください。 デフォルト値は0.5です。 seedのデフォルト値は0.0で、値が異なればプリミティブの並び順が異なります。

ランダムシード値が0.6で、すべてのコンポーネントの4分の1にマッチさせる構文

%keeprandom(%kind:component, fraction=0.25, seed=`0.6`)
%kind(kind1, kind2, ..., strict=bool)

USD Kindに基づいてプリミティブをマッチさせます。 複数のUSD Kindの名前を受け入れます。 オプションのstrict引数を使用することで、このオートコレクションがサブKindにマッチするかどうかを制御することができます。 デフォルトでは、サブKindが許可されています。

%kind(assembly)%kind:assemblyを使用したプリミティブのオートコレクションは、/rootに適用する場合には期待通りに動作しません。 その理由は、技術的に言うと、/rootには編集されるKindがないからです。 これを修復するには、/rootをGroupまたはAssemblyにすると良いでしょう。 他には、{usd_iskind(0, @primpath, "assembly")}のようにVEX関数を使用する方法があります。 VEXは、Primが有効なKindモデル階層の一部であるかどうかを検証しないので、このVEX関数は動作します。

groupKindまたはgroupのサブKind(例えば、assembly)のプリミティブすべてにマッチさせる構文

%kind:group
%kind(group)

groupKindのプリミティブ(groupのサブKindのプリミティブを除く)すべてにマッチさせる構文

%kind(group, strict=true)
%lowest(primpattern)

包囲パターンにマッチし、且つ、このプリミティブの直属のすべての子プリミティブがこのパターンにマッチしないプリミティブセットにマッチさせます。 このルールは、highestオートコレクションとほぼ反対ですが、継承可能なアトリビュートに対して整合性の取れた結果が得られるように、プリミティブセットに含まれていない子プリミティブの兄弟プリミティブを網羅するために親プリミティブがそこにある必要である場合には、親プリミティブと子プリミティブの両方を残すようにすることができます。

シーン内の最も深くネストされたグループプリミティブを検索する

%lowest(%kind:group)
%matfromgeo(primpattern, bindingpurpose)

シーングラフツリーのブランチ上のプリミティブにバインドされているマテリアルすべてにマッチさせます。 1番目の引数には、バインドされているマテリアルが走査されるシーングラフブランチのルートを示したプリミティブのパスを指定します。 マテリアルバインドのPurposeも指定することができます。

/world/geo/house以下のプリミティブにバインドされているマテリアルすべてにマッチさせる構文

%matfromgeo:/world/geo/house
%minimalset(primpattern)

指定したパターンにリストされているプリミティブすべてに値を設定するために、継承可能な値を設定する必要がある最小限のプリミティブセットにマッチさせます。 継承可能なプロパティには、activation、visibility、定数Primvarsがあります。 このルールは、同等の結果を生成するために作成する必要のあるオピニオンの数を最小限に抑えるのに役立ちます。

/world/geo/house以外のすべてのコンポーネントを不可視にするために、不可視とマークする必要のある最小限のプリミティブを検索する

%minimalset(%kind:component - /world/geo/house)
%noancestors(primpattern)

プリミティブパターンを指定すると、そのグループ内の他のプリミティブの親プリミティブになっているプリミティブをそのグループから削除します。

%nodescendants(primpattern)

プリミティブパターンを指定すると、そのグループ内の他のプリミティブの子プリミティブになっているプリミティブをそのグループから削除します。

%parents(primpattern, strict=bool)

他のプリミティブまたはプリミティブグループの直属の親プリミティブすべてにマッチさせます。 1個の必須の引数(プリミティブパターン)を受け入れます。 オプションのstrict引数に0nofalseのどれかを設定すると、親プリミティブに加えて、ソースパターンのメンバーも返すことができます。

componentプリミティブの親プリミティブすべてを検索する

%parents(%kind:component)
%purpose(purpose1,purpose2,...)

Puroposeセットのどれかを持つプリミティブすべてにマッチさせます。複数のPurposeを指定することができます。

プロキシプリミティブまたはガイドプリミティブすべてにマッチさせる構文

%purpose:proxy,guide
%purpose(proxy, guide)
%reference(primpattern)

指定したパターン内のプリミティブをリファレンス、継承、特別化しているプリミティブすべてにマッチさせます。

/prototype/treeをリファレンスしているプリミティブすべてにマッチさせる構文

%reference:/prototype/tree
%reference(/prototype/tree)
%referencedby(primpattern)

指定したパターン内のプリミティブ上のリファレンス、継承、特別化のコンポジションアークで発生するプリミティブすべてにマッチさせます。

/props/*がリファレンスしているプリミティブすべてにマッチさせる構文

%referencedby:(/props/*)
%rel(relpath)

リレーションシップがターゲットにしているプリミティブすべてにマッチさせます。 引数には、リレーションシップのパスを指定します。 指定したリレーションシップのターゲットにリストされているリレーションシップは再帰的に展開されます。

/Render/rendersettings1にあるプリミティブ上のproductsリレーションシップのターゲットプリミティブすべてにマッチさせる構文

%rel:/render/rendersettings1.products
%rel(/render/rendersettings1.products)
%rel(primpattern, relname)

複数のプリミティブ上のリレーションシップがターゲットにしているプリミティブすべてにマッチさせます。 プリミティブパターンは展開され、指定した名前のリレーションシップが各プリミティブから照会されます。 指定したリレーションシップのターゲットにリストされているリレーションシップは再帰的に展開されます。

/Render/rendersettings1のRender Product上のrender varsすべてにマッチさせる構文

%rel(%rel(/render/rendersettings1, products), orderedVars)
%rendercamera(primpath)

デフォルトのRenderSettings Primがターゲットにしているカメラにマッチさせます。 別のRenderSettings Primもオプションの引数で指定することができます。

/Render/rendersettings1でのPrim上のproductsリレーションシップのすべてのターゲットプリミティブにマッチさせる構文

%rendercamera
%rendercamera:/Render/settings
%renderproducts(primpath)

デフォルトのRenderSettings PrimがターゲットにしているすべてのRenderProductsにマッチさせます。 別のRenderSettings Primもオプションの引数で指定することができます。 現行ステージ上にターゲットプリミティブが存在すれば、そのターゲットプリミティブを返します。

現行ステージのデフォルトのRenderSettings Prim上のRenderProducts Primsのすべてのターゲットプリミティブにマッチさせる構文

%renderproducts

/Render/rendersettings1でのPrim上のRenderProducts Primsのすべてのターゲットプリミティブにマッチさせる構文

%renderproducts:/Render/settings1
%renderproducts(/Render/settings1)
%rendersettings

ステージ上のデフォルトのRenderSettings Primにマッチさせます。

現行ステージ上のデフォルトのRenderSettings Primにマッチさせる構文

%rendersettings
%rendervars(primpath)

デフォルトのRenderSettings Prim上のRenderProductsがターゲットにしているすべてのRenderVarsにマッチさせます。 別のRenderSettings Primもオプションの引数で指定することができます。 現行ステージ上にターゲットプリミティブが存在すれば、そのターゲットプリミティブを返します。

現行ステージのデフォルトのRenderSettings Prim上のRenderVars Primsのすべてのターゲットプリミティブにマッチさせる構文

%rendervars

/Render/rendersettings1でのPrim上のRenderVars Primsのすべてのターゲットプリミティブにマッチさせる構文

%rendervars:/Render/settings1
%rendervars(/Render/settings1)
%rule(selection_rule)

選択ルールを満たすプリミティブすべてにマッチさせます。

/rules/Characters選択ルールで指定されたプリミティブすべてにマッチさせる構文

%rule:/rules/Characters
%rule(/rules/Characters)
%shadertype(idpattern1, idpattern2, ...)

指定したパターンのどれかにマッチしたSourceIdを持つUsdShadeプリミティブすべてにマッチさせます。 このパターンは、標準のHoudini文字列マッチングパターンなので、ワイルドカードと排他を適用することができます。比較に大文字小文字の区別はありません。

(読み込むデータタイプを問わず)USD Primvar Readerシェーダノードすべてを検索する

%shadertype(UsdPrimvarReader_*)
%specifier(specfier[,specifier]...)

リストしたspecifier(指定子)のどれかで設定されたプリミティブすべてにマッチさせます。有効なspecifierはdefoverclassです。 これらの用語の意味に関する情報は用語集を参照してください。

Note

abstractdefinedのオートコレクションと違って、親プリミティブのspecifierは、このオートコレクションの結果に影響を与えません。 def specifierを持ったプリミティブはdefinedすることができないので、このオートコレクションはそのような場合を調べることができます。

definedプリミティブすべてにマッチさせる構文

%specifier:def
%specifier(def)
%type(primtype1, primtype2, ..., strict=bool)

特定のUSDタイプのプリミティブ、または、特定のAPIスキーマが適用されているプリミティブすべてにマッチさせます。 複数のUSDプリミティブタイプ名/APIスキーマ名を受け入れます。 オプションのstrict引数を使用することで、このオートコレクションが派生タイプとマッチするどうかを制御することができます。 デフォルトでは、派生タイプが許可されています。

特別なトークンのNoneを使用することで、どのタイプも指定されていないプリミティブにマッチさせることができます。

ベースのUsdGeomBoundableスキーマから派生したライトプリミティブすべてにマッチさせる構文

%type:UsdGeomBoundable
%type(UsdGeomBoundable)

プリミティブタイプが設定されていないプリミティブすべてを検索する構文

%type(None)
%variant(setname1=value1 value2, setname2=value3 value4, ...)

特定のバリアントセット選択を持ったプリミティブすべてにマッチさせます。 各引数のsetname部分がバリアントセット名です。 各setname引数は必ず固有でなければなりませんが、各setname引数の値のリストには、標準のHoudini文字列マッチングパターン(ワイルドカードを含む)を使用することができます。 バリアントセット名と選択の比較はすべて大文字小文字の区別があります。

modelingVariantChairBのプリミティブすべてにマッチさせる構文

%variant(modelingVariant=ChairB)

(どのバリアントが選択されているのか関係なく)modelingVariantバリアントセットを持つプリミティブすべてをマッチさせる構文

%variant(modelingVariant=*)
%visible(bool=true)

可視(または、オプションのbool引数に 0nofalseのどれかを指定した場合は不可視)プリミティブすべてにマッチさせます。 どちらの場合でも、このパターンではUsdGeomImageableプリミティブのみがマッチしますが、タイプなしプリミティブ/非Imageableプリミティブ下のImageableプリミティブも返されるので、 このパターンは、ビューポートでどのプリミティブが表示させるか(されないか)を尋ねるのとまったく同じではないです。 このオートコレクションは、現行時間での各プリミティブの可視性をテストしますが、検査されるプリミティブ(またはそのプリミティブの親プリミティブ)の可視性アトリビュートが時間の経過と共にその値が変化する場合、時間依存が生じるようになります。

不可視プリミティブすべてにマッチさせる構文

%visible:false
%visible(false)

VEXPressions

VEXコードを中括弧{ }で閉じることで、“合致した”場合は1、“合致しない”場合は0と評価することができます(または返すことができます)。 以下のスニペットでは、@primpathは、考慮されている現行プリミティブのパスに合致します。 他にも@<attr_name>を使用することで、現行プリミティブ上のアトリビュート値にアクセスすることができます。

Meshタイプのプリミティブに合致します。

{ usd_istype(0, @primpath, "Mesh") }

radiusアトリビュート値が2.0より大きいプリミティブに合致します。

{ @radius > 2.0 }

これは、{ usd_attrib(0, @primpath, "radius") > 2.0 }と同じです。

radiusアトリビュート値の2乗が4より大きいプリミティブに合致します。

{ float r2 = @radius * @radius; return r2 > 4; }

VEXには、USDプリミティブをテストするのに便利なusd_*関数がたくさんあります。例:

{ usd_purpose(0, @primpath) == "render" }

{ usd_variantselection(0, @primpath, "shapes") == "round" }

{ usd_istype(0, @primpath, "DiskLight") }

{ usd_iskind(0, @primpath, "component") }

{ usd_isinstance(0, @primpath) }

{ usd_isactive(0, @primpath) }

{ usd_isprim(0, @primpath) }

“Or” (論理和)

2個以上のパターンを+演算子またはスペースで区切って組み合わせることで、それらの どれか のパターンに合致したプリミティブに合致させることができます:

/house直下の子プリミティブ または /yard直下の子プリミティブ または /garage直下の子プリミティブに合致します。

/house/* + /yard/* + /garage/*

上記と同じです: パターン間のスペースは+演算と同じように扱われます。

/house/* /yard/* /garage/*

“And” (論理積)

2個以上のパターンを&演算子によって、それらの すべて のパターンに合致したプリミティブのみを選択するようにすることができます:

/Kitchen直下の子プリミティブ 且つ Propsコレクション内のプリミティブ 且つ Staticコレクション内のプリミティブに合致します。

/Kitchen/* & %Props & %Static 

“Not” (引き算)

-演算子または^演算子は、左側のパターンに合致したプリミティブから、右側のパターンに合致したプリミティブを 引き ます。

Lightsコレクションに 入っていない /Kitchen直下の子プリミティブに合致します。

/Kitchen/* - %Lights

/Kitchen/HighChair除く 名前がChairで終わる/Kitchen直下の子プリミティブに合致します。

/Kitchen/*Chair ^ /Kitchen/HighChair

グループ化

丸括弧( )を使ってパターンをグループ化することで、それらのパターンを1個のパターンとして扱うことができます。

/geo/foo/geo/bar除いた /geo直下の子プリミティブに合致します。

/geo/* - (/geo/foo /geo/bar)

Ancestors(祖先)とDescendants(子孫)

特別なトークンの<<, >>, <<>>を使用することで、その時点までのパターンにマッチしたプリミティブの祖先プリミティブ、子孫プリミティブ、または祖先と子孫の両方のプリミティブをすべて選択することができます。 これらのトークンをグループ内に含めると、祖先と子孫の展開は、これまでにそのグループ内で選択されていたプリミティブにのみ適用されます。

コンポーネントとその祖先すべてにマッチします

{ usd_iskind(0, @primpath, "component") } <<

コンポーネント自身を除いてその子孫すべてにマッチします

{ usd_iskind(0, @primpath, "component") } >> - { usd_iskind(0, @primpath, "component") }

他のプリミティブパターンパラメータでマッチしたプリミティブすべてにマッチし、さらに、それらのプリミティブの祖先と子孫にもマッチします

( `chs("../otherlop/primpattern")` ) <<>>

以下の特別なトークンは、strictモードをfalseに設定したancestors/descendantsオートコレクションと等価です。

>>と等価のオートコレクション。

%descendants(pattern, strict=false)

<<と等価のオートコレクション。

%ancestors(pattern, strict=false)

<<>>と等価のオートコレクション

%ancestors(%descendants(pattern), strict=false)

Pruning(削除)

LOPsでは、階層内の特定の位置より上層にあるプリミティブをターゲットにする操作をよく行ないます。 例えば、特定の条件に合致したプリミティブすべてを検索するのは役に立つ場合が多いですが、それらのプリミティブが(プリミティブ上のcomponentKindで指定された)アセット定義外に存在する場合に限ります。 例として、component外にあるすべてのXformプリミティブの検索を試みることを考えてみましょう。

これを達成する1つの方法は、すべてのXformプリミティブを検索してから、コンポーネント内に存在するプリミティブを削除することです。

すべてのXformプリミティブにマッチさせます。

%type:Xform

すべてのXformプリミティブにマッチさせてから、コンポーネント内に存在するプリミティブを削除します。

%type:Xform - (%kind:component >>)
%type:Xform - %descendants(%kind:component, strict=false)

componentプリミティブを持たないブランチ内のXformプリミティブが存在している場合があるので、 これは、componentプリミティブの親プリミティブでもあるXformプリミティブすべてを検索することとはまったく同じではないことに注意してください。 上記のどのパターンもステージ全体の走査を伴います。 もっと効率的な方法は、componentプリミティブが見つかった時に単純に走査を止めることです(シーングラフツリーをPruneすることです)。 これは、Prune演算子の~を使って表現することができます。

componentsプリミティブ外のXformプリミティブを検索する非常に効率的な方法。

%type:Xform ~ %kind:component

パフォーマンスの改善

プリミティブパターンの評価は、非常に膨大なシーンでは処理が非常に重くなってしまいます。 最悪の場合、ステージ全体のすべてのプリミティブをパターンと比較してマッチング検索をしなければなりません。 しかしながら、このパターンのパフォーマンスを大幅に向上させるためにしておきたい単純な手順が存在します。

  • 最も効率的な検索は、走査を引き起こさない検索です。Pruning(~)を使用して走査の回避を試みてください。

  • 可能な限り、And(&)演算子を使って検索の範囲を絞ってください。 この演算子は、パターンの片側の情報を使ってプリミティブを評価して数を絞ってから、パターンのもう片側の情報を使って残りのプリミティブを評価します。 これは特にVEXpressionを使用する時に重要で、走査するステージの部分に関するヒントを与えることができるので、VEXで実行されるプリミティブの数を減らすことができます。 例えば、/world/props/** & { usd_iskind(0, @primpath, "component") }/world/props下のプリミティブに対してのみVEXpressionを実行します。

  • (*camといった)*で始まるプリミティブパターンのマッチングだと、ステージ全体を走査する必要があります。 (/cameras/**camといった)接頭辞を指定することで、走査範囲が/camerasブランチに絞り込まれるので、マッチングが非常に高速になります。 さらにAnd演算子を使うことで(例えば、/cameras/** & *cam)走査範囲を絞り込むことができます。

  • Performance MonitorペインでのLOPノードに関するノードクック時間は、プリミティブパターンの評価に費やされた時間と明示的に分けているので、負荷の高いパターンを見つけるのに役立ちます。

Tipsとテクニック

  • And(&)とNot(-または^)の演算子は、それぞれ左側/右側で一番近い単一パターンに紐付きます。左側または右側で複数のパターンをグループ化したいのであれば、丸括弧を使用してください。

    例:

    /* - /a /b
    

    …これは、“/*/bの論理和から/aを排他する”を意味します。“/*から/b/cの論理和を引く”表現にしたいのであれば、右側をグループ化する必要があります:

    /* - (/a /b)
    

    (基本となる文法は非常に単純です。丸括弧によるグループ化を除いてすべての演算子は、同じレベルで、すべての二項演算子は左側が基準になります。正確に意味を表現する場合にグループをよく使用することになります。)

  • hou.LopSelectionRuleオブジェクトにステージとプリミティブのパターン文字列を指定することで、それに合致したプリミティブを評価させることができます。

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

チュートリアル