Houdini 18.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

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オブジェクトにステージとプリミティブのパターン文字列を指定することで、それに合致したプリミティブを評価させることができます。

Solaris

USD

チュートリアル

Karma