public bool IntersectsTriangle(ITriangle3D triangle, float mint = 0, float maxt = 99999999) { float t; Vector3 hit; return(IntersectsTriangle(triangle, out t, out hit)); }
public bool IntersectsTriangle(ITriangle3D triangle, out float t, out Vector3 hit, float mint = 0, float maxt = 99999999) { Vector3 p = this.origin, pv = this.normalizedDir; Vector3 v1 = triangle.V1, v2 = triangle.V2, v3 = triangle.V3; var pd = (v2 - v1) * (v3 - v2); var len = Vector3.Length(pd); var l = (1.0f / len) * new Vector4(pd.x, pd.y, pd.z, Vector3.Dot(-pd, v1)); t = -Vector4.Dot(l, new Vector4(p, 1)) / Vector4.Dot(l, new Vector4(pv, 0)); if (t < mint || t > maxt) { hit = new Vector3(); return(false); } hit = (p + t * pv); Vector3 c; c = Vector3.Cross(v2 - v1, hit - v1); if (Vector3.Dot(pd, c) < 0) { return(false); } c = Vector3.Cross(v3 - v2, hit - v2); if (Vector3.Dot(pd, c) < 0) { return(false); } c = Vector3.Cross(v1 - v3, hit - v3); if (Vector3.Dot(pd, c) < 0) { return(false); } return(true); //return PlaneHitTestForm.PointInTriangle(hit, Vector3.Normalize(pd), v1, v2, v3); }