int [] primfind(<geometry>geometry, vector min, vector max)
指定したボックスと交差する境界ボックスのプリミティブすべてを検索します。
int [] primfind(<geometry>geometry, string group, vector min, vector max)
指定したボックスと交差する境界ボックスのグループ内のプリミティブすべてを検索します。
<geometry>
ノード(例えばWrangle SOP)のコンテキスト内で実行する時は、この引数にジオメトリの読み込み元の入力番号(0から始まります)を意味する整数を指定することができます。
別の方法として、読み込み元のジオメトリファイル(例えば、.bgeo
)を示した文字列を指定することができます。
Houdini内で実行する時は、この引数にop:/path/to/sop
参照を指定することができます。
min
, max
これらのベクトルは、検索する境界ボックスの最小と最大のコーナーを定義します。
group
グループを指定すると、このグループ内のプリミティブにのみ合致します。
空っぽのグループ文字列は、すべてのプリミティブを含みます。
この文字列は、0-10
や@Cd.x>0
のような一時的なパターンに対応しています。
Returns
プリミティブ番号の配列。
Note
これらの関数は、処理する特定の領域のプリミティブの検索の最適化に使用することを前提にしています。
例えば、ある入力のすべてのカーブが他の入力のポリゴンと交差するかどうかを調べるには、単純な方法だとカーブ毎にすべてのポリゴンを反復させて交差を判定することになります。
この処理を高速化するために、これらの関数を使用すれば、特定のカーブと交差するプリミティブを調べて、その交差する可能性のあるプリミティブに対してのみ反復させることができます。
primfind
は、その基礎となるツリー構造を使用して検索を高速化しているので、これはパフォーマンスを飛躍的に改善します。
Examples ¶
原点を中心とした単位ボックスと交差するプリミティブを削除します:
int[] prims = primfind(geometry, {-0.5, -0.5, -0.5}, {0.5, 0.5, 0.5}); foreach ( int prim; prims ) { removeprim("primitives.bgeo", prim, 1); }
別の方法では、補助ソースから照会境界ボックスを使用することができます:
vector min, max; getbbox("bbox.bgeo", min, max); int[] prims = primfind(geometry, min, max); foreach ( int prim; prims ) { removeprim("primitives.bgeo", prim, 1); }
primfind
のパフォーマンスの良さを確認するために、上記の関数と同等の以下の実装を比較します:
float tol = 1e-5; vector min, max; getbbox("bbox.bgeo",min,max); int n = nprimitives(0); for ( int prim = 0; prim < n; ++prim ) { int[] verts = primvertices("primitives.bgeo", prim); // プリミティブ境界ボックスを計算して、それをprim_minとprim_maxに保存します。 vector vert_pos = point("primitives.bgeo", "P", vertexpoint("primitives.bgeo", verts[0])); vector prim_min = vert_pos, prim_max = vert_pos; for ( int v = 1; v < len(verts); ++v ) { vert_pos = point("primitives.bgeo", "P", vertexpoint("primitives.bgeo", verts[v])); prim_min = min(prim_min, vert_pos); prim_max = max(prim_max, vert_pos); } // 境界ボックスの交差テスト if ( prim_max.x - min.x < -tol ) continue; if ( prim_max.y - min.y < -tol ) continue; if ( prim_max.z - min.z < -tol ) continue; if ( prim_min.x - max.x > tol ) continue; if ( prim_min.y - max.y > tol ) continue; if ( prim_min.z - max.z > tol ) continue; removeprim("primitives.bgeo", prim, 1); }
See also | |
intersect | |
prim |
|
search |