Ejemplo n.º 1
0
        public override Direccion GetDireccion()
        {
            Direccion result = new Direccion();

            UnityEngine.Vector3 direction;

            if (f.getOnTarget())
            {
                return(result);
            }

            foreach (Flocking target in FindObjectsOfType <Flocking>())
            {
                if (target != this)
                {
                    direction = -1 * (target.transform.position - transform.position);
                    float distance = direction.magnitude;

                    if (distance < threshold)
                    {
                        // strange of repulsion
                        float strength = UnityEngine.Mathf.Min(decayCoefficient / (distance * distance), maxAcceleration);

                        direction.Normalize();

                        result.lineal += strength * direction;
                    }
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        public override Direccion GetDireccion()
        {
            Direccion result = new Direccion();

            if (f.getOnTarget())
            {
                return(result);
            }

            UnityEngine.Vector3 ray = agente.velocidad;
            ray.Normalize();
            ray *= lookAhead;


            UnityEngine.RaycastHit hit;

            //COLLISION
            if (UnityEngine.Physics.Raycast(transform.position, ray, out hit))
            {
                result.lineal = hit.collider.gameObject.transform.position + hit.normal * avoidDistance;
            }
            //result.lineal.y = 0;
            return(result);
        }
Ejemplo n.º 3
0
        public override Direccion GetDireccion()
        {
            Direccion result = new Direccion();

            if (f.getOnTarget())
            {
                return(result);
            }

            Flocking firstTarget = null;

            float shortestTime       = float.MaxValue;
            float firstMinSeparation = 0;
            float firstDistance      = 0;
            float relativeSpeed;
            float timeToCollision;
            float distance;

            UnityEngine.Vector3 relativePos      = UnityEngine.Vector3.zero;
            UnityEngine.Vector3 relativeVel      = UnityEngine.Vector3.zero;
            UnityEngine.Vector3 firstRelativePos = UnityEngine.Vector3.zero;
            UnityEngine.Vector3 firstRelativeVel = UnityEngine.Vector3.zero;

            foreach (Flocking target in FindObjectsOfType <Flocking>())
            {
                if (target != this)
                {
                    // TIME TO COLLISION
                    relativePos     = (target.transform.position - transform.position);
                    relativeVel     = target.GetAgente().velocidad - agente.velocidad;
                    relativeSpeed   = relativeVel.magnitude;
                    timeToCollision = UnityEngine.Vector3.Dot(relativePos, relativeVel) / (relativeSpeed * relativeSpeed);

                    //CHECK IF COLLISION
                    distance = relativePos.magnitude;
                    float minSeparation = distance - relativeSpeed * timeToCollision;
                    if (minSeparation < 2 * radius)
                    {
                        return(result);                            // If not collision, return previous result from class Separation
                    }
                    //CHECK IF SHORTEST
                    if (timeToCollision > 0 && timeToCollision < shortestTime)
                    {
                        shortestTime       = timeToCollision;
                        firstTarget        = target;
                        firstMinSeparation = minSeparation;
                        firstDistance      = distance;
                        firstRelativePos   = relativePos;
                        firstRelativeVel   = relativeVel;
                    }
                }
            }

            //IF NO TARGET, EXIT
            if (!firstTarget)
            {
                return(result);
            }

            //IF CURRENT OR FUTURE COLLISION, STEERING
            if (firstMinSeparation <= 0 || firstDistance < 2 * radius)
            {
                relativePos = firstTarget.transform.position - transform.position;
            }
            else
            {
                relativePos = firstRelativePos + (firstRelativeVel * shortestTime);
            }

            relativePos.Normalize();

            result.lineal  = relativePos * maxAcceleration;
            result.angular = 0;


            return(result);
        }