embree で user geometry + node transform のメモ
に例がある.
- Bounds
- Intersect(実際に交点を求める)
- Occluded(交点は求めず, 遮蔽されているかどうかだけチェック. shadow ray とか用)
の 3 つの関数を提供してあげる必要がある.
さらに, Intersect, Occluded では, 内部で Intersection filter function を呼んであげる必要がある.
(Intersection filter を使わないのであればスキップ可能)
動的に Shape(node) を Xform したい
geometry に対して
rtcSetGeometryTransform
rtcCommitGeometry
rtcCommitScene
ではうまくいかないっぽい.
一度 Geom から Scene を作り, Scene に対して Instance Geom を作ってあげる必要がある.
その Instanced geom(中身は scene)に対して rtcSetGeometryTransform する.
あと, rtcSetSceneFlags で RTC_SCENE_FLAG_DYNAMIC を設定しておくとよい.
には, Native instancing 版とそうではない版の両方がある.
Native instancing は ray などの xform を Embree 側に行わせる, そうではないほうは instanced geom も user geometry として扱い, 自前で xform させる.
とくにこだわった処理が必要でなければ, Native instancing 版を使うとコード量もすくなくてよいでしょう.
あと, intersection function には, inverse xform'ed された ray 座標が入ってくる
intersection function でのレイの座標
intersection function などではレイの位置と方向は, instance xform の inverse を取ってxform されている(shape の local 座標に変換されている)ので注意する.
レイの絶対座標を使ってなにか判定処理とかする場合は, 自前でレイ座標を再度 xform してあげるなどの対応が必要となる
Discussion