示例#1
0
        public override void setupScenario()
        {
            // dépassement
            RVO.Vector2 position = new RVO.Vector2(5, 5f);
            // face à face
            //RVO.Vector2 position = new RVO.Vector2(25, 5f);
            sim_.addAgent(position, 0, false, false, 1f, 10, 2f, 2f, 0.35f, 1f, new RVO.Vector2(0, 0));
            // dépassement
            sim_.setAgentGoal(0, new RVO.Vector2(corridor_lenght * 1.5f, 5));
            // face à face
            //sim_.setAgentGoal(0, new RVO.Vector2(0,5));

            position = new RVO.Vector2(0, 5.1f);
            sim_.addAgent(position, 0, true, false, 1f, 10, 2f, 2f, 0.35f, 4f, new RVO.Vector2(0, 0));
            sim_.setAgentGoal(1, new RVO.Vector2(corridor_lenght * 1.5f, 5.1f));


            colors.Add(new Color(0.000f, 0.000f, 0.804f));
            colors.Add(new Color(0.118f, 0.565f, 1.000f));
            colors.Add(new Color(0.251f, 0.878f, 0.816f));
            colors.Add(new Color(0.400f, 0.804f, 0.667f));
            colors.Add(new Color(0.604f, 0.804f, 0.196f));
            colors.Add(new Color(0.804f, 0.804f, 0.196f));
            colors.Add(new Color(0.804f, 0.804f, 0.096f));
            colors.Add(new Color(0.94f, 0.804f, 0.10f));
        }
示例#2
0
        /** Used to set the velocity of all Agents considering their velocity and goal **/
        public void setPreferredVelocities()
        {
            /*
             * Set the preferred velocity to be a vector of unit magnitude
             * (speed) in the direction of the goal.
             */
            for (int i = 0; i < sim_.getNumAgents(); ++i)
            {
                RVO.Vector2 goalVector = sim_.getAgentGoal(i) - sim_.getAgentPosition(i);

                if (RVO.Vector2.absSq(goalVector) > 1.0f)
                {
                    goalVector = RVO.Vector2.normalize(goalVector);
                }

                sim_.setAgentPrefVelocity(i, goalVector);

                /* Perturb a little to avoid deadlocks due to perfect symmetry. */
                float angle = (float)random.NextDouble() * 2.0f * (float)Math.PI;
                float dist  = (float)random.NextDouble() * 0.0001f;

                sim_.setAgentPrefVelocity(i, sim_.getAgentPrefVelocity(i) +
                                          dist * new RVO.Vector2((float)Math.Cos(angle), (float)Math.Sin(angle)));
            }
        }
示例#3
0
        public void LoadMap()
        {
            m_mapMgr.Init(100, 100);

            m_pathFinder.Init(1000, m_mapMgr);

            // todo 初始化grid地图碰撞
            m_agendIdGenerator += 1;
            UnityEngine.GameObject obstacleGo     = UnityEngine.GameObject.Find("Obstacle");
            UnityEngine.GameObject obstaclePrefab = UnityEngine.Resources.Load("Barrier") as UnityEngine.GameObject;
            Vector2i        centerI          = new Vector2i((int)obstacleGo.transform.position.x, (int)obstacleGo.transform.position.z);
            int             lengh            = (int)obstacleGo.transform.localScale.x;
            int             width            = (int)obstacleGo.transform.localScale.z;
            List <Vector2i> obstacleGridList = new List <Vector2i>();

            for (int i = -lengh / 2; i < lengh / 2; ++i)
            {
                for (int j = -width / 2; j < width / 2; ++j)
                {
                    Vector2i iter = centerI + new Vector2i(i, j);
                    UnityEngine.GameObject.Instantiate(obstaclePrefab, new UnityEngine.Vector3(iter.m_x, -1, iter.m_y), UnityEngine.Quaternion.identity);
                    obstacleGridList.Add(iter);
                }
            }
            m_mapMgr.RegisetrPosList(obstacleGridList, m_agendIdGenerator);
            // todo 初始化rvo地图碰撞
            // 格子寻路都为整数格,所以沟边尽量以整数中心计算占用格子数
            RVO.Vector2        center       = new RVO.Vector2(obstacleGo.transform.position.x, obstacleGo.transform.position.z);
            RVO.Vector2        scale        = new RVO.Vector2(obstacleGo.transform.localScale.x, obstacleGo.transform.localScale.z);
            RVO.Vector2        point1       = center + new RVO.Vector2(-scale.x_ / 2, +scale.y_ / 2);
            RVO.Vector2        point2       = center + new RVO.Vector2(+scale.x_ / 2, +scale.y_ / 2);
            RVO.Vector2        point3       = center + new RVO.Vector2(+scale.x_ / 2, -scale.y_ / 2);
            RVO.Vector2        point4       = center + new RVO.Vector2(-scale.x_ / 2, -scale.y_ / 2);
            List <RVO.Vector2> obstacleList = new List <RVO.Vector2>();

            obstacleList.Add(point1);
            obstacleList.Add(point2);
            obstacleList.Add(point3);
            obstacleList.Add(point4);
            RVO.Simulator.Instance.addObstacle(obstacleList);

            RVO.Simulator.Instance.processObstacles();
        }
