2011-12-25 14 views
1

さて、私はフォンシェーディングを使ってレイトレーサに取り組んでいます。これまでは、すべてが良いです。私はシーンの球に当たった光線をキャストし、フォンシェーディングを適用して正常に見えます。Ray-Sphere交差点:判別式が間違っています

ここでは、主光線から光源までの交点から光線を射影し、途中のオブジェクトに当たったかどうかを確認しているシャドウレイを計算しています。そうであれば、それは影になっています。

しかし、シャドーレイが球に当たるかどうかを計算するとき、私の判別式には誤差があるように見えます。これは、今のところ主光線については正しいので、奇妙です。

はここにセットアップです:

// Origin of ray (x,y,z) 
origin: -1.9865333, 1.0925934, -9.8653316 
// Direction of ray (x,y,z), already normalized 
ray: -0.99069530, -0.13507602, -0.016648887 

// Center of sphere (x,y,z) 
cCenter: 1.0, 1.0, -10.0 
// Radius of the sphere (x,y,z) 
cRadius: 1.0 

、ここでは、判別を見つけるためのコードです:

// A = d DOT d 
float a = dotProd(ray, ray); 

// B = 2 * (o - c) DOT d 
Point temp (2.0*(origin.getX() - cCenter.getX()), 2.0*(origin.getY() - cCenter.getY()), 2.0*(origin.getZ() - cCenter.getZ())); 
float b = dotProd(temp, ray); 

// C = (o - c) DOT (o - c) - r^2 
temp.setAll(origin.getX() - cCenter.getX(), origin.getY() - cCenter.getY(), origin.getZ() - cCenter.getZ()); 
float c = dotProd(temp, temp); 
c -= (cRadius * cRadius); 

// Find the discriminant (B^2 - 4AC) 
float discrim = (b*b) - 4*a*c; 

明らかに、光線は球から離れて指している、まだここでの判別は(正です2.88)、球が球に当っていることを示します。そして、このコードは、それらの判別式が正しくなければならないが、これらの副次的な影の光線ではなく、主光線に対してはうまく機能する。

ここに何か不足していますか?

+0

私の推測では、数学の理解とそれが何を伝えているのか分からない。このアルゴリズムは、線とは対照的に線が球と交差するかどうかを教えてくれるでしょうか?つまり、線は2方向に無限大を持つ。 –

+0

@woodchipsレイはベクトル(方向を持つ点)なので、ある方向(指す方向)に無限大です。数式は球の関数に基づいています。点Pは、|| P-Pc ||を満たす場合、球面上にある。 = r^2ここで、Pcは球の中心であり、rは半径である。レイについては、P = Q + td、ここでQはレイの開始点、dは方向、tは「時間」である場合、点Pはレイ上にある。ここで私の説明が不足している場合のリンクです:http://wiki.cgsociety.org/index.php/Ray_Sphere_Intersection – user1115016

+0

はい。また、ラインとレイの定義を慎重にコピーしている間に、先に進んだ方程式を理解するのに気を配りません。正または負の判別式は、光線の交点の解があることを意味しません。判別式が正の場合は、球を横切る無限線の解が存在することがわかります!!!!!!! (実際には、非負が関心の基準です。)あなた自身を参照している文書を読み、完全に読んでください。 –

答えて

3

だから、私の問題のための短い答えは、ケースに誰かがこれを検出し、同じ問題を抱えている:

判別式はヒットがライン(およびためないのために存在しているかどうかを示します、私が思ったように)。それが肯定的であれば、それはラインのどこかでヒットを検出しました。

したがって、レイのt値を計算するときに、それらが負であるかどうかを確認してください。それらが存在する場合は、光線の原点(すなわち、光線の反対方向)の後ろにヒットしますので、それを破棄します。彼らは光線の方向にヒットしているので、正の値を保持してください。

さらに短い回答:負のt値を破棄します。

クレジットはwoodchipsに、これを実現させるために行っています。

-1

かなり確信して「O-C」「C-O」

あなたは間違った方向にオフ線を撮影し、球の反対側の交差点を見つけるしていなければなりません。

0

問題は、線と球の交点を見つけるというトリックは、二次方程式の解を必要とすることです。そのような方程式は、解として3つの可能性のうちの1つを有する。すなわち、その方程式に0,1または2の真の解がある。判別式の符号は、そこに実際に存在する解がどれだけあるかを示します(これらの解を解くのに役立ちます)。

固有の解が存在する場合、線は球の表面にキスします。これは、判別式が正確にゼロである場合に発生します。

2つの解が存在する場合、線は球を通過し、2つの異なる点で表面に当たる。

実際の解が存在しない場合(判別式が負の場合)、線は球から離れすぎて全く接触しません。

ラインが球に近づくかどうかを見つけたら、それだけで、光線が当たったら心配します。このために、レイをどのように定義するかを見ることができます。光線は半直線で、一方向にのみ無限に広がっています。そこで、交差点がどこにあるのかを見てみましょう。私たちが気にする線の半分で交差点が発生した場合にのみ、RAY球の交差点があります。

重要なのは、判別式を計算する(そして単に記号をテストする)ことは、行が何をするかについてのみを示し、その行に沿って交差がどこに起こるかはわかりません。

もちろん、あなた自身が提供したリンクを注意深く読んでおけば、これはすべてあなたに伝えられたでしょう。

+0

あなたのコメントの答えがより役に立ちました。 – user1115016