public static Vector3 ClosestPointToTriangle(Vector3 a, Vector3 b, Vector3 c, Vector3 p) { var r = Quaternion.Inverse(Quaternion.LookRotation(-Vector3.Cross(a - b, a - c))); var ra = r * a; var rb = r * b; var rc = r * c; var rp = r * p; var a2 = D2D_Helper.VectorXY(ra); var b2 = D2D_Helper.VectorXY(rb); var c2 = D2D_Helper.VectorXY(rc); var p2 = D2D_Helper.VectorXY(rp); if (PointLeftOfLine(a2, b2, p2) == true) { return(ClosestPointToLineSegment(a, b, p)); } if (PointLeftOfLine(b2, c2, p2) == true) { return(ClosestPointToLineSegment(b, c, p)); } if (PointLeftOfLine(c2, a2, p2) == true) { return(ClosestPointToLineSegment(c, a, p)); } var barycentric = GetBarycentric(a2, b2, c2, p2); return(barycentric.x * a + barycentric.y * b + barycentric.z * c); }