public bool GetClosestPointIfWeCan(Vector3 k, GravityOverrideCylinder gravityOverride, out Vector3 closestPoint) { closestPoint = Vector3.zero; if (!gravityOverride.CanApplyGravity) { return(false); } float dist = Vector3.Dot(k - _p1, _delta); //k projection is outside the [_p1, _p2] interval, closest to _p1 if (dist <= 0.0f) { return(_circle1.GetClosestPointOnDiscIfWeCan(k, gravityOverride.Disc1, out closestPoint)); } //k projection is outside the [_p1, p2] interval, closest to _p2 else if (dist >= _deltaSquared) { return(_circle2.GetClosestPointOnDiscIfWeCan(k, gravityOverride.Disc2, out closestPoint)); } //k projection is inside the [_p1, p2] interval else { if (!gravityOverride.Trunk) { return(false); } dist = dist / _deltaSquared; Vector3 pointOnLine = _p1 + dist * _delta; closestPoint = pointOnLine + ((k - pointOnLine).FastNormalized() * _realRadius); return(true); } }
public bool GetClosestPointIfWeCan(Vector3 k, GravityOverrideDisc gravityOverride, out Vector3 closestPoint) { closestPoint = Vector3.zero; if (!gravityOverride.CanApplyGravity) { return(false); } return(_circle.GetClosestPointOnDiscIfWeCan(k, gravityOverride, out closestPoint)); }
public bool GetClosestPointIfWeCan(Vector3 k, GravityOverrideConeSphereBase gravityOverride, out Vector3 closestPoint) { closestPoint = Vector3.zero; if (!gravityOverride.CanApplyGravity) { return(false); } float dist = Vector3.Dot(k - _p1, _delta); //k projection is outside the [_p1, _p2] interval, closest to _p1 if (dist <= 0.0f) { if (!gravityOverride.Top) { return(false); } closestPoint = _p1; return(true); } //k projection is outside the [_p1, p2] interval, closest to _p2 else if (dist >= _deltaDistSquared) { return(_circleBase.GetClosestPointOnDiscIfWeCan(k, gravityOverride.Base, out closestPoint)); } //k projection is inside the [_p1, p2] interval else { if (!gravityOverride.Trunk) { return(false); } dist = dist / _deltaDistSquared; Vector3 pointOnLine = _p1 + dist * _delta; closestPoint = ThalesCalculation(k, pointOnLine); return(true); } }