Ejemplo n.º 1
0
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();
        int            count    = 0;

        foreach (Kinematic target in targets)
        {
            Vector3 direction = target.posicion - character.posicion;
            float   distance  = direction.magnitude;

            if (distance < threshold)
            {
                steering.vector += target.posicion;
                count++;
            }
        }

        if (count == 0)
        {
            return(steering);
        }
        steering.vector /= count;
        kinetic.posicion = steering.vector;
        target           = kinetic;
        return(base.GetSteering(character));
    }
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();
        int            count    = 0;

        foreach (Kinematic target in targets)
        {
            Vector3 direction = target.posicion - character.posicion;
            float   distance  = direction.magnitude;

            if (distance < threshold)
            {
                steering.real += target.orientacion;
                count++;
            }
        }

        if (count > 0)
        {
            steering.real  = steering.real / count;
            steering.real -= character.orientacion;
        }

        return(steering);
    }
 // Update is called once per frame
 void Update()
 {
     if (Input.GetKey(KeyCode.A))
     {
         distancePathfinding = 1;
     }
     if (Input.GetKey(KeyCode.S))
     {
         distancePathfinding = 2;
     }
     if (Input.GetKey(KeyCode.D))
     {
         distancePathfinding = 3;
     }
     if (Input.GetMouseButtonDown(0) && distancePathfinding != 0)
     {
         RaycastHit hit;
         Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         if (Physics.Raycast(ray, out hit, 1000.0f))
         {
             if (hit.transform != null && hit.transform.tag != "Muro" && hit.transform.tag != "Agua")
             {
                 listPuntos = controlador.EstablecerNodoFinal(this);
                 pintarCamino();
             }
         }
     }
     for (int i = 0; i < listSteerings.Length; i++)
     {
         SteeringOutPut str = listSteerings[i].GetSteering(this);
         setSteering(str);
     }
 }
Ejemplo n.º 4
0
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        if (listPuntos != character.listPuntos)
        {
            listPuntos = character.listPuntos;
            nodoActual = 0;
        }
        if (listPuntos.Count != 0 && nodoActual < listPuntos.Count)
        {
            puntos = new Vector3[listPuntos.Count];
            for (int i = 0; i < listPuntos.Count; i++)
            {
                puntos[i] = listPuntos[i];
            }
            pathTarget.posicion = puntos[nodoActual];
            Vector3 distance  = pathTarget.posicion - character.posicion;
            float   distancia = distance.magnitude;

            if (distancia <= radius)
            {
                nodoActual++;
            }

            if (nodoActual >= puntos.Length)
            {
                return(steering);
            }
            target = pathTarget;

            return(base.GetSteering(character));
        }
        return(steering);
    }
Ejemplo n.º 5
0
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        if (kinetic != null)
        {
            kinetic.posicion = character.posicion;
        }

        wanderOrientation += randomBinomial() * wanderRate;

        float targetOrientation = wanderOrientation + character.orientacion; //La orientación del objetivo

        kinetic.orientacion = targetOrientation;

        Vector3 target = character.posicion + wanderOffset * asVector(character.orientacion);

        target += wanderRadius * asVector(targetOrientation);

        kinetic.posicion = target;
        targetOrig       = kinetic;
        steering         = base.GetSteering(character);

        steering.vector = character.maxAceleration * asVector(targetOrientation);
        return(steering);
    }
    public void setSteering(SteeringOutPut str)
    {
        if (str.vector.magnitude > 0)
        {
            velocidadActual = velocidadActual + str.vector * Time.deltaTime;   //str.vector = aceleracion
            posicion        = posicion + velocidadActual * Time.deltaTime;
        }
        else
        {
            velocidadActual -= velocidadActual * Time.deltaTime;   //str.vector = aceleracion
            posicion         = posicion + velocidadActual * Time.deltaTime;
        }
        if (str.real > 0)
        {
            rotacionActual = rotacionActual + str.real * Time.deltaTime; //str.real = aceleracion angular
            orientacion    = orientacion + rotacionActual * Time.deltaTime;
        }
        else
        {
            rotacionActual -= rotacionActual * Time.deltaTime; //str.real = aceleracion angular
            orientacion     = orientacion + rotacionActual * Time.deltaTime;
        }
        transform.position = posicion;
        transform.rotation = Quaternion.identity;
        //ajustar con los valores que yo quiera a Unity (de lo que quiero a Unity)
        float grados = orientacion * Mathf.Rad2Deg;

        transform.Rotate(Vector3.up, grados); //rota con respecto al eje y, trabaja en grados
    }
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        steering.vector = target.posicion - character.posicion;
        steering.vector.Normalize();
        steering.vector *= character.maxAceleration;
        steering.vector  = steering.vector - character.velocidadActual;
        steering.real    = 0;
        return(steering);
    }
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering    = new SteeringOutPut();
        SteeringOutPut steeringAux = new SteeringOutPut();

        foreach (BehaviorAndWeight behavior in behaviors)
        {
            steeringAux      = behavior.behavior.GetSteering(character);
            steering.vector += steeringAux.vector * behavior.weight;
            steering.real   += steeringAux.real * behavior.weight;
        }
        return(steering);
    }
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        float distance = character.velocidadActual.magnitude;

        if (distance == 0)
        {
            SteeringOutPut steering = new SteeringOutPut();
            return(steering);
        }

        target.orientacion = Mathf.Atan2(character.velocidadActual.z, character.velocidadActual.x);
        return(base.GetSteering(character));
    }
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        steering.vector  = target.velocidadActual - character.velocidadActual;
        steering.vector /= timeToTarget;

        if (steering.vector.magnitude > character.maxAceleration)
        {
            steering.vector.Normalize();
            steering.vector *= character.maxAceleration;
        }
        steering.real = 0;
        return(steering);
    }
