我正在寫一個非常基本的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行?
嗯,我想你應該兩個步驟合併成一個方法 - 看到穆勒 - Trumbore算法:https://en.m.wikipedia.org/wiki/Möller-Trumbore_intersection_algorithm – meowgoesthedog
如果您的代碼可以正確處理(0, 0,0),也許你可以通過v - p翻譯三角形頂點,其中p是點,然後應用代碼(0,0,0)。 –