Example #1
0
    public float calculateTimeToCollision(Vector3 newVelocity, List <T5Agent> agents, float goalInterval, Vector3 waypoint)
    {
        float minTimeToCollision = float.PositiveInfinity;

        for (int i = 0; i < agents.Count; i++)
        {
            T5Agent curAgent = agents [i];
            if (!string.Equals(this.id, curAgent.id) && !this.goalBeforeCollision(curAgent, waypoint))
            {
                if (!curAgent.isAtGoal(goalInterval))
                {
                    if (this.priority <= curAgent.priority)
                    {
                        float timeToCollision = this.findIntersectionPoint(newVelocity, curAgent);
                        if (timeToCollision < minTimeToCollision && timeToCollision < neighborTimeLimit)
                        {
                            minTimeToCollision = timeToCollision;
                        }
                    }
                }
                else
                {
                    float timeToCollision = this.findIntersectionPoint(newVelocity, curAgent);
                    if (timeToCollision < minTimeToCollision && timeToCollision < neighborTimeLimit)
                    {
                        minTimeToCollision = timeToCollision;
                    }
                }
            }
        }

        return(minTimeToCollision);
    }
Example #2
0
    IEnumerator Move()
    {
        bool[] atGoal = new bool[agents.Count];
        for (int i = 0; i < atGoal.Length; i++)
        {
            atGoal [i] = false;
        }
        float timeBefore = Time.time;

        while (true)
        {
            //Check if all agents at goal
            int agentsAtGoal = 0;
            for (int i = 0; i < agents.Count; i++)
            {
                if (agents[i].isAtGoal(goalInterval))
                {
                    agentsAtGoal++;
                }
            }


            if (agentsAtGoal == agents.Count)
            {
                Debug.Log("Done");
                float timeAfter = Time.time;
                Debug.Log("Time:" + (timeAfter - timeBefore));
                yield break;
            }

            //Iterate all agents
            for (int i = 0; i < agents.Count; i++)
            {
                List <Vector3> curPath            = paths[i];
                int            curAgentAtWaypoint = agentAtWaypoint[i];
                T5Agent        curAgent           = agents[i];
                Vector3        current            = curPath[curAgentAtWaypoint];

                //If the current agent is at it's goal it should not move anymore
                if (curAgent.isAtGoal(goalInterval))
                {
                    //			print (agents[i].id + " done ");
                    curAgent.velocity = Vector3.zero;
                    continue;
                }


                if (Vector3.Distance(curAgent.agent.transform.position, current) < goalInterval)
                {
                    curAgentAtWaypoint++;
                    agentAtWaypoint[i] = curAgentAtWaypoint;
                    if (curAgentAtWaypoint >= curPath.Count)
                    {
                        curAgent.velocity = Vector3.zero;
                        continue;
                    }
                    current = curPath[curAgentAtWaypoint];
                }

                bool straightToGoal = curAgent.checkStraightWayToGoal(obstacles);
                if (straightToGoal)
                {
                    current            = curAgent.goalPos;
                    curAgentAtWaypoint = curPath.Count - 1;
                    agentAtWaypoint[i] = curAgentAtWaypoint;
                }


                bool stuck = curAgent.checkStuck(obstacles, current);
                //stuck = false;
newPath:
                if (stuck)
                {
                    Vector3 pos             = curAgent.agent.transform.position;
                    Vector3 towardsWaypoint = Vector3.Normalize(current - pos);
                    Vector3 edgeOfAgent     = pos + towardsWaypoint * curAgent.agentSize;
                    this.addPointToGraph(edgeOfAgent);
                    List <PolyNode> ppath = pathFinder.AStarSearch(edgeOfAgent,
                                                                   curAgent.goalPos, graph);
                    List <Vector3> temp = new List <Vector3> ();
                    foreach (PolyNode p in ppath)
                    {
                        temp.Add(p.pos);
                    }

                    curPath            = temp;
                    paths[i]           = curPath;
                    curAgentAtWaypoint = 0;
                    agentAtWaypoint[i] = 0;
                    current            = curPath[curAgentAtWaypoint];
                    print(curAgent.id + " ASTAR");
                }

                if (curAgent.id == "Agent 1")
                {
                    blackGoal = current;
                }


                //Vector3 current=curAgent.goalPos;
                Vector3 dynPVel = curAgent.velocity;



                //The code below is used for the 2nd solution of T4

                curAgent.findMinimumPenaltyVelCar(ref agents, accMax, current, goalInterval, obstacles, maxWheelAngle
                                                  , carLength);


                Vector3 newRot = curAgent.velocity;
                //	Vector3 newVel=curAgent.getCarVelocity();
                float curVel = curAgent.velSize;


                //	print (curAgent.id + " : " + curAgent.getCarVelocity().magnitude + "\n"
                //	       + "curVel: " + curVel + " newVel " + newVel);

                bool care = false;
                bool flag = true;
                foreach (T5Agent agent in agents)
                {
                    if (curAgent != agent)
                    {
                        if (Vector3.Distance(curAgent.agent.transform.position, agent.agent.transform.position) < 33)
                        {
                            care = true;
                            break;
                        }
                    }
                }
                if (!care)
                {
                    print(curAgent.id + " I DON'T CARE !!");
                    if (curVel == 0)
                    {
                        curVel = 1;
                    }
                }
                else
                {
                    print(curAgent.id + " I CARE !!");
                }



                Vector3 curPos = curAgent.agent.transform.position;

                //	Vector3 moveTowards=curPos+newVel;
                //	float step=newVel.magnitude*Time.deltaTime;
                //Debug.Log("Step:"+step);


                float wheelAngleRad = maxWheelAngle * (Mathf.PI / 180);
                float dTheta        = (curAgent.velSize / carLength) * Mathf.Tan(wheelAngleRad);

                Quaternion newLookRot;
                if (care)
                {
                    newLookRot = Quaternion.Euler(newRot);
                }
                else
                {
                    newLookRot = Quaternion.LookRotation(current - curAgent.agent.transform.position);
                }

                if (curAgent.agent.transform.rotation != newLookRot)
                {
                    curAgent.agent.transform.rotation = Quaternion.RotateTowards(curAgent.agent.transform.rotation, newLookRot, dTheta);
                }

                curAgent.velocity = curAgent.agent.transform.rotation.eulerAngles;

                Vector3 curDir   = curAgent.agent.transform.eulerAngles;
                Vector3 newPos   = curAgent.agent.transform.position;
                float   angleRad = curDir.y * (Mathf.PI / 180);
                newPos.x = newPos.x + (curVel * Mathf.Sin(angleRad) * Time.deltaTime);
                newPos.z = newPos.z + (curVel * Mathf.Cos(angleRad) * Time.deltaTime);

                curAgent.agent.transform.position = newPos;

                yield return(null);
            }
        }
    }