Ejemplo n.º 11
0
    public float epsilon; //Que sea un valor pequeño

    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        foreach (BlendedSteering group in groups)
        {
            steering = group.GetSteering(character);

            if ((steering.vector.magnitude > epsilon) || (Mathf.Abs(steering.real) > epsilon)) //Si el valor de este grupo es muy pequeño, se pasa al siguiente grupo
            {
                return(steering);
            }
        }

        return(steering); //Si se llega aqui, entonces se pasa el steering del último grupo, aunque sea el del menor valor
    }
Ejemplo n.º 12
0
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        if (targetOrig == null)
        {
            return(new SteeringOutPut());
        }
        Vector3 direction = targetOrig.posicion - character.posicion;
        float   distance  = direction.magnitude;

        if (distance == 0)
        {
            SteeringOutPut steering = new SteeringOutPut();
            return(steering);
        }
        target             = targetOrig;
        target.orientacion = Mathf.Atan2(direction.x, direction.z);
        return(base.GetSteering(character));
    }
Ejemplo n.º 13
0
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        rayVector = character.velocidadActual;
        rayVector.Normalize();
        rayVector *= lookahead;

        Collision collision = collisionDetector.getCollision(character.posicion, rayVector, lookahead);

        if (collision != null)
        {
            kinetic.posicion = collision.posicion + collision.normal * avoidDistance;
            target           = kinetic;
            return(base.GetSteering(character));
        }
        return(steering);
    }
Ejemplo n.º 14
0
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        SteeringOutPut steering = new SteeringOutPut();

        foreach (Kinematic target in targets)
        {
            Vector3 direction = character.posicion - target.posicion;
            float   distance  = direction.magnitude;
            if (distance < threshold)
            {
                float strength = Mathf.Min(decayCoefficient / (distance * distance), character.maxAceleration);

                direction.Normalize();

                steering.vector += strength * direction;
            }
        }
        return(steering);
    }
    public override SteeringOutPut GetSteering(Kinematic character)
    {
        if (target == null)
        {
            return(new SteeringOutPut());
        }
        SteeringOutPut steering  = new SteeringOutPut();
        Vector3        direction = target.posicion - character.posicion;
        float          distancia = direction.magnitude;

        if (distancia < targetRadius)
        {
            steering.vector = -character.velocidadActual;  //Sería -VelocidadActual para anular la velocidad y que se quede quieto
            return(steering);
        }
        float targetSpeed;

        if (distancia > slowRadius)
        {
            targetSpeed = character.maxSpeed;
        }
        else
        {
            targetSpeed = character.maxSpeed * distancia / slowRadius;
        }
        Vector3 targetVelocity = direction;

        targetVelocity.Normalize();
        targetVelocity *= targetSpeed;

        steering.vector = targetVelocity - character.velocidadActual;
        steering.vector = new Vector3(steering.vector.x / timeToTarget, steering.vector.y / timeToTarget, steering.vector.z / timeToTarget);

        if (steering.vector.magnitude > character.maxAceleration)
        {
            steering.vector.Normalize();
            steering.vector *= character.maxAceleration;
        }

        steering.real = 0;

        return(steering);
    }
Ejemplo n.º 16
0
    //float timeToTarget = 0.1f;

    public override SteeringOutPut GetSteering(Kinematic character)
    {
        float          targetRadiusLoc = targetRadius * Mathf.Deg2Rad;
        float          slowRadiusLoc   = slowRadius * Mathf.Deg2Rad;
        SteeringOutPut steering        = new SteeringOutPut();
        float          rotation        = target.orientacion - character.orientacion;

        rotation = mapToRange(rotation);
        rotation = rotation * Mathf.Deg2Rad;

        float rotationSize = Mathf.Abs(rotation);

        if (rotationSize < targetRadiusLoc)
        {
            steering.real = -character.rotacionActual;
            return(steering);
        }
        float targetRotation;

        if (rotationSize > slowRadiusLoc)
        {
            targetRotation = character.maxRotation;
        }
        else
        {
            targetRotation = character.maxRotation * rotationSize / slowRadiusLoc;
        }
        targetRotation *= rotation / rotationSize;

        steering.real = targetRotation - character.rotacionActual;

        float angularAcceleration = Mathf.Abs(steering.real);

        if (angularAcceleration > character.maxAcelerationAngular)
        {
            steering.real /= angularAcceleration;
            steering.real *= character.maxAcelerationAngular;
        }
        steering.vector = new Vector3(0, 0, 0);
        return(steering);
    }