示例#1
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SArrive info)
        {
            Vector3 l_distanceToTarget = info.m_target.position - ownKS.m_position;

            if (l_distanceToTarget.magnitude < info.m_closeEnoughRadius)
            {
                return(NULL_STEERING);
            }

            if (l_distanceToTarget.magnitude > info.m_slowDownRadius)
            {
                return(Seek.GetSteering(ownKS, info.m_target));
            }

            float   l_desiredSpeed    = ownKS.m_maxLinearSpeed * (l_distanceToTarget.magnitude / info.m_slowDownRadius);
            Vector3 l_desiredVelocity = l_distanceToTarget.normalized * l_desiredSpeed;

            Vector3 l_requiredAcceleration = (l_desiredVelocity - ownKS.m_linearVelocity) / info.m_timeToDesiredSpeed;

            l_requiredAcceleration = MathExtent.Clip(l_requiredAcceleration, ownKS.m_maxLinearAcceleration);

            SteeringOutput result = new SteeringOutput();

            result.m_linearAcceleration = l_requiredAcceleration;

            return(result);
        }
        public static SteeringOutput GetSteering(KinematicState ownKS, SIntercept info)
        {
            if (info.m_targetLinearVelocity == null)
            {
                return(NULL_STEERING);
            }

            float l_predictedTimeToTarget = (info.m_target.position - ownKS.m_position).magnitude / ownKS.m_linearVelocity.magnitude;

            l_predictedTimeToTarget = MathExtent.Clip(l_predictedTimeToTarget, info.m_maxPredictionTime);

            SURROGATE_TARGET.position = info.m_target.position + (info.m_targetLinearVelocity * l_predictedTimeToTarget);

            return(Seek.GetSteering(ownKS, SURROGATE_TARGET));
        }
示例#3
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SEvade info)
        {
            if (info.m_targetLinearVelocity == null)
            {
                return(NULL_STEERING);
            }

            float l_distanceToMe           = (ownKS.m_position - info.m_target.position).magnitude;
            float l_predictedCollisionTime = l_distanceToMe / info.m_targetLinearVelocity.magnitude;

            l_predictedCollisionTime = MathExtent.Clip(l_predictedCollisionTime, info.m_maxPredictionTime);

            SURROGATE_TARGET.position = info.m_target.position + info.m_targetLinearVelocity * l_predictedCollisionTime;

            return(Flee.GetSteering(ownKS, SURROGATE_TARGET));
        }
示例#4
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SVelocityMatching info)
        {
            if (info.m_targetLinearVelocity == null)
            {
                return(NULL_STEERING);
            }

            Vector3 l_requiredAcceleration = (info.m_targetLinearVelocity - ownKS.m_linearVelocity) / info.m_timeToDesiredVelocity;

            l_requiredAcceleration = MathExtent.Clip(l_requiredAcceleration, ownKS.m_maxLinearAcceleration);

            SteeringOutput l_result = new SteeringOutput();

            l_result.m_linearAcceleration = l_requiredAcceleration;

            return(l_result);
        }
示例#5
0
        public static SteeringOutput GetSteering(KinematicState ownKS, SAlign info)
        {
            float l_requiredAngularSpeed;
            float l_requiredAngularAcceleration;
            float l_angleSize;

            float l_requiredRotation = info.m_target.rotation.eulerAngles.y - ownKS.m_orientation;

            if (l_requiredRotation < 0f)
            {
                l_requiredRotation += 360f;
            }

            if (l_requiredRotation > 180f)
            {
                l_requiredRotation = -(360f - l_requiredRotation);
            }

            l_angleSize = Mathf.Abs(l_requiredRotation);

            if (l_angleSize <= info.m_closeEnoughAngle)
            {
                return(NULL_STEERING);
            }

            if (l_angleSize > info.m_slowDownAngle)
            {
                l_requiredAngularSpeed = ownKS.m_maxAngularSpeed;
            }
            else
            {
                l_requiredAngularSpeed = ownKS.m_maxAngularSpeed * (l_angleSize - info.m_slowDownAngle);
            }

            l_requiredAngularSpeed       *= Mathf.Sign(l_requiredRotation);
            l_requiredAngularAcceleration = (l_requiredAngularSpeed - ownKS.m_angularSpeed) / info.m_timeToDesiredAngularSpeed;

            l_requiredAngularAcceleration = MathExtent.Clip(l_requiredAngularAcceleration, ownKS.m_maxAngularAcceleration, true);

            SteeringOutput result = new SteeringOutput();

            result.m_angularAcceleration = l_requiredAngularAcceleration;
            return(result);
        }
示例#6
0
        void Update()
        {
            //Get Accelerations
            SteeringOutput l_steering = GetSteering();

            //Stop if there is no acceleration
            if (l_steering == null)
            {
                m_ownKS.m_linearVelocity = Vector3.zero;
                m_ownKS.m_angularSpeed   = 0f;
                return;
            }

            float dt = Time.deltaTime;

            //Apply linear accelerations
            if (l_steering.m_linearActive)
            {
                m_ownKS.m_linearVelocity = m_ownKS.m_linearVelocity + l_steering.m_linearAcceleration * dt;
                m_ownKS.m_linearVelocity = MathExtent.Clip(m_ownKS.m_linearVelocity, m_ownKS.m_maxLinearSpeed);

                m_ownKS.m_position += m_ownKS.m_linearVelocity * dt + 0.5f * l_steering.m_linearAcceleration * dt * dt;
                transform.position  = m_ownKS.m_position;
            }
            else
            {
                m_ownKS.m_linearVelocity = Vector3.zero;
            }

            //Apply angular Accelerations
            if (l_steering.m_angularActive)
            {
                m_ownKS.m_angularSpeed = m_ownKS.m_angularSpeed + l_steering.m_angularAcceleration * dt;
                m_ownKS.m_angularSpeed = MathExtent.Clip(m_ownKS.m_angularSpeed, m_ownKS.m_maxAngularSpeed, true);

                m_ownKS.m_orientation += m_ownKS.m_angularSpeed * dt + 0.5f * l_steering.m_angularAcceleration * dt * dt;
                transform.rotation     = Quaternion.Euler(0f, m_ownKS.m_orientation, 0f);
            }
            else
            {
                m_ownKS.m_angularSpeed = 0f;
            }
        }