さて、私はフォンシェーディングを使ってレイトレーサに取り組んでいます。これまでは、すべてが良いです。私はシーンの球に当たった光線をキャストし、フォンシェーディングを適用して正常に見えます。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)、球が球に当っていることを示します。そして、このコードは、それらの判別式が正しくなければならないが、これらの副次的な影の光線ではなく、主光線に対してはうまく機能する。
ここに何か不足していますか?
私の推測では、数学の理解とそれが何を伝えているのか分からない。このアルゴリズムは、線とは対照的に線が球と交差するかどうかを教えてくれるでしょうか?つまり、線は2方向に無限大を持つ。 –
@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
はい。また、ラインとレイの定義を慎重にコピーしている間に、先に進んだ方程式を理解するのに気を配りません。正または負の判別式は、光線の交点の解があることを意味しません。判別式が正の場合は、球を横切る無限線の解が存在することがわかります!!!!!!! (実際には、非負が関心の基準です。)あなた自身を参照している文書を読み、完全に読んでください。 –