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
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)
パフォーマンスの改善
プリミティブパターンの評価は、非常に膨大なシーンでは処理が非常に重くなってしまいます。 最悪の場合、ステージ全体のすべてのプリミティブをパターンと比較してマッチング検索をしなければなりません。 しかしながら、このパターンのパフォーマンスを大幅に向上させるためにしておきたい単純な手順が存在します。
-
可能な限り、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オブジェクトにステージとプリミティブのパターン文字列を指定することで、それに合致したプリミティブを評価させることができます。