I'm trying to perform ray triangle intersection on a mesh made of triangles. The below code seems to work fine but only about 50% of the time. The ray often gets into positions where no intersection is detected when there definitely should be. Is there something wrong in my function that isn't checking for intersection under all circumstances.
bool rayTriangleIntersect(Vector3 rayOrigin,
Vector3 rayDirection,
Vector3 vert0,
Vector3 vert1,
Vector3 vert2,
ref Vector3 intersectionPosition)
{
// this originally comes from http://www.graphics.cornell.edu/pubs/1997/MT97.pdf
float u, v, t, det, inv_det;
Vector3 edge1, edge2, pvec, tvec, qvec;
Vector3 direction = rayDirection;
direction.Normalize();
t = v = u = 0f;
edge1 = vert1 - vert0;
edge2 = vert2 - vert0;
pvec = Vector3.Cross(direction, edge2);
det = Vector3.Dot(edge1, pvec);
if (det > -0.00001f)
return false;
inv_det = 1.0f / det;
tvec = rayOrigin - vert0;
u = Vector3.Dot(tvec, pvec) * inv_det;
if (u < -0.001f || u > 1.001f)
return false;
qvec = Vector3.Cross(tvec, edge1);
v = Vector3.Dot(direction, qvec) * inv_det;
if (v < -0.001f || u + v > 1.001f)
return false;
t = Vector3.Dot(edge2, qvec) * inv_det;
float rayMagnitude = rayDirection.magnitude;
if (t <= 0f || t >= rayMagnitude)
return false;
intersectionPosition = rayOrigin + (rayDirection * (t / rayMagnitude)); // percent along ray
return true;
}
and im calling it with
for (z = 0; z < LENGTH - 1; z++)
{
for (x = 0; x < WIDTH - 1; x++)
{
v0 = verts[(z * WIDTH) + x];
v1 = verts[((z + 1) * WIDTH) + x];
v2 = verts[(z * WIDTH) + x + 1];
v3 = verts[((z + 1) * WIDTH) + x + 1];
if(rayTriangleIntersect(rayOrigin, rayDirection, v0, v1, v2, ref intersectPosition) ||
rayTriangleIntersect(rayOrigin, rayDirection, v1, v2, v3, ref intersectPosition))
{
Debug.log(Intersection found at : " intersectPosition);
}
}
}
I'm really stuck on this one so any guidance would really be appreciated.
Edit
The triangle are defined like this:
for (z = 0; z < LENGTH - 1; z++)
{
for (x = 0; x < WIDTH - 1; x++)
{
triangles[index++] = (z * WIDTH) + x;
triangles[index++] = ((z + 1) * WIDTH) + x;
triangles[index++] = (z * WIDTH) + x + 1;
triangles[index++] = ((z + 1) * WIDTH) + x;
triangles[index++] = ((z + 1) * WIDTH) + x + 1;
triangles[index++] = (z * WIDTH) + x + 1;
}
}