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