コードをもっと短くして読みやすくすることができます。たとえば、に変更int tNear = -2147000000
しint 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)は、間隔をさらに制限します。ただし、コードは間隔を拡張しています。に変更します。tFar
t
tFar = max(tFar, t1)
tFar = min(tFar, t1)
より基本的には、これにより軸に整列した直方体に制限されますが、このコードは後で、より複雑な形状のクイックヒットテストとして役立つ場合があります。とにかく、これが機能したら、もっと一般的にしたいと思うかもしれません。
凸多角形は、法線が外側を向く無限平面のセットとして定義できます。すべての平面の「内側」にある場合、ポイントはポリゴンの内側にあります。
平面はスペースを2つに分割します。法線が指す半分を「外側」、残りの半分を「内側」と定義します。次に、その点の平面方程式が正の場合は平面の外側にあり、値が負の場合は平面の内側にあり、値がゼロの場合は平面上にあります。
これをレイトレーシングするには、レイ/プレーンの交点を決定し、最も近いものを選択します。その点が面内にあるかどうかを判断するには(平面が無限であることを忘れないでください)、その点が他のすべての平面内にあるかどうかを確認します。そうでない場合は、次に近い交差点をテストします。
これが機能すると、一般的な交差点や形状の違い(たとえば、面の1つに半球形のインデントがある立方体)に拡張するのは非常に簡単です。