Exemple #1
0
	bool Ray::GetIntersection(const Triangle &triangle, float &t) const
	{
		float u, v, w;

        glm::vec3 pa = triangle[0] - mOrigin;
        glm::vec3 pb = triangle[1] - mOrigin;
        glm::vec3 pc = triangle[2] - mOrigin;

		glm::vec3 m = glm::cross(mDirection, pc);
		u = glm::dot(pb, m);

		v = -glm::dot(pa, m);
		if(glm::sign(u) != glm::sign(v)) {
			return false;
		}

        w = MathUtil::ScalarTriple(mDirection, pb, pa);
		if(glm::sign(u) != glm::sign(w)) {
			return false;
		}

        float denom = 1.0f / (u + v + w);
        u *= denom;
        v *= denom;
        w *= denom;

        glm::vec3 point = triangle.BarycentricPoint(u, v, w);

		t = glm::dot((point - mOrigin), mDirection);

		if(t >= 0) {
			return true;
		}

        return false;
	}