hou.Geometry.intersect()を使用した時、hou.Geometryはアクセラレーション構造を保存します。 しかし、ジオメトリに変化があれば、その構造はリセットされます。 Geometry Ray Cacheは、ポイント位置のみが変化する場合には、このアクセラレーション構造を維持して再利用することができます。
メソッド ¶
__init__()
新しいGeometryRayCache
を返します。
同じGeometry Ray Cacheを複数のジオメトリにわたって使用することができますが、光線交差を高速化するために、できるだけアクセラレーション構造をキャッシュ化します。
intersect(ray_origin, ray_direction, position_out, normal_out, uvw_out, min_hit=0.01, max_hit=1E18, tolerance=0.01)
→ int
このオブジェクトのジオメトリと光線の交点を判定します。
Note
このメソッドは、交差に関する複数の情報を返すわけではなく、引数に渡されたオブジェクトがその交差情報で修正されるという点で珍しいです。
光線がジオメトリと交差した場合はその当たったプリミティブのID番号を返し、当たらなければ-1
を返します。
ray_origin
光線のワールド空間での開始点を表現したhou.Vector3オブジェクト。
ray_direction
光線の方向ベクトルを表現したhou.Vector3オブジェクト。
position_out
この引数にはhou.Vector3オブジェクトを渡してください。 このメソッドは、そのオブジェクトの値を、ワールド空間での交差位置を表現した値に変更します。
normal_out
この引数にはhou.Vector3オブジェクトを渡してください。 このメソッドは、そのオブジェクトの値を、光線が当たったプリミティブの法線方向を表現した値に変更します。
uvw_out
この引数にはhou.Vector3オブジェクトを渡してください。 このメソッドは、そのオブジェクトの値を、光線が当たったプリミティブのUVW位置を表現した値に変更します。
min_hit
この距離より近くにある交差を無視します。
min_hit
引数を使用する際は、min_hit
を前のヒットよりも少し遠くに設定することで、光線沿いにあり得るすべてのヒットをループさせることができます。
hit_positions = [] prev_dist = 0.01 while geometry.intersect(origin, direction, position, normal, uvw, min_hit=prev_dist): # ループを反復させる度に変更されるオブジェクトではなくて、位置の *コピー* を必ず保存するようにします。 hit_positions.append(hou.Vector3(position)) prev_dist = origin.distanceTo(position) + 0.01
max_hit
この距離より遠くにある交差を無視します。
tolerance
このパラメータを使用することで、交差の精度を調整することができます。 光線がこの閾値内でジオメトリに到達すれば、交差したと見なされます。 許容値が0.01(デフォルト)は交差判定が厳しく、許容値を大きくするほど交差精度が悪くなります。
findAllInTube(line_origin, line_direction, radius, min_hit=0, max_hit=1E18, tolerance=5E-3)
→ tuple
of hou.Point
線の原点、方向、半径で指定されたチューブの範囲内にあるジオメトリのすべてのポイントのタプルを返します。
ray_origin
ワールド空間で線の開始点を表現したhou.Vector3オブジェクト。
ray_direction
線の方向ベクトルを表現したhou.Vector3オブジェクト。
radius
線からこの距離の範囲内にあるポイントを検索します。
min_hit
この距離より近くにある交点を無視します。
このmin_hit
引数を利用して、min_hit
を前のヒットよりも若干遠い距離に設定するループを組むことで、光線沿いのヒットすべてをループさせることができます。
max_hit
この距離より遠くにある交点を無視します。
tolerance
このパラメータを使用することで、交差精度を調整することができます。 (デフォルトの)5E-3の許容誤差だと交差精度は厳しく、値が大きいほど交差精度が悪くなります。