レイボックスの交差点をテストする方法はいくつかあります。
ComputeIntersectionBox(...)メソッドを使用すると、引数として光線とボックスを受け取り、光線とボックスの最も近い交点を計算します。この方法は、ボックスの各面で平面を形成し、各平面との交点を見つけることによって機能します。交点が見つかると、交点がコーナーポイントの間にあることを確認することにより、ポイントがボックスの表面上にあるかどうかがチェックされます。このアルゴリズムを2つの異なるボックスで実行した後に光線を見ると、正しい交差が得られます。
2つの球、12面体(三角形メッシュ)、および2つのボックスを持つシーンで、行列変換を使用せずにComputeIntersectionScene(...)メソッドを使用します。ComputeIntersectionScene(...)は、シーングラフのすべてのノードを再帰的にトラバースし、指定された光線との最も近い交差を計算します。特にこのテストでは、親ノードが持つ可能性のある、子にも適用する必要のある変換は適用されません。このテストでは、正しい交差点も取得します。
行列変換でComputeIntersectionScene(...)メソッドを使用します。このテストは、光線とシーン内のノードとの交差を見つける前に、ノードの変換行列の逆行列を使用して光線がノードの座標フレームに変換され、交差が計算された後、この交差が計算されることを除いて、上記のテストと同様に機能します。変換行列を交点に適用することにより、ワールド座標に変換されます。
2で説明したのと同じシーンファイルで3番目の方法でテストする場合、4つの光線でテストします(したがって、1つの光線が1つの球と交差し、1つの光線が他の球と交差し、1つの光線が1つのボックス、1つの光線が他のボックス)、 2つの球は交差し、2つのボックスは交差しません。ComputeIntersectionBox(...)メソッドを調べてデバッグすると、光線はボックス上のすべての平面と交差しますが、各交差点はボックス上にないことが実際にわかります。
これは奇妙な動作のようです。変換なしでテスト2を使用すると、正しいボックスの交点が得られ(したがって、レイボックスの交点が正しいと思います)、変換を使用してテスト3を使用すると、正しい球の交点が得られます(したがって、変換された光線は問題ないと思います)。
私が間違っている可能性のある提案はありますか?
前もって感謝します。