2017-08-13 76 views
0

我正在寫一個非常基本的raycaster 3D場景與三角對象和一切工作正常,直到我決定嘗試投射射線從場景的原點以外的點(0/0/0)。線三角相交檢查返回錯相交點

但是,當我將光線的原點更改爲(0/1/0)時,相交測試突然爲其中一個三角形返回錯誤的交點。

我故意將射線「射」到三角形中心的方向,所以顯然這應該是交點。我只是不知道導致我的代碼中的錯誤結果的是什麼。

(我不使用穆勒 - Trumbore的時刻,因爲我想用一個更簡單,更基本的方法開始了,但優化代碼時,我會切換到穆勒 - Trumbore。)

這些是我上述三角形的三個頂點的座標:

-2.0/2.0/0.0 | 0.0/3.0/2.0 | 2.0/2.0/0.0

這是三角形的中心:

0.0/2.3333333333333335/0.6666666666666666

這是我的射線(原點+ T *方向):

產地:0.0/1.0/0.0

方向(歸一化):0.0/0.894427190999916/0.4472135954999579

這是顯然是錯誤的交叉點我的PR ogram計算(檢查並找出該點甚至沒有在三角形前:

0.0/5.0/1.9999999999999996

所以,是的,這不是很難看到(甚至不用計算器)的光線應該打中心的三角形大約在t = 1.5。但是,我的代碼返回t的值4.472135954999579。

這裏是我的路口校驗碼:

public Vector intersectsWithTriangle(Ray ray, Triangle triangle) { 
    boolean intersects = false; 

    Vector triangleNormal = triangle.getNormalVector(); 
    double normalDotRayDirection = triangleNormal.dotProduct(ray.getDirection()); 

    if(Math.abs(normalDotRayDirection) == 0) { 
     // parallel 
     return null; 
    } 


    double d = triangleNormal.dotProduct(triangle.getV1AsVector()); 
    double t = (triangleNormal.dotProduct(ray.getOrigin()) + d)/normalDotRayDirection; 

    // Check if triangle is behind ray 
    if (t < 0) return null; 

    // Get point of intersection between ray and triangle 
    Vector intersectionPoint = ray.getPosAt(t); 

    // Check if point is inside the triangle 
    if(isPointInTriangle(intersectionPoint, triangle, triangleNormal)) { 
     intersects = true; 
     return intersectionPoint; 
    } 


    return null; 
} 

任何想法有什麼不對的計算t行?

+0

嗯,我想你應該兩個步驟合併成一個方法 - 看到穆勒 - Trumbore算法:https://en.m.wikipedia.org/wiki/Möller-Trumbore_intersection_algorithm – meowgoesthedog

+1

如果您的代碼可以正確處理(0, 0,0),也許你可以通過v - p翻譯三角形頂點,其中p是點,然後應用代碼(0,0,0)。 –

回答

1

如果射線被o + t*v給出和三角形平面由法線矢量n和點p定義,那麼我們尋找t S.T. n*(o + t*v) = n*p其中給出t = (n*p - n*o)/(n*v)。所以,你似乎有一個標誌錯誤和t正確的計算應該是:

double t = (d - triangleNormal.dotProduct(ray.getOrigin()))/normalDotRayDirection; 

只要射線起源是(0,0,0)符號錯誤並不重要。

+0

對不起,我遲到的迴應!是的,這確實是錯誤!謝謝! –