2012-11-22 72 views
3

我的飛機類有兩個字段:這個平面射線相交碼是否正確?

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該怎麼辦?我應該檢查與epsilon和多大的epsilon應該是?此外,我不確定我是否正確檢查了射線是否從內部或外部與 飛機相交?

感謝

回答

2

你的代碼看起來大多是罰款,看到this slide。由於您的平面基本上定義爲從特定點開始的一組光線(它被封裝在偏移參數中),並且與法線矢量正交,因此您只需要在查看光線中插入一個點的定義爲了確定觀察射線上的哪個點定義了這樣的正交射線。

如果您的觀看光線在飛機上,問題將會發生。在這種情況下,觀察射線和正常射線將是正交的,所以它們的點積將爲0,並且您將得到除0的例外。你需要事先檢查:如果觀察矢量和法線的點積是0,那麼它意味着觀察射線平行於平面,所以要麼沒有相交,要麼有無限數目的交叉點(光線在平面內)。無論哪種方式,我認爲對於光線追蹤,你通常只會說沒有交點(即沒有任何渲染點),因爲在後一種情況下,你看着一個二維平坦的表面正好朝上,所以你不會什麼都看不到。

我不明白你需要特別處理「接近0」的任何理由。無論是光線平行於平面,沒有什麼可以渲染,或者它不是,它恰好在一個點上與飛機相交。最終你會得到浮點舍入誤差,但這只是渲染中的一個小錯誤來源,無論如何這只是場景的近似值。只要你保持你的維度相當大,浮點錯誤應該是非實質性的。