0

だから私は別のレイトレーシングの質問に戻ってきました。私のコードは球体をすべて細かくダンディにレンダリングしますが、立方体は実際には機能していません。このコードを使用して交差点をテストしています:http://pastebin.com/qgm6vpdx(これは再帰関数であり、tは交差点までの距離です)バウンディングボックスは次のように定義されます。

Cube* c1 = new Cube;      
c1->Corner1 = Vec3(100, 100, 100);      
c1->Corner2 = Vec3(200, 200, 200);

カメラが立方体の中にないことを確認しました。ここで、唯一の問題は、画面全体が緑色(立方体に指定された色)として表示されることです。

私は立方体の交差を正しく行っているとは思いませんが、誰かが私のコードを校正できますか?

4

2 に答える 2

6

レイボックスの交差を計算するための最良のアルゴリズムの1つは、スラブ法です。ここでも、最適化された実装の概要を説明しました。

于 2012-01-19T20:22:34.137 に答える
3

コードをもっと短くして読みやすくすることができます。たとえば、に変更int tNear = -2147000000int tNear = INT_MINて変更します

if(t1 > t2)
{
    float temp1 = t1;
    t1 = t2;
    t2 = temp1;
}

if(t1 > t2)
{
    // std::swap is built-in
    swap(t1, t2);
}

以上

// Define 'order' yourself
order(t1, t2);

と変更

if(t1 > tNear)
{
   tNear = t1;
}

// std::max is built in
tNear = max(tNear, t1);

次に、コードの1つのセクションは次のようになります。

if ((ray.dir.x == 0) && (ray.start.x < Min.x) && (ray.start.x > Max.x))
{
    //parallel
    return false;
}
else
{
    float t1 = (Min.x - ray.start.x) / ray.dir.x;
    float t2 = (Max.x - ray.start.x) / ray.dir.x;
    order(t1, t2);
    tNear = max(tNear, t1);
    tFar = max(tFar, t1);
    if ((tNear > tFar) || (tFar < 0))
        return false;
}

そして、これは1つの問題を明らかにします。 線が立方体と交差する値の間隔を定義しますtNear。テストする各座標(x、y、z)は、間隔をさらに制限します。ただし、コードは間隔を拡張しています。に変更します。tFarttFar = max(tFar, t1)tFar = min(tFar, t1)

より基本的には、これにより軸に整列した直方体に制限されますが、このコードは後で、より複雑な形状のクイックヒットテストとして役立つ場合があります。とにかく、これが機能したら、もっと一般的にしたいと思うかもしれません。

凸多角形は、法線が外側を向く無限平面のセットとして定義できます。すべての平面の「内側」にある場合、ポイントはポリゴンの内側にあります。

平面はスペースを2つに分割します。法線が指す半分を「外側」、残りの半分を「内側」と定義します。次に、その点の平面方程式が正の場合は平面の外側にあり、値が負の場合は平面の内側にあり、値がゼロの場合は平面上にあります。

これをレイトレーシングするには、レイ/プレーンの交点を決定し、最も近いものを選択します。その点が面内にあるかどうかを判断するには(平面が無限であることを忘れないでください)、その点が他のすべての平面内にあるかどうかを確認します。そうでない場合は、次に近い交差点をテストします。

これが機能すると、一般的な交差点や形状の違い(たとえば、面の1つに半球形のインデントがある立方体)に拡張するのは非常に簡単です。

于 2012-01-18T02:39:29.800 に答える