1

レイボックスの交差点をテストする方法はいくつかあります。

  1. ComputeIntersectionBox(...)メソッドを使用すると、引数として光線とボックスを受け取り、光線とボックスの最も近い交点を計算します。この方法は、ボックスの各面で平面を形成し、各平面との交点を見つけることによって機能します。交点が見つかると、交点がコーナーポイントの間にあることを確認することにより、ポイントがボックスの表面上にあるかどうかがチェックされます。このアルゴリズムを2つの異なるボックスで実行した後に光線を見ると、正しい交差が得られます。

  2. 2つの球、12面体(三角形メッシュ)、および2つのボックスを持つシーンで、行列変換を使用せずにComputeIntersectionScene(...)メソッドを使用します。ComputeIntersectionScene(...)は、シーングラフのすべてのノードを再帰的にトラバースし、指定された光線との最も近い交差を計算します。特にこのテストでは、親ノードが持つ可能性のある、子にも適用する必要のある変換は適用されません。このテストでは、正しい交差点も取得します。

  3. 行列変換でComputeIntersectionScene(...)メソッドを使用します。このテストは、光線とシーン内のノードとの交差を見つける前に、ノードの変換行列の逆行列を使用して光線がノードの座標フレームに変換され、交差が計算された後、この交差が計算されることを除いて、上記のテストと同様に機能します。変換行列を交点に適用することにより、ワールド座標に変換されます。

2で説明したのと同じシーンファイルで3番目の方法でテストする場合、4つの光線でテストします(したがって、1つの光線が1つの球と交差し、1つの光線が他の球と交差し、1つの光線が1つのボックス、1つの光線が他のボックス)、 2つの球は交差し、2つのボックスは交差しません。ComputeIntersectionBox(...)メソッドを調べてデバッグすると、光線はボックス上のすべての平面と交差しますが、各交差点はボックス上にないことが実際にわかります。

これは奇妙な動作のようです。変換なしでテスト2を使用すると、正しいボックスの交点が得られ(したがって、レイボックスの交点が正しいと思います)、変換を使用してテスト3を使用すると、正しい球の交点が得られます(したがって、変換された光線は問題ないと思います)。

私が間違っている可能性のある提案はありますか?

前もって感謝します。

4

1 に答える 1

0

したがって、間違いは実際には実装のバグでした。光線を変換しているときに、ポインタを光線に変換していました。これにより、光線内のすべてのポインタも変換されました(関数は再帰的であるため)。私がすべきことは、光線の別のコピーを作成し、元のコピーではなく、コピーに対して変換を実行することです。

于 2010-04-14T18:06:46.343 に答える