public static bool IntersectRayTriangle(Ray ray, LVector3 t1, LVector3 t2, LVector3 t3, out LVector3 intersection) { intersection = LVector3.zero; LVector3 edge1 = t2.sub(t1); LVector3 edge2 = t3.sub(t1); LVector3 pvec = ray.direction.cross(edge2); LFloat det = edge1.dot(pvec); if (IsZero(det)) { var p = new Plane(t1, t2, t3); if (p.testPoint(ray.origin) == PlaneSide.OnPlane && IsPointInTriangle(ray.origin, t1, t2, t3)) { intersection.set(ray.origin); return(true); } return(false); } det = 1 / det; LVector3 tvec = ray.origin.sub(t1); LFloat u = tvec.dot(pvec) * det; if (u < 0 || u > 1) { return(false); } LVector3 qvec = tvec.cross(edge1); LFloat v = ray.direction.dot(qvec) * det; if (v < 0 || u + v > 1) { return(false); } LFloat t = edge2.dot(qvec) * det; if (t < 0) { return(false); } if (t <= FLOAT_ROUNDING_ERROR) { intersection.set(ray.origin); } else { ray.getEndPoint(intersection, t); } return(true); }