示例#1
0
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);
}
示例#2
0
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);
}