2012-01-17 22 views
0

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

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

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

私はキューブの交差点を右に行っているとは思わないのですが、

+0

こんにちはクリス、私はあなたの投稿や助けをお勧めしないが、質問をする前にあなたのコードにいくつかの健全性チェックを行う必要があると思います。たとえば、箱の交差がうまくいかない場合、テストの状況によって正しい答えがどのようになるかが分かりました。すなわち、(1,0,0)に沿って動く(-1,0.5,0.5)のレイと交差するサイズ(1,1,1)の(0,0,0)のコーナーを持つボックスは、(0,0.5) 、0.5)、この種のもの。あなたがここに来るときには、校正の読書サービスとしてだけでなく、助言を得ることができます。 –

答えて

3

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

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

以上

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

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

を変更する

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

を変更します

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

次に、あなたのコードのいずれかのセクションには、次のようになります。

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; 
} 

そしてこれは一つの問題を明らかにする。 tNeartFarは、その行がキューブと交差する範囲の値をtと定義します。テストする各座標(x、y、z)は、間隔をさらに制限します。しかし、コードtFar = max(tFar, t1)は間隔を広げています。それをtFar = min(tFar, t1)に変更します。

さらに基本的には軸に沿った立方体に制限されますが、後でより複雑な図形のクイックヒットテストとして役立ちます。とにかく、これが働いたらもっと一般的にしたいかもしれません。

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

プレーンは、スペースを2つの半分に分割します。ノーマルポイントを「外側」とし、残りの半分を「内側」として定義します。その点の平面方程式が正の場合、点は平面の外にあり、値が負の場合は面内、値がゼロの場合は平面上にあります。

これを光線追跡するには、光線/平面の交差点を決定し、最も近いものを選択します。その点が面内にあるかどうかを判断するには(面が無限であることを覚えておいてください)、点が他のすべての面の内側にあるかどうかを確認します。そうでない場合は、次に近い交差点をテストします。

これが機能したら、それを一般的な交差点や形状の違い(例えば、面の1つに半球のくぼみがあるキューブ)に拡張するのは非常に簡単です。

5

レイボックス交点を計算するための最良のアルゴリズムの1つは、slab methodです。私はそれの私の最適化された実装についても概略したhere、同様に。

+0

私は既にそのサイトから自分のメソッドを取得しましたが、とにかく感謝します。 – Chris

+0

こんにちはタビアン、私はこれが非常に便利だとわかりました! - しかし、この方法は、方向ベクトルの符号を尊重/理解することになっていますか?あなたの関数をGolangに行単位でコピーしているようには見えないので、私はちょうどここでSOの質問を出しました:http://stackoverflow.com/questions/9971105/slab-method-for-ray-box-交叉 - 反対方向のための偽陽性を与える – metaleap