3

私の Plane クラスには 2 つのフィールドがあります。

public Vector3 Norm; //normal vector 
public double Offset; //signed distance to origin

これは交差点に使用するコードで、正しいかどうかはわかりません。方程式とすべてを再確認しましたが、これについてより経験豊富な人からフィードバックを得たいと思います.

public override Intersection Intersect(Ray ray)
{
    // Create Intersection.
    Intersection result = new Intersection();

    // Find t.
    double t = - (Vector3.Dot(Norm,ray.Start) + Offset) / (Vector3.Dot(Norm, ray.Dir));
    if (t < 0) // the ray does not hit the surface, that is, the surface is "behind" the ray
        return null;

    // Get a point on the plane.
    Vector3 p = ray.Start + t * ray.Dir;

    // Does the ray intersect the plane inside or outside?
    Vector3 planeToRayStart = ray.Start - p;
    double dot = Vector3.Dot (planeToRayStart, Norm);
    if (dot > 0) {
        result.Inside = false;
    } else {
        result.Inside = true;
    }

    result.Dist = t;
    return result;
}

また、t が 0 に近い場合はどうすればよいかわかりません。イプシロンで確認する必要があり、イプシロンの大きさを確認する必要がありますか? また、光線が平面と交差するかどうかを正しく確認できるかどうかもわかりません。

ありがとう

4

1 に答える 1

2

コードはほとんど問題ないようです。このスライドを参照してください。平面は基本的に、(オフセット パラメータでカプセル化された) 特定のポイントで始まり、法線ベクトルに直交する光線のセットとして定義されるため、ビュー レイ上のポイントの定義をプラグインするだけで済みます。視線上のどの点がそのような直交光線を定義するかを決定するために。

問題は、視線が平面内にある場合です。この場合、表示光線と法線光線は直交するため、内積は 0 になり、0 除算の例外が発生します。事前に確認する必要があります。表示ベクトルと法線の内積が 0 の場合、表示光線が平面に平行であるため、交差がないか、無数にあることを意味します。交点(光線は平面の内側にあります)。いずれにせよ、レイ トレーシングの場合、交点がない (つまり、レンダリングするものが何もない) と言うのが普通だと思います。なぜなら、後者の場合、2 次元の平面を真正面から見ているからです。何も見えません。

「0に近い」を特別に処理する必要がある理由はわかりません。光線が平面に平行でレンダリングするものが何もないか、平行ではなく正確に 1 点で平面と交差します。最終的には浮動小数点の丸めエラーが発生しますが、これはレンダリングにおける小さなエラーの原因であり、とにかくシーンの近似にすぎません。次元を適度に大きくしておく限り、浮動小数点エラーはわずかです。

于 2012-12-04T13:36:16.497 に答える