示例#4
0
 private void setVelocity(int i, RVO.Vector2 vector2)
 {
     sim_.agents_[i].velocity_ = vector2;
 }
示例#5
0
        // Update is called once per frame
        void Update()
        {
            for (int block = 0; block < workers.Count; ++block)
            {
                doneEvents_[block].Reset();
                ThreadPool.QueueUserWorkItem(workers[block].clear);
            }

            WaitHandle.WaitAll(doneEvents_);
            updateWorker(workers.Count);
            if (!reachedGoal())
            {
                if (hum_but_.isOn && !human_prefab)
                {
                    int range = agents.Count;
                    for (int i = 0; i < range; i++)
                    {
                        Destroy(agents[i].gameObject);
                        addAgent(human, agents[i].position, sim_.getDefaultRadius(), i);
                    }
                    human_prefab = true;
                }
                else if (!hum_but_.isOn && human_prefab)
                {
                    int range = agents.Count;
                    for (int i = 0; i < range; i++)
                    {
                        Destroy(agents[i].gameObject);
                        addAgent(prefab, agents[i].position, sim_.getDefaultRadius(), i);
                    }
                    human_prefab = false;
                }
                setAgentsProperties();
                setPreferredVelocities();

                sim_.initialize_virtual_and_agents();
                for (int i = 0; i < getNumAgents(); i++)
                {
                    Vector2 agent_position = sim_.getAgentPosition(i);
                    Vector2 p1             = agent_position + new Vector2(corridor_length_, 0);
                    sim_.addVirtualAgent(0, p1);
                }
                doStep(true);

                /* Output the current global time. */
                //print(Simulator.Instance.getGlobalTime());

                if (follow_but_.isOn != follow_)
                {
                    follow_ = follow_but_.isOn;

                    for (int i = 0; i < getNumAgents(); ++i)
                    {
                        sim_.agents_[i].follows_ = follow_;
                    }
                }
                if (save_but_.isOn != sim_.save)
                {
                    sim_.save = save_but_.isOn;
                }

                Vector3 pos3 = Camera.main.transform.position;
                Camera.main.transform.position = new Vector3(pos3.x, camera_height_.value, pos3.z);

                int totot = getNumAgents();
                for (int i = 0; i < getNumAgents(); ++i)
                {
                    Vector2 position = sim_.getAgentPosition(i);
                    agents[i].transform.position = new Vector3(position.x(), 0f, position.y());
                    RVO.Vector2 vector2 = sim_.getAgentVelocity(i);
                    agents[i].rotation = Quaternion.LookRotation(new Vector3(vector2.x_, 0, vector2.y_));
                    if (human_prefab)
                    {
                        if (Vector2.absSq(sim_.getAgentVelocity(i) * 4) > 1.5f)
                        {
                            agents[i].GetComponent <Animator>().CrossFade("mixamo.com", 10, 1);
                        }

                        agents[i].GetComponent <Animator>().speed = Vector2.absSq(sim_.getAgentVelocity(i) * 4);
                    }
                    if (!human_prefab)
                    {
                        setColor(i);
                    }
                }
            }
            else
            {
                for (int i = 0; i < getNumAgents(); ++i)
                {
                    agents[i].transform.GetComponent <Rigidbody>().isKinematic = true;
                }
            }

            for (int block = 0; block < workers.Count; ++block)
            {
                doneEvents_[block].Reset();
                ThreadPool.QueueUserWorkItem(workers[block].computeMedVelocity);
            }

            WaitHandle.WaitAll(doneEvents_);

            String tmp = "";

            for (int i = 0; i < workers.Count; i++)
            {
                tmp += Vector2.abs(workers[i].vit_moy) + "\t";
            }
            using (TextWriter tw = new StreamWriter(name, true))
            {
                tw.WriteLine(tmp);
            }
        }
示例#6
0
 /** Change the position of the agent[i] in the simulation - Used to create corridor like scenario **/
 internal void setPosition(int i, RVO.Vector2 vector2)
 {
     sim_.agents_[i].position_ = vector2;
 }