Beispiel #1
0
    protected Vector3 separation()
    {
        Vector3 force         = Vector3.zero;
        int     neighborCount = 0;

        for (int i = 0; i < neighbors.Length; i++)
        {
            BOIDS b = neighbors[i];
            if (b != this && distance(b.transform.position, this.transform.position) <= SEPARATION_RADIUS)
            {
                force.x += b.transform.position.x - this.transform.position.x;
                force.z += b.transform.position.z - this.transform.position.z;
                neighborCount++;
            }
        }

        if (neighborCount != 0)
        {
            force.x /= neighborCount;
            force.z /= neighborCount;
            force   *= -1;
        }

        force.Normalize();
        force *= MAX_SEPARATION;
        return(force);
    }
Beispiel #2
0
    protected Vector3 followLeader(BOIDS leader)
    {
        Vector3 tv    = new Vector3(leader.velocity.x, leader.velocity.y, leader.velocity.z);
        Vector3 force = Vector3.zero;

        tv.Normalize();
        tv    *= LEADER_BEHIND_DIST;
        ahead  = leader.transform.position + tv;
        tv    *= -1;
        behind = leader.transform.position + tv;

        if (distance(leader.transform.position, this.transform.position) <= LEADER_BEHIND_DIST)
        {
            force += (evade(leader));
            force *= 0.5f;
        }
        else
        {
            force += (arrive(behind, LEADER_BEHIND_DIST));
        }

        force += separation();

        //Vector3 Offset from leader = x * transform.Right + y * transform.Forward

        //Offset + position of leader = target position
        Debug.DrawLine(leader.transform.position, behind);
        return(force);
    }
Beispiel #3
0
    void Update()
    {
        getNeighbors();
        GetAllNeighbours();

        steering *= 0;

        if (leader)
        {
            steering = steering + arrive(Target.transform.position, 3);
            TurnToTarget(Target.transform.position);
        }
        else
        {
            if (Leader)
            {
                BOIDS l = Leader.GetComponent <BOIDS>();;
                //steering = steering + followLeader(l);
                //Formation(l);
                steering = steering + Formation(l);
                TurnToTarget(l.transform.position);
            }
        }

        Vector3.ClampMagnitude(steering, MAX_FORCE);
        steering      *= (1 / rbody.mass);
        velocity       = velocity + steering;
        rbody.velocity = velocity;
    }
Beispiel #4
0
    protected Vector3 evade(BOIDS target)
    {
        Vector3 distance      = target.transform.position - transform.position;
        float   updatesNeeded = distance.magnitude / MAX_VELOCITY;
        Vector3 tv            = new Vector3(target.velocity.x, target.velocity.y, target.velocity.z);

        tv *= updatesNeeded;
        Vector3 targetFuturePosition = new Vector3(target.transform.position.x, target.transform.position.y, target.transform.position.z);

        targetFuturePosition += tv;
        return(flee(targetFuturePosition));
    }
Beispiel #5
0
    Vector3 Formation(BOIDS leader)
    {
        int   counter = -1;
        int   zoffset = -1;
        float xoffset = 0.25f;

        Vector3 tv    = new Vector3(leader.velocity.x, leader.velocity.y, leader.velocity.z);
        Vector3 force = Vector3.zero;

        tv.Normalize();
        tv *= LEADER_BEHIND_DIST;
        Vector3 ahead = leader.transform.position + tv;

        tv *= -1;
        Vector3 behind = leader.transform.position + tv;

        Vector3 targetposition = behind;

        float perline = 2;

        float startz = targetposition.z;

        if (distance(leader.transform.position, this.transform.position) <= LEADER_BEHIND_DIST)
        {
            force += (evade(leader));
            force *= 0.5f;
        }
        else
        {
            for (int i = 0; i < neighbors.Length; i++)
            {
                counter++;
                zoffset++;

                if (zoffset > 1)
                {
                    zoffset = 1;
                }

                targetposition = new Vector3(targetposition.x, targetposition.y, targetposition.z + (zoffset * 2.0f));

                //targetposition.z = targetposition.z + (zoffset * 2.0f);

                if (counter == Mathf.Floor(perline))
                {
                    counter           = 0;
                    targetposition.z  = startz;      //-= 1 + 0.25f;
                    targetposition.x -= 1 + xoffset; //startx;
                }

                // Neighbours[i].transform.position = Vector3.MoveTowards(Neighbours[i].transform.position, targetposition, 2);
                //steering = steering + arrive(behind, 5);
                force += arrive(targetposition, LEADER_BEHIND_DIST);
            }
        }
        Debug.Log(targetposition);
        Debug.DrawLine(leader.transform.position, targetposition, Color.red);
        Debug.DrawLine(leader.transform.position, behind, Color.yellow);

        return(force);
    }
Beispiel #6
0
    Vector3 FollowLeader(BOIDS leader)
    {
        Vector3 tv    = new Vector3(leader.velocity.x, leader.velocity.y, leader.velocity.z);
        Vector3 force = Vector3.zero;

        tv.Normalize();
        tv *= LEADER_BEHIND_DIST;
        Vector3 ahead = leader.transform.position + tv;

        tv *= -1;
        Vector3 behind = leader.transform.position + tv;

        int   counter = -1;
        int   zoffset = -1;
        float xoffset = 0.25f;

        Vector3 targetposition = behind;

        float perline = 2;

        float startz = targetposition.z;

        if (distance(leader.transform.position, this.transform.position) <= LEADER_BEHIND_DIST)
        {
            force += (evade(leader));
            force *= 0.5f;
        }
        else
        {
            //force += (arrive(behind, LEADER_BEHIND_DIST));
            for (int i = 0; i < neighbors.Length; i++)
            {
                counter++;
                zoffset++;

                if (zoffset > 1)
                {
                    zoffset = 1;
                }

                //targetpositon = new Vector3(targetpositon.x + (xoffset * 2.0f), targetpositon.y, targetpositon.z);

                targetposition.z = targetposition.z + (zoffset * 2.0f);

                if (counter == Mathf.Floor(perline))
                {
                    counter           = 0;
                    targetposition.z  = startz;      //-= 1 + 0.25f;
                    targetposition.x -= 1 + xoffset; //startx;
                }

                Debug.Log(targetposition);
                force += arrive(targetposition, LEADER_BEHIND_DIST);
            }
        }

        force += separation();

        //Vector3 Offset from leader = x * transform.Right + y * transform.Forward

        //Offset + position of leader = target position
        //  Vector3.ClampMagnitude(velocity, (!leader ? MAX_VELOCITY * (0.3f + Random.Range(0.1f, 0.5f)) : MAX_VELOCITY));

        return(force);
    }