bool RayCastOnTriangle(VECTOR4D &V0, VECTOR4D &V1, VECTOR4D &V2, VECTOR4D &RayOrigin, VECTOR4D &RayDir, VECTOR4D &Intersection) { VECTOR4D Plane, Offset; float n, d, u, w0, w1, w2; Plane = Cross3((V1 - V0), (V2 - V0)); Plane = Normalize(Plane); Plane.w = -Dot(V0, Plane); PlaneIntersect(RayOrigin, RayDir, Plane, n, d); if (fabs(d) < EPSILON) return false; u = n / d; if (u < 0.0f) return false; Offset = { RayDir.x * u, RayDir.y * u, RayDir.z * u, 0.0f }; Intersection = RayOrigin + Offset; return PtInTriangleBarycentric(V0, V1, V2, Intersection, w0, w1, w2); }
bool RayCastOnTriangle( VECTOR4D& V0, VECTOR4D& V1, VECTOR4D& V2, VECTOR4D& RayOrigin, VECTOR4D RayDir, VECTOR4D& Intersection, float* w0, float* w1, float* w2) { VECTOR4D Plane; Plane = Cross3((V1 - V0), (V2 - V0)); Plane = Normalize(Plane); Plane.w = -Dot(V0, Plane); //Plane = [A,B,C,D] los coeficientes del plano. float n, d; PlaneIntersect(RayOrigin, RayDir, Plane, n, d); if (fabs(d) < 0.0001) return false; float u = n / d; if (u < 0.0f) return false; VECTOR4D Offset = { RayDir.x*u, RayDir.y*u, RayDir.z*u, 0 }; Intersection = RayOrigin + Offset; //float w0, w1, w2; return PtInTriangleBarycentric( V0, V1, V2, Intersection, *w0, *w1, *w2); }