Example #3
0
    IEnumerator Move()
    {
        bool[] atGoal = new bool[agents.Count];
        for (int i = 0; i < atGoal.Length; i++)
        {
            atGoal [i] = false;
        }
        float timeBefore = Time.time;

        while (true)
        {
            //Check if all agents at goal
            int agentsAtGoal = 0;
            for (int i = 0; i < agents.Count; i++)
            {
                if (agents[i].isAtGoal(goalInterval))
                {
                    agentsAtGoal++;
                }
            }
            if (agentsAtGoal == agents.Count)
            {
                Debug.Log("Done");
                float timeAfter = Time.time;
                Debug.Log("Time:" + (timeAfter - timeBefore));
                yield break;
            }
            //Iterate all agents
            for (int i = 0; i < agents.Count; i++)
            {
                List <Vector3> curPath            = paths[i];
                int            curAgentAtWaypoint = agentAtWaypoint[i];
                T5Agent        curAgent           = agents[i];
                Vector3        current            = curPath[curAgentAtWaypoint];

                //If the current agent is at it's goal it should not move anymore
                if (curAgent.isAtGoal(goalInterval))
                {
                    curAgent.velocity = Vector3.zero;
                    continue;
                }

                if (Vector3.Distance(curAgent.agent.transform.position, current) < goalInterval)
                {
                    curAgentAtWaypoint++;
                    agentAtWaypoint[i] = curAgentAtWaypoint;
                    if (curAgentAtWaypoint >= curPath.Count)
                    {
                        curAgent.velocity = Vector3.zero;
                        continue;
                    }
                    current = curPath[curAgentAtWaypoint];
                }

                bool straightToGoal = curAgent.checkStraightWayToGoal(obstacles);
                if (straightToGoal)
                {
                    current            = curAgent.goalPos;
                    curAgentAtWaypoint = curPath.Count - 1;
                    agentAtWaypoint[i] = curAgentAtWaypoint;
                }

                bool stuck = curAgent.checkStuck(obstacles, current);
                if (stuck)
                {
                    Vector3 pos             = curAgent.agent.transform.position;
                    Vector3 towardsWaypoint = Vector3.Normalize(current - pos);
                    Vector3 edgeOfAgent     = pos + towardsWaypoint * curAgent.agentSize;
                    this.addPointToGraph(edgeOfAgent);
                    List <PolyNode> ppath = pathFinder.AStarSearch(edgeOfAgent,
                                                                   curAgent.goalPos, graph);
                    List <Vector3> temp = new List <Vector3> ();
                    foreach (PolyNode p in ppath)
                    {
                        temp.Add(p.pos);
                    }

                    curPath            = temp;
                    paths[i]           = curPath;
                    curAgentAtWaypoint = 0;
                    agentAtWaypoint[i] = 0;
                    current            = curPath[curAgentAtWaypoint];
                }

                //Vector3 current=curAgent.goalPos;
                Vector3 dynPVel = curAgent.velocity;



                //The code below is used for the 2nd solution of T4

                Vector3 newVel = curAgent.findMinimumPenaltyVel(agents, accMax, current, goalInterval, obstacles);

                //Update the velocity vector
                curAgent.velocity = newVel;

                Vector3 curPos = curAgent.agent.transform.position;

                Vector3 moveTowards = curPos + newVel;
                float   step        = newVel.magnitude * Time.deltaTime;
                //Debug.Log("Step:"+step);
                curAgent.agent.transform.position = Vector3.MoveTowards(curPos, moveTowards, step);
                //curAgent.agent.transform.position = curAgent.agent.transform.position + newVel*Time.deltaTime;


                yield return(null);
            }
        }
    }