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*
名前がHandle1
、Handle2
、Handle3
、Handle4
の/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
引数に0
、no
、false
のどれかを指定した場合は、抽象でないプリミティブ)すべてにマッチさせます。
抽象プリミティブとは、class
specifier(指定子)を持つプリミティブ、または、親プリミティブが抽象であるプリミティブのことです。
階層内にclass
プリミティブを持たない他のすべてのプリミティブは、抽象ではないです。
抽象プリミティブすべてにマッチさせる構文
%abstract %abstract(true)
%active(bool=true)
アクティブなプリミティブすべてにマッチさせます(オプションのbool
引数に0
、no
、false
のどれかを指定した場合、非アクティブなプリミティブすべてにマッチさせます)。
非アクティブなプリミティブはビューポートには表示されず、シーングラフツリー内にはその子プリミティブが表示されません。
非アクティブなプリミティブすべてにマッチさせる構文
%active:false %active(false)
%ancestors(primpattern, strict=bool)
他のプリミティブまたはプリミティブグループの親プリミティブすべてにマッチさせます。
1個の必須の引数(プリミティブパターン)を受け入れます。
オプションのstrict
引数に0
、no
、false
のどれかを設定すると、親プリミティブに加えて、ソースパターンのメンバーも返すことができます。
すべてのcomponent
プリミティブの親プリミティブすべてを検索する構文
%ancestors(%kind:component)
%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
引数に0
、no
、false
のどれかを設定すると、子プリミティブに加えて、ソースパターンのメンバーも返すことができます。
/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
引数に 0
、no
、false
のどれかを指定した場合は定義済みでない)プリミティブすべてにマッチさせます。
定義済みプリミティブとは、def
またはclass
のspecifier(指定子)を持つプリミティブ、すべての親プリミティブが定義済みのプリミティブのことです。
over
specifier(指定子)を持つプリミティブ、または、親プリミティブがover
specifier(指定子)を持つプリミティブは、定義済みプリミティブではありません。
定義済みでないプリミティブすべてにマッチさせる構文
%defined:false %defined(false)
%descendants(primpattern, strict=bool)
他のプリミティブまたはプリミティブのグループの子孫プリミティブすべてにマッチさせます。
1個の必須の引数(プリミティブパターン)を受け入れます。
オプションのstrict
引数に0
、no
、false
のどれかを設定すると、子孫プリミティブに加えて、ソースパターンのメンバーも返すことができます。
すべての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番目の値がサンプル間のタイムステップとなります。
時間範囲を明示的に指定しなかった場合(その場合、プリミティブの境界ボックスが現行時間で評価されます)、このオートコレクションによってプリミティブパターンに時間依存が生じるようになります。
Match all primitives that match the union of running the per_path_pattern
for each primitive that matches the primary primpattern
. Note that the results of the primpattern
are not part of the returned set of primitives unless they are also matched by one of the per_path_pattern
s.
The per_path_pattern
is reconstructed for each primpattern
match by doing a simple string replacement of @path
with the full path of the prim, and @name
with the name of the matched prim.
To match the a child named “geo” under each component primitive
%foreach(%kind(component), @path/geo)
To find the component primitive above any mesh primitive
%foreach(%type(Mesh), %ancestors(@path) & %kind(component))
Because these patterns can run a very large number of sub-patterns, be aware that it is possible to create extremely long running patterns when using this syntax.
%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
引数に0
、no
、false
のどれかを指定した場合は、インスタンスプロキシでないプリミティブ)すべてにマッチさせます。
インスタンスプロキシでないプリミティブすべてにマッチさせる構文
%instanceproxy:false %instance(false)
%keep(primpattern, start=int, end=int, count=int, interval=int, keepoutsiderange=bool)
指定したprimpattern
にマッチしたプリミティブのサブセットを保持します。
マッチしたプリミティブは、各プリミティブのパスに基づいたアルファベット順のリスト内にあると見なされます。
start
からend
までの範囲でinterval
の間隔毎にcount
個のプリミティブが保持されます。
start
前またはend
後のプリミティブに関しては、keepoutsiderange
がtrue
なら、それらのプリミティブは保持され、
そうでないなら、その範囲外のプリミティブは削除されます。
これらの引数のデフォルト値は、start
が0
で、end
がプリミティブの数です。
count
のデフォルト値は1
で、interval
は2
です。
つまり、デフォルトではプリミティブは1つおきに保持されます。
keepoutsiderange
のデフォルト値はfalse
です。
start
、end
、count
、interval
には、マイナス値を使用することができます。
マイナス値を使用した場合、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関数は動作します。
group
Kindまたはgroup
のサブKind(例えば、assembly
)のプリミティブすべてにマッチさせる構文
%kind:group %kind(group)
group
Kindのプリミティブ(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
引数に0
、no
、false
のどれかを設定すると、親プリミティブに加えて、ソースパターンのメンバーも返すことができます。
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はdef
、over
、class
です。
これらの用語の意味に関する情報は用語集を参照してください。
Note
abstract
やdefined
のオートコレクションと違って、親プリミティブの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文字列マッチングパターン(ワイルドカードを含む)を使用することができます。
バリアントセット名と選択の比較はすべて大文字小文字の区別があります。
modelingVariant
がChairB
のプリミティブすべてにマッチさせる構文
%variant(modelingVariant=ChairB)
(どのバリアントが選択されているのか関係なく)modelingVariant
バリアントセットを持つプリミティブすべてをマッチさせる構文
%variant(modelingVariant=*)
%visible(bool=true)
可視(または、オプションのbool
引数に 0
、no
、false
のどれかを指定した場合は不可視)プリミティブすべてにマッチさせます。
どちらの場合でも、このパターンでは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では、階層内の特定の位置より上層にあるプリミティブをターゲットにする操作をよく行ないます。
例えば、特定の条件に合致したプリミティブすべてを検索するのは役に立つ場合が多いですが、それらのプリミティブが(プリミティブ上のcomponent
Kindで指定された)アセット定義外に存在する場合に限ります。
例として、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オブジェクトにステージとプリミティブのパターン文字列を指定することで、それに合致したプリミティブを評価させることができます。