I used the Möller-Trumbore algorithm. That seemed to work for a while but I found a bug:
const glm::vec3 avert0 = glm::vec3(-0.13f, 0.01f, 0.0f);
const glm::vec3 avert1 = glm::vec3(-0.01f, 0.01f, 0.0f);
const glm::vec3 avert2 = glm::vec3(-0.13f, 0.1f, 0.0f);
const glm::vec3 start = glm::vec3(-0.1f, 0.05f, -1.0f);
const glm::vec3 end = glm::vec3(-0.1f, 0.05f, 1.0f);
rayIntersectTriangle(start, end, avert0, avert1, avert2, position);
The above code does not collide ( u is < 0 ). However, if I change the Z value of the end vector from 1 to 30, it works:
const glm::vec3 end = glm::vec3(-0.1f, 0.05f, 30.0f);
Here is my implementation:
bool Node::rayIntersectTriangle(glm::vec3 orig, glm::vec3 dest
, glm::vec3 vert0, glm::vec3 vert1, glm::vec3 vert2
, glm::vec3 &result)
{
const glm::vec3 edge1 = vert1 - vert0;
const glm::vec3 edge2 = vert2 - vert0;
const glm::vec3 pvec = glm::cross(dest, edge2);
const float det = glm::dot(edge1, pvec);
static const float Epsilon = std::numeric_limits<float>::epsilon();
/*
If det is below zero, we are back facing the triangle.
If det is close to zero we are missing the triangle.
*/
if (det > -Epsilon && det < Epsilon)
return false;
const float invDet = 1.0f / det;
const glm::vec3 tvec = orig - vert0;
result.x = glm::dot(tvec, pvec) * invDet;
if (result.x < 0.0f || result.x > 1.0f)
return false;
const glm::vec3 qvec = glm::cross(tvec, edge1);
result.y = glm::dot(dest, qvec) * invDet;
if (result.y < 0.0f || result.x + result.y > 1.0f)
return false;
result.z = glm::dot(edge2, qvec) * invDet;
return true;
}