public static float ClosestRayPointDistance(this Ray val, Ray ray) { Vector3 v0 = val.origin; Vector3 v1 = val.direction; Vector3 v2 = ray.origin; Vector3 v3 = ray.direction; Vector3 v4 = v0 - v2; float d0 = 0.0f; float d1 = 0.0f; float dv4v3 = Vector3.Dot(v4, v3); float dv3v1 = Vector3.Dot(v3, v1); float dv3v3 = Vector3.Dot(v3, v3); float dv4v1 = Vector3.Dot(v4, v1); float dv1v1 = Vector3.Dot(v1, v1); float denom = dv1v1 * dv3v3 - dv3v1 * dv3v1; if (Mathf.Abs(denom) > Mathf.Epsilon) { float numer = dv4v3 * dv3v1 - dv4v1 * dv3v3; d0 = numer / denom; } else { d0 = 0.0f; } d1 = (dv4v3 + d0 * dv3v1) / dv3v3; if (d1 >= 0.0f) { return(d0); } else { d1 = 0.0f; return(val.ClosestPointDistance(ray.origin)); } }
public static Vector3 ClosestPoint(this Ray val, Vector3 point) { return(val.GetPoint(val.ClosestPointDistance(point))); }