SlideShare una empresa de Scribd logo
1 de 49
게임 인공지능
                                                    GameAI




                  실질적인 길 계획하기
                  By Changhoon Park
                  http://wawworld.me
                                       Last Update : 2011. 08. 28

11년 10월 13일 목요일
2

                  실질적인     NavGraph 구축       가시점
                  길 계획하기   Raven의 NavGraph   확장 지형
                           경로 계획자 클래스        NavMesh
                           노드경로/에지경로
                           난처한 상황                      By Changhoon Park
                                                             http://wawworld.me

11년 10월 13일 목요일
3

                  실질적인     NavGraph 구축       가시점
                  길 계획하기   Raven의 NavGraph   확장 지형
                           경로 계획자 클래스        NavMesh
                           노드경로/에지경로
                           난처한 상황                      By Changhoon Park
                                                             http://wawworld.me

11년 10월 13일 목요일
4

                  실질적인     NavGraph 구축       가시점
                  길 계획하기   Raven의 NavGraph   확장 지형
                           경로 계획자 클래스        NavMesh
                           노드경로/에지경로
                           난처한 상황                      By Changhoon Park
                                                             http://wawworld.me

11년 10월 13일 목요일
5

                  실질적인     NavGraph 구축       성긴 그래프
                  길 계획하기   Raven의 NavGraph   밀집 그래프
                           경로 계획자 클래스        아이템 추가
                           노드경로/에지경로         공간 분할
                           난처한 상황                     By Changhoon Park
                                                            http://wawworld.me

11년 10월 13일 목요일
6

                  실질적인     NavGraph 구축       성긴 그래프
                  길 계획하기   Raven의 NavGraph   밀집 그래프
                           경로 계획자 클래스        아이템 추가
                           노드경로/에지경로         공간 분할
                           난처한 상황                     By Changhoon Park
                                                            http://wawworld.me

11년 10월 13일 목요일
7

                  실질적인     NavGraph 구축       성긴 그래프
                  길 계획하기   Raven의 NavGraph   밀집 그래프
                           경로 계획자 클래스        아이템 추가
                           노드경로/에지경로         공간 분할
                           난처한 상황                     By Changhoon Park
                                                            http://wawworld.me

11년 10월 13일 목요일
8

                  실질적인     NavGraph 구축       성긴 그래프
                  길 계획하기   Raven의 NavGraph   밀집 그래프
                           경로 계획자 클래스        아이템 추가
                           노드경로/에지경로         공간 분할
                           난처한 상황                     By Changhoon Park
                                                            http://wawworld.me

11년 10월 13일 목요일
template <class extra_info = void*>
          class NavGraphNode : public GraphNode
          {
          protected:
             Vector2D m_vPosition;
             extra_info m_ExtraInfo;
          public:
             //ctors
             NavGraphNode():m_ExtraInfo(extra_info()){}
             NavGraphNode(int idx,Vector2D pos):GraphNode(idx),
                                                 m_vPosition(pos), m_ExtraInfo(extra_info()) {}
             virtual ~NavGraphNode(){}
             Vector2D Pos()const;
             void SetPos(Vector2D NewPosition);
             extra_info ExtraInfo()const;
             void SetExtraInfo(extra_info info);
          };




             9

                  실질적인        NavGraph 구축       성긴 그래프
                  길 계획하기      Raven의 NavGraph   밀집 그래프
                              경로 계획자 클래스        아이템 추가
                              노드경로/에지경로         공간 분할
                              난처한 상황                                                         By Changhoon Park
                                                                                                   http://wawworld.me

11년 10월 13일 목요일
class Raven_PathPlanner
             {
             private:
                  enum {no_closest_node_found = -1};
             private:
                  Raven_Bot* m_pOwner;
                  const Raven_Map::NavGraph& m_NavGraph;
                  Vector2D m_vDestinationPos;
                  int GetClosestNodeToPosition(Vector2D pos)const;
             public:
                  Raven_PathPlanner(Raven_Bot* owner);
                  bool CreatePathToPosition(Vector2D TargetPos, std::list<Vector2D>& path);
                  bool CreatePathToItem(unsigned int ItemType, std::list<Vector2D>& path);
             };




            10

                  실질적인      NavGraph 구축       특정 위치까지의 경로
                  길 계획하기    Raven의 NavGraph   어떤 아이템 타입까지의 경로
                            경로 계획차 클래스
                            노드경로/에지경로
                            난처한 상황                                                   By Changhoon Park
                                                                                              http://wawworld.me

11년 10월 13일 목요일
11

                  실질적인     NavGraph 구축       특정 위치까지의 경로
                  길 계획하기   Raven의 NavGraph   어떤 아이템 타입까지의 경로
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황                              By Changhoon Park
                                                                     http://wawworld.me

11년 10월 13일 목요일
bool Raven_PathPlanner::CreatePathToPosition(Vector2D TargetPos,std::list<Vector2D>& path)
         {
           m_vDestinationPos = TargetPos;

             if (!m_pOwner()->GetWorld()->isPathObstructed(m_pOwner->Pos(), TargetPos,
                                                         m_pOwner->BRadius()))
             {
                   path.push_back(TargetPos);
                   return true;
             }

             int ClosestNodeToBot = GetClosestNodeToPosition(m_pOwner->Pos());
             if (ClosestNodeToBot == no_closest_node_found) {
                   return false;
             }




            12

                  실질적인       NavGraph 구축       특정 위치까지의 경로
                  길 계획하기     Raven의 NavGraph   어떤 아이템 타입까지의 경로
                             경로 계획자 클래스
                             노드경로/에지경로
                             난처한 상황                                                      By Changhoon Park
                                                                                                http://wawworld.me

11년 10월 13일 목요일
int ClosestNodeToTarget = GetClosestNodeToPosition(TargetPos);
             if (ClosestNodeToTarget == no_closest_node_found)
             {
                   return false;
             }

             typedef Graph_SearchAStar< Raven_Map::NavGraph, Heuristic_Euclid> AStar;
              AStar search(m_NavGraph, ClosestNodeToBot, ClosestNodeToTarget);
              std::list<int> PathOfNodeIndices = search.GetPathToTarget();
              if (!PathOfNodeIndices.empty()) {
                    ConvertIndicesToVectors(PathOfNodeIndices, path);
                    path.push_back(TargetPos);
                    return true;
              } else {
                    return false;
              }
         }




             13

                   실질적인       NavGraph 구축       특정 위치까지의 경로
                   길 계획하기     Raven의 NavGraph   어떤 아이템 타입까지의 경로
                              경로 계획자 클래스
                              노드경로/에지경로
                              난처한 상황                                                    By Changhoon Park
                                                                                              http://wawworld.me

11년 10월 13일 목요일
14

                  실질적인     NavGraph 구축       특정 위치까지의 경로
                  길 계획하기   Raven의 NavGraph   어떤 아이템 타입까지의 경로
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황                              By Changhoon Park
                                                                     http://wawworld.me

11년 10월 13일 목요일
template <class graph_type, class termination_condition>
         class Graph_SearchDijkstra
         {
             /* OMITTED */
         };
         ========================================================================
         static bool isSatisfied(const graph_type& G, int target, int CurrentNodeIdx);
         ========================================================================
         if (NextClosestNode == m_iTarget) return; //if the target has been found exit
         ========================================================================

         //if the target has been found exit
         if (termination_condition::isSatisfied(m_Graph, m_iTarget, NextClosestNode))
         {
              m_iTarget = NextClosestNode;
              return;
         }




            15

                  실질적인       NavGraph 구축       특정 위치까지의 경로
                  길 계획하기     Raven의 NavGraph   어떤 아이템 타입까지의 경로
                             경로 계획자 클래스
                             노드경로/에지경로
                             난처한 상황                                                     By Changhoon Park
                                                                                              http://wawworld.me

11년 10월 13일 목요일
template <class trigger_type>
         class FindActiveTrigger
         {
         public:
            template <class graph_type>
            static bool isSatisfied(const graph_type& G, int target, int CurrentNodeIdx)
            {
                  bool bSatisfied = false;
                  const graph_type::NodeType& node = G.GetNode(CurrentNodeIdx);
                  if ((node.ExtraInfo() != NULL) && node.ExtraInfo()->isActive() &&
                      (node.ExtraInfo()->EntityType() == target) )
                  {
                        bSatisfied = true;
                  }
                  return bSatisfied;
            }
         };




            16

                  실질적인        NavGraph 구축        특정 위치까지의 경로
                  길 계획하기      Raven의 NavGraph    어떤 아이템 타입까지의 경로
                              경로 계획자 클래스
                              노드경로/에지경로
                              난처한 상황                                                       By Changhoon Park
                                                                                                 http://wawworld.me

11년 10월 13일 목요일
typedef FindActiveTrigger<Trigger<Raven_Bot> > term_con;
         typedef Graph_SearchDijkstra_TS<RavenMap::NavGraph, term_con> SearchDij;

         //instantiate the search
         SearchDij dij( G,                 // the graph
                          6,               // the source node
                          type_health);    // the item type we are searching for
         //grab the path
         std::list<int> path = dij.GetPathToTarget();




            17

                  실질적인      NavGraph 구축       특정 위치까지의 경로
                  길 계획하기    Raven의 NavGraph   어떤 아이템 타입까지의 경로
                            경로 계획자 클래스
                            노드경로/에지경로
                            난처한 상황                                                 By Changhoon Park
                                                                                         http://wawworld.me

11년 10월 13일 목요일
18

                  실질적인     NavGraph 구축
                  길 계획하기   Raven의 NavGraph
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황            By Changhoon Park
                                                   http://wawworld.me

11년 10월 13일 목요일
class NavGraphEdge : public GraphEdge
         {
         public:
            //enumerate some behavior flags
            enum BehaviorType
            {
                 normal    = 1 << 0,
                 tippy_toe = 1 << 1,
                 swim      = 1 << 2,
                 crawl     = 1 << 3,
                 creep     = 1 << 4
            };
         protected:
            BehaviorType m_iBehavior; //the behavior associated with traversing this edge

              /* EXTRANEOUS DETAIL OMITTED */
         };



              19

                   실질적인     NavGraph 구축       주석이 달린 에지
                   길 계획하기   Raven의 NavGraph   경로 계획자 수정
                            경로 계획자 클래스        경로 부드럽게 하기
                            노드경로/에지경로         CPU오버헤드 줄이기
                            난처한 상황                                                By Changhoon Park
                                                                                        http://wawworld.me

11년 10월 13일 목요일
class PathEdge
         {
         private:
             //positions of the source and destination nodes this edge connects
             Vector2D m_vSource;
             Vector2D m_vDestination;
             int m_iBehavior; //the behavior associated with traversing this edge
         public:
             PathEdge(Vector2D Source, Vector2D Destination, int Behavior)
                       : m_vSource(Source), m_vDestination(Destination), m_iBehavior(Behavior) {}
             Vector2D Destination()const;
             void SetDestination(Vector2D NewDest);
             Vector2D Source()const;
             void SetSource(Vector2D NewSource);
             int Behavior()const;
         };




            20

                  실질적인       NavGraph 구축        주석이 달린 에지
                  길 계획하기     Raven의 NavGraph    경로 계획자 수정
                             경로 계획자 클래스         경로 부드럽게 하기
                             노드경로/에지경로          CPU오버헤드 줄이기
                             난처한 상황                                                          By Changhoon Park
                                                                                                    http://wawworld.me

11년 10월 13일 목요일
bool Raven_PathPlanner::CreatePathToPosition(Vector2D TargetPos, std::list<PathEdge>& path)
         {

             if (!m_pOwner()->GetWorld()->isPathObstructed(m_pOwner->Pos(), TargetPos, m_pOwner->BRadius())) {
                    path.push_back(PathEdge(m_pOwner->Pos(), TargetPos, NavGraphEdge::normal));
                    return true;
             }

             int ClosestNodeToBot = GetClosestNodeToPosition(m_pOwner->Pos());
             if (ClosestNodeToBot == no_closest_node_found) {
                    //no path possible
                    return false;
             }

            int ClosestNodeToTarget = GetClosestNodeToPosition(TargetPos);
             if (ClosestNodeToTarget == no_closest_node_found) {
                    //no path possible
                    return false;
             }




            21

                   실질적인         NavGraph 구축         주석이 달린 에지
                   길 계획하기       Raven의 NavGraph     경로 계획자 수정
                                경로 계획자 클래스          경로 부드럽게 하기
                                노드경로/에지경로           CPU오버헤드 줄이기
                                난처한 상황                                                                 By Changhoon Park
                                                                                                             http://wawworld.me

11년 10월 13일 목요일
//create an instance of the A* search class.
             typedef Graph_SearchAStar<Raven_Map::NavGraph, Heuristic_Euclid> AStar;
             AStar search(m_NavGraph, ClosestNodeToBot, ClosestNodeToTarget);
             path = search.GetPathAsPathEdges(); //grab the path as a list of PathEdges

             if (!path.empty()) {
                    path.push_front( PathEdge(m_pOwner->Pos(),
                                                path.front().GetSource(), NavGraphEdge::normal));
                    path.push_back(PathEdge(path.back().GetDestination(),
                                               TargetPos, NavGraphEdge::normal));
                    return true;
             } else {
                    return false; //no path found by the search
             }
         }




             22

                   실질적인         NavGraph 구축         주석이 달린 에지
                   길 계획하기       Raven의 NavGraph     경로 계획자 수정
                                경로 계획자 클래스          경로 부드럽게 하기
                                노드경로/에지경로           CPU오버헤드 줄이기
                                난처한 상황                                                              By Changhoon Park
                                                                                                          http://wawworld.me

11년 10월 13일 목요일
if (Bot.PathPlanner.CreatePathToPosition(destination, path))
         {
             PathEdge next = GetNextEdgeFromPath(path)
             switch(next.Behavior)
             {
                  case behavior_stealth:
                      set stealth mode
                      break
                  case behavior_swim
                      set swim mode
                      break
                      etc
             }
             Bot.MoveTo(NavGraph.GetNodePosition(next.To))
         }




            23

                  실질적인        NavGraph 구축       주석이 달린 에지
                  길 계획하기      Raven의 NavGraph   경로 계획자 수정
                              경로 계획자 클래스        경로 부드럽게 하기
                              노드경로/에지경로         CPU오버헤드 줄이기
                              난처한 상황                                    By Changhoon Park
                                                                              http://wawworld.me

11년 10월 13일 목요일
24

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
25

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
26

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
27

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
void Raven_PathPlanner::SmoothPathEdgesQuick(std::list<PathEdge>& path)
         {
            //create a couple of iterators and point them at the front of the path
            std::list<PathEdge>::iterator e1(path.begin()), e2(path.begin());
            ++e2; //increment e2 so it points to the edge following e1.
            while (e2 != path.end())
            {
                  //check for obstruction, adjust and remove the edges accordingly
                  if ( m_pOwner->canWalkBetween(e1->Source(), e2->Destination()) ) {
                       e1->SetDestination(e2->Destination());
                       e2 = path.erase(e2);
                  } else {
                       e1 = e2;
                       ++e2;
                  }
            }
         }




            28

                  실질적인       NavGraph 구축       주석이 달린 에지
                  길 계획하기     Raven의 NavGraph   경로 계획자 수정
                             경로 계획자 클래스        경로 부드럽게 하기
                             노드경로/에지경로         CPU오버헤드 줄이기
                             난처한 상황                                                    By Changhoon Park
                                                                                             http://wawworld.me

11년 10월 13일 목요일
29

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
void Raven_PathPlanner::SmoothPathEdgesPrecise(std::list<PathEdge>& path)
         {
            std::list<PathEdge>::iterator e1, e2;
            e1 = path.begin();
            while (e1 != path.end()) {
                   e2 = e1;
                   ++e2;
                   while (e2 != path.end()) {
                       if ( m_pOwner->canWalkBetween(e1->Source(), e2->Destination()) ) {
                             e1->SetDestination(e2->Destination());
                             e2 = path.erase(++e1, ++e2);
                             e1 = e2;
                             --e1;
                       } else {
                             ++e2;
                       }
                   }
                   ++e1;
            }
         }




            30

                  실질적인         NavGraph 구축         주석이 달린 에지
                  길 계획하기       Raven의 NavGraph     경로 계획자 수정
                               경로 계획자 클래스          경로 부드럽게 하기
                               노드경로/에지경로           CPU오버헤드 줄이기
                               난처한 상황                                                       By Changhoon Park
                                                                                                  http://wawworld.me

11년 10월 13일 목요일
31

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
template <class graph_type>
         std::vector<std::vector<int> > CreateAllPairsTable(const graph_type& G)
         {
            enum {no_path = -1};
            std::vector<int> row(G.NumNodes(), no_path);
            std::vector<std::vector<int> > shortest_paths(G.NumNodes(), row);

             for (int source=0; source<G.NumNodes(); ++source)
             {
                   Graph_SearchDijkstra<graph_type> search(G, source);
                   std::vector<const GraphEdge*> spt = search.GetSPT();




            32

                  실질적인       NavGraph 구축       주석이 달린 에지
                  길 계획하기     Raven의 NavGraph   경로 계획자 수정
                             경로 계획자 클래스        경로 부드럽게 하기
                             노드경로/에지경로         CPU오버헤드 줄이기
                             난처한 상황                                                By Changhoon Park
                                                                                         http://wawworld.me

11년 10월 13일 목요일
for (int target = 0; target<G.NumNodes(); ++target)
                  {
                        if (source == target) {
                              shortest_paths[source][target] = target;
                        } else {
                          int nd = target;
                          while ((nd != source) && (spt[nd] != 0))
                          {
                               shortest_paths[spt[nd]->From][target]= nd;
                               nd = spt[nd]->From;
                          }
                       }
                  } //next target node
             } //next source node
             return shortest_paths;
         }




             33

                   실질적인         NavGraph 구축         주석이 달린 에지
                   길 계획하기       Raven의 NavGraph     경로 계획자 수정
                                경로 계획자 클래스          경로 부드럽게 하기
                                노드경로/에지경로           CPU오버헤드 줄이기
                                난처한 상황                                      By Changhoon Park
                                                                                  http://wawworld.me

11년 10월 13일 목요일
34

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
template <class graph_type>
         std::vector<std::vector<double> > CreateAllPairsCostsTable(const graph_type& G)
         {
            std::vector<double> row(G.NumNodes(), 0.0);
            std::vector<std::vector<double> > PathCosts(G.NumNodes(), row);
            for (int source=0; source<G.NumNodes(); ++source)
            {
                  Graph_SearchDijkstra<graph_type> search(G, source);
                  for (int target = 0; target<G.NumNodes(); ++target)
                  {
                       if (source != target) {
                            PathCosts[source][target]= search.GetCostToNode(target);
                       }
                  }//next target node
            }//next source node
            return PathCosts;
         }




            35

                  실질적인       NavGraph 구축       주석이 달린 에지
                  길 계획하기     Raven의 NavGraph   경로 계획자 수정
                             경로 계획자 클래스        경로 부드럽게 하기
                             노드경로/에지경로         CPU오버헤드 줄이기
                             난처한 상황                                                        By Changhoon Park
                                                                                                 http://wawworld.me

11년 10월 13일 목요일
36

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
template <class graph_type, class heuristic>
         int Graph_SearchAStar_TS<graph_type, heuristic>::CycleOnce()
         {
             if (m_pPQ->empty()) {
                   return target_not_found;
             }
             int NextClosestNode = m_pPQ->Pop();
             m_ShortestPathTree[NextClosestNode] = m_SearchFrontier[NextClosestNode];
             if (NextClosestNode == m_iTarget) {
                   return target_found;
             }
             Graph::ConstEdgeIterator EdgeItr(m_Graph, NextClosestNode);
             for (const GraphEdge* pE=EdgeItr.beg(); !EdgeItr.end(); pE=EdgeItr.nxt() {
                   /* SAME AS IN PREVIOUS A* ALGORITHM */
             }
             return search_incomplete;
         }




            37

                  실질적인       NavGraph 구축       주석이 달린 에지
                  길 계획하기     Raven의 NavGraph   경로 계획자 수정
                             경로 계획자 클래스        경로 부드럽게 하기
                             노드경로/에지경로         CPU오버헤드 줄이기
                             난처한 상황                                                       By Changhoon Park
                                                                                                http://wawworld.me

11년 10월 13일 목요일
template <class edge_type>
         class Graph_SearchTimeSliced
         {
         public:
            enum SearchType{AStar, Dijkstra};
         private:
            SearchType m_SearchType;
         public:
            Graph_SearchTimeSliced(SearchType type):m_SearchType(type){}
            virtual ~Graph_SearchTimeSliced(){}
            virtual int CycleOnce()=0;
            virtual std::vector<const edge_type*> GetSPT()const=0;
            virtual double GetCostToTarget()const=0;
            virtual std::list<PathEdge> GetPathAsPathEdges()const=0;
            SearchType GetType()const{return m_SearchType;}
         };




            38

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                                          By Changhoon Park
                                                                                 http://wawworld.me

11년 10월 13일 목요일
class Raven_PathPlanner
         {
         private:
            Graph_SearchTimeSliced* m_pCurrentSearch;
            /* EXTRANEOUS DETAIL OMITTED */
         public:
            bool RequestPathToItem(unsigned int ItemType);
            bool RequestPathToTarget(Vector2D TargetPos);
            int CycleOnce()const;
            Path GetPath();
         };




            39

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                            By Changhoon Park
                                                                   http://wawworld.me

11년 10월 13일 목요일
int Raven_PathPlanner::CycleOnce()const
         {
             assert (m_pCurrentSearch &&
                        "<Raven_PathPlanner::CycleOnce>: No search object instantiated");
             int result = m_pCurrentSearch->CycleOnce();
             if (result == target_not_found) {
                   Dispatcher->DispatchMsg(SEND_MSG_IMMEDIATELY,
                                             SENDER_ID_IRRELEVANT, m_pOwner->ID(),
                                             Msg_NoPathAvailable, NO_ADDITIONAL_INFO);
             } else if (result == target_found) {
                   void* pTrigger =
                   m_NavGraph.GetNode(m_pCurrentSearch->GetPathToTarget().back()).ExtraInfo();
                   Dispatcher->DispatchMsg(SEND_MSG_IMMEDIATELY,
                                             SENDER_ID_IRRELEVANT, m_pOwner->ID(),
                                             Msg_PathReady, pTrigger);
             }
             return result;
         }




            40

                  실질적인      NavGraph 구축       주석이 달린 에지
                  길 계획하기    Raven의 NavGraph   경로 계획자 수정
                            경로 계획자 클래스        경로 부드럽게 하기
                            노드경로/에지경로         CPU오버헤드 줄이기
                            난처한 상황                                                       By Changhoon Park
                                                                                                 http://wawworld.me

11년 10월 13일 목요일
template <class path_planner>
         class PathManager
         {
         private:
            std::list<path_planner*> m_SearchRequests;
            unsigned int m_iNumSearchCyclesPerUpdate;
         public:
            PathManager(unsigned int NumCyclesPerUpdate);
            void UpdateSearches();
            void Register(path_planner* pPathPlanner);
            void UnRegister(path_planner* pPathPlanner);
         };




            41

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                           By Changhoon Park
                                                                  http://wawworld.me

11년 10월 13일 목요일
template <class path_planner>
         inline void PathManager<path_planner>::UpdateSearches()
         {
             int NumCyclesRemaining = m_iNumSearchCyclesPerUpdate;
             std::list<path_planner*>::iterator curPath = m_SearchRequests.begin();
             while (NumCyclesRemaining-- && !m_SearchRequests.empty())
             {
                   int result = (*curPath)->CycleOnce();
                   if ( (result == target_found) || (result == target_not_found) ) {
                         curPath = m_SearchRequests.erase(curPath);
                   }
                   else {
                         ++curPath;
                   }
                   if (curPath == m_SearchRequests.end()) {
                         curPath = m_SearchRequests.begin();
                   }
             }//end while
         }




            42

                  실질적인        NavGraph 구축        주석이 달린 에지
                  길 계획하기      Raven의 NavGraph    경로 계획자 수정
                              경로 계획자 클래스         경로 부드럽게 하기
                              노드경로/에지경로          CPU오버헤드 줄이기
                              난처한 상황                                                   By Changhoon Park
                                                                                             http://wawworld.me

11년 10월 13일 목요일
bool Raven_PathPlanner:: RequestPathToItem(unsigned int ItemType)
         {
           GetReadyForNewSearch();
           int ClosestNodeToBot = GetClosestNodeToPosition(m_pOwner->Pos());
           if (ClosestNodeToBot == no_closest_node_found) {
                 return false;
           }

             typedef FindActiveTrigger<Trigger<Raven_Bot> > term_con;
             typedef Graph_SearchDijkstra_TS<Raven_Map::NavGraph, term_con> DijSearch;
             m_pCurrentSearch = new DijSearch(m_pWorld->GetNavigationGraph(),
                                            ClosestNodeToBot, ItemType);
             m_pWorld->GetPathManager()->Register(this);
             return true;
         }




             43

                  실질적인      NavGraph 구축       주석이 달린 에지
                  길 계획하기    Raven의 NavGraph   경로 계획자 수정
                            경로 계획자 클래스        경로 부드럽게 하기
                            노드경로/에지경로         CPU오버헤드 줄이기
                            난처한 상황                                                 By Changhoon Park
                                                                                         http://wawworld.me

11년 10월 13일 목요일
44

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
45

                  실질적인     NavGraph 구축       주석이 달린 에지
                  길 계획하기   Raven의 NavGraph   경로 계획자 수정
                           경로 계획자 클래스        경로 부드럽게 하기
                           노드경로/에지경로         CPU오버헤드 줄이기
                           난처한 상황                          By Changhoon Park
                                                                 http://wawworld.me

11년 10월 13일 목요일
46

                  실질적인     NavGraph 구축
                  길 계획하기   Raven의 NavGraph
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황            By Changhoon Park
                                                   http://wawworld.me

11년 10월 13일 목요일
47

                  실질적인     NavGraph 구축
                  길 계획하기   Raven의 NavGraph
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황            By Changhoon Park
                                                   http://wawworld.me

11년 10월 13일 목요일
Edge next = GetNextEdgeFromPath(path)
         //in a simple navgraph the edge cost is the length of the edge
         ExpectedTimeToReachPos = next.cost / Bot.MaxSpeed
         //factor in a margin of error
         MarginOfError = 2.0;
         ExpectedTimeToReachPos += MarginOfError;




            48

                  실질적인     NavGraph 구축
                  길 계획하기   Raven의 NavGraph
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황                                         By Changhoon Park
                                                                                http://wawworld.me

11년 10월 13일 목요일
49

                  실질적인     NavGraph 구축
                  길 계획하기   Raven의 NavGraph
                           경로 계획자 클래스
                           노드경로/에지경로
                           난처한 상황            By Changhoon Park
                                                   http://wawworld.me

11년 10월 13일 목요일

실질적인 길 계획하기

  • 1. 게임 인공지능 GameAI 실질적인 길 계획하기 By Changhoon Park http://wawworld.me Last Update : 2011. 08. 28 11년 10월 13일 목요일
  • 2. 2 실질적인 NavGraph 구축 가시점 길 계획하기 Raven의 NavGraph 확장 지형 경로 계획자 클래스 NavMesh 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 3. 3 실질적인 NavGraph 구축 가시점 길 계획하기 Raven의 NavGraph 확장 지형 경로 계획자 클래스 NavMesh 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 4. 4 실질적인 NavGraph 구축 가시점 길 계획하기 Raven의 NavGraph 확장 지형 경로 계획자 클래스 NavMesh 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 5. 5 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 6. 6 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 7. 7 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 8. 8 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 9. template <class extra_info = void*> class NavGraphNode : public GraphNode { protected: Vector2D m_vPosition; extra_info m_ExtraInfo; public: //ctors NavGraphNode():m_ExtraInfo(extra_info()){} NavGraphNode(int idx,Vector2D pos):GraphNode(idx), m_vPosition(pos), m_ExtraInfo(extra_info()) {} virtual ~NavGraphNode(){} Vector2D Pos()const; void SetPos(Vector2D NewPosition); extra_info ExtraInfo()const; void SetExtraInfo(extra_info info); }; 9 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 10. class Raven_PathPlanner { private: enum {no_closest_node_found = -1}; private: Raven_Bot* m_pOwner; const Raven_Map::NavGraph& m_NavGraph; Vector2D m_vDestinationPos; int GetClosestNodeToPosition(Vector2D pos)const; public: Raven_PathPlanner(Raven_Bot* owner); bool CreatePathToPosition(Vector2D TargetPos, std::list<Vector2D>& path); bool CreatePathToItem(unsigned int ItemType, std::list<Vector2D>& path); }; 10 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획차 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 11. 11 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 12. bool Raven_PathPlanner::CreatePathToPosition(Vector2D TargetPos,std::list<Vector2D>& path) { m_vDestinationPos = TargetPos; if (!m_pOwner()->GetWorld()->isPathObstructed(m_pOwner->Pos(), TargetPos, m_pOwner->BRadius())) { path.push_back(TargetPos); return true; } int ClosestNodeToBot = GetClosestNodeToPosition(m_pOwner->Pos()); if (ClosestNodeToBot == no_closest_node_found) { return false; } 12 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 13. int ClosestNodeToTarget = GetClosestNodeToPosition(TargetPos); if (ClosestNodeToTarget == no_closest_node_found) { return false; } typedef Graph_SearchAStar< Raven_Map::NavGraph, Heuristic_Euclid> AStar; AStar search(m_NavGraph, ClosestNodeToBot, ClosestNodeToTarget); std::list<int> PathOfNodeIndices = search.GetPathToTarget(); if (!PathOfNodeIndices.empty()) { ConvertIndicesToVectors(PathOfNodeIndices, path); path.push_back(TargetPos); return true; } else { return false; } } 13 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 14. 14 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 15. template <class graph_type, class termination_condition> class Graph_SearchDijkstra { /* OMITTED */ }; ======================================================================== static bool isSatisfied(const graph_type& G, int target, int CurrentNodeIdx); ======================================================================== if (NextClosestNode == m_iTarget) return; //if the target has been found exit ======================================================================== //if the target has been found exit if (termination_condition::isSatisfied(m_Graph, m_iTarget, NextClosestNode)) { m_iTarget = NextClosestNode; return; } 15 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 16. template <class trigger_type> class FindActiveTrigger { public: template <class graph_type> static bool isSatisfied(const graph_type& G, int target, int CurrentNodeIdx) { bool bSatisfied = false; const graph_type::NodeType& node = G.GetNode(CurrentNodeIdx); if ((node.ExtraInfo() != NULL) && node.ExtraInfo()->isActive() && (node.ExtraInfo()->EntityType() == target) ) { bSatisfied = true; } return bSatisfied; } }; 16 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 17. typedef FindActiveTrigger<Trigger<Raven_Bot> > term_con; typedef Graph_SearchDijkstra_TS<RavenMap::NavGraph, term_con> SearchDij; //instantiate the search SearchDij dij( G, // the graph 6, // the source node type_health); // the item type we are searching for //grab the path std::list<int> path = dij.GetPathToTarget(); 17 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 18. 18 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 19. class NavGraphEdge : public GraphEdge { public: //enumerate some behavior flags enum BehaviorType { normal = 1 << 0, tippy_toe = 1 << 1, swim = 1 << 2, crawl = 1 << 3, creep = 1 << 4 }; protected: BehaviorType m_iBehavior; //the behavior associated with traversing this edge /* EXTRANEOUS DETAIL OMITTED */ }; 19 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 20. class PathEdge { private: //positions of the source and destination nodes this edge connects Vector2D m_vSource; Vector2D m_vDestination; int m_iBehavior; //the behavior associated with traversing this edge public: PathEdge(Vector2D Source, Vector2D Destination, int Behavior) : m_vSource(Source), m_vDestination(Destination), m_iBehavior(Behavior) {} Vector2D Destination()const; void SetDestination(Vector2D NewDest); Vector2D Source()const; void SetSource(Vector2D NewSource); int Behavior()const; }; 20 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 21. bool Raven_PathPlanner::CreatePathToPosition(Vector2D TargetPos, std::list<PathEdge>& path) { if (!m_pOwner()->GetWorld()->isPathObstructed(m_pOwner->Pos(), TargetPos, m_pOwner->BRadius())) { path.push_back(PathEdge(m_pOwner->Pos(), TargetPos, NavGraphEdge::normal)); return true; } int ClosestNodeToBot = GetClosestNodeToPosition(m_pOwner->Pos()); if (ClosestNodeToBot == no_closest_node_found) { //no path possible return false; } int ClosestNodeToTarget = GetClosestNodeToPosition(TargetPos); if (ClosestNodeToTarget == no_closest_node_found) { //no path possible return false; } 21 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 22. //create an instance of the A* search class. typedef Graph_SearchAStar<Raven_Map::NavGraph, Heuristic_Euclid> AStar; AStar search(m_NavGraph, ClosestNodeToBot, ClosestNodeToTarget); path = search.GetPathAsPathEdges(); //grab the path as a list of PathEdges if (!path.empty()) { path.push_front( PathEdge(m_pOwner->Pos(), path.front().GetSource(), NavGraphEdge::normal)); path.push_back(PathEdge(path.back().GetDestination(), TargetPos, NavGraphEdge::normal)); return true; } else { return false; //no path found by the search } } 22 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 23. if (Bot.PathPlanner.CreatePathToPosition(destination, path)) { PathEdge next = GetNextEdgeFromPath(path) switch(next.Behavior) { case behavior_stealth: set stealth mode break case behavior_swim set swim mode break etc } Bot.MoveTo(NavGraph.GetNodePosition(next.To)) } 23 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 24. 24 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 25. 25 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 26. 26 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 27. 27 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 28. void Raven_PathPlanner::SmoothPathEdgesQuick(std::list<PathEdge>& path) { //create a couple of iterators and point them at the front of the path std::list<PathEdge>::iterator e1(path.begin()), e2(path.begin()); ++e2; //increment e2 so it points to the edge following e1. while (e2 != path.end()) { //check for obstruction, adjust and remove the edges accordingly if ( m_pOwner->canWalkBetween(e1->Source(), e2->Destination()) ) { e1->SetDestination(e2->Destination()); e2 = path.erase(e2); } else { e1 = e2; ++e2; } } } 28 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 29. 29 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 30. void Raven_PathPlanner::SmoothPathEdgesPrecise(std::list<PathEdge>& path) { std::list<PathEdge>::iterator e1, e2; e1 = path.begin(); while (e1 != path.end()) { e2 = e1; ++e2; while (e2 != path.end()) { if ( m_pOwner->canWalkBetween(e1->Source(), e2->Destination()) ) { e1->SetDestination(e2->Destination()); e2 = path.erase(++e1, ++e2); e1 = e2; --e1; } else { ++e2; } } ++e1; } } 30 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 31. 31 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 32. template <class graph_type> std::vector<std::vector<int> > CreateAllPairsTable(const graph_type& G) { enum {no_path = -1}; std::vector<int> row(G.NumNodes(), no_path); std::vector<std::vector<int> > shortest_paths(G.NumNodes(), row); for (int source=0; source<G.NumNodes(); ++source) { Graph_SearchDijkstra<graph_type> search(G, source); std::vector<const GraphEdge*> spt = search.GetSPT(); 32 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 33. for (int target = 0; target<G.NumNodes(); ++target) { if (source == target) { shortest_paths[source][target] = target; } else { int nd = target; while ((nd != source) && (spt[nd] != 0)) { shortest_paths[spt[nd]->From][target]= nd; nd = spt[nd]->From; } } } //next target node } //next source node return shortest_paths; } 33 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 34. 34 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 35. template <class graph_type> std::vector<std::vector<double> > CreateAllPairsCostsTable(const graph_type& G) { std::vector<double> row(G.NumNodes(), 0.0); std::vector<std::vector<double> > PathCosts(G.NumNodes(), row); for (int source=0; source<G.NumNodes(); ++source) { Graph_SearchDijkstra<graph_type> search(G, source); for (int target = 0; target<G.NumNodes(); ++target) { if (source != target) { PathCosts[source][target]= search.GetCostToNode(target); } }//next target node }//next source node return PathCosts; } 35 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 36. 36 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 37. template <class graph_type, class heuristic> int Graph_SearchAStar_TS<graph_type, heuristic>::CycleOnce() { if (m_pPQ->empty()) { return target_not_found; } int NextClosestNode = m_pPQ->Pop(); m_ShortestPathTree[NextClosestNode] = m_SearchFrontier[NextClosestNode]; if (NextClosestNode == m_iTarget) { return target_found; } Graph::ConstEdgeIterator EdgeItr(m_Graph, NextClosestNode); for (const GraphEdge* pE=EdgeItr.beg(); !EdgeItr.end(); pE=EdgeItr.nxt() { /* SAME AS IN PREVIOUS A* ALGORITHM */ } return search_incomplete; } 37 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 38. template <class edge_type> class Graph_SearchTimeSliced { public: enum SearchType{AStar, Dijkstra}; private: SearchType m_SearchType; public: Graph_SearchTimeSliced(SearchType type):m_SearchType(type){} virtual ~Graph_SearchTimeSliced(){} virtual int CycleOnce()=0; virtual std::vector<const edge_type*> GetSPT()const=0; virtual double GetCostToTarget()const=0; virtual std::list<PathEdge> GetPathAsPathEdges()const=0; SearchType GetType()const{return m_SearchType;} }; 38 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 39. class Raven_PathPlanner { private: Graph_SearchTimeSliced* m_pCurrentSearch; /* EXTRANEOUS DETAIL OMITTED */ public: bool RequestPathToItem(unsigned int ItemType); bool RequestPathToTarget(Vector2D TargetPos); int CycleOnce()const; Path GetPath(); }; 39 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 40. int Raven_PathPlanner::CycleOnce()const { assert (m_pCurrentSearch && "<Raven_PathPlanner::CycleOnce>: No search object instantiated"); int result = m_pCurrentSearch->CycleOnce(); if (result == target_not_found) { Dispatcher->DispatchMsg(SEND_MSG_IMMEDIATELY, SENDER_ID_IRRELEVANT, m_pOwner->ID(), Msg_NoPathAvailable, NO_ADDITIONAL_INFO); } else if (result == target_found) { void* pTrigger = m_NavGraph.GetNode(m_pCurrentSearch->GetPathToTarget().back()).ExtraInfo(); Dispatcher->DispatchMsg(SEND_MSG_IMMEDIATELY, SENDER_ID_IRRELEVANT, m_pOwner->ID(), Msg_PathReady, pTrigger); } return result; } 40 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 41. template <class path_planner> class PathManager { private: std::list<path_planner*> m_SearchRequests; unsigned int m_iNumSearchCyclesPerUpdate; public: PathManager(unsigned int NumCyclesPerUpdate); void UpdateSearches(); void Register(path_planner* pPathPlanner); void UnRegister(path_planner* pPathPlanner); }; 41 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 42. template <class path_planner> inline void PathManager<path_planner>::UpdateSearches() { int NumCyclesRemaining = m_iNumSearchCyclesPerUpdate; std::list<path_planner*>::iterator curPath = m_SearchRequests.begin(); while (NumCyclesRemaining-- && !m_SearchRequests.empty()) { int result = (*curPath)->CycleOnce(); if ( (result == target_found) || (result == target_not_found) ) { curPath = m_SearchRequests.erase(curPath); } else { ++curPath; } if (curPath == m_SearchRequests.end()) { curPath = m_SearchRequests.begin(); } }//end while } 42 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 43. bool Raven_PathPlanner:: RequestPathToItem(unsigned int ItemType) { GetReadyForNewSearch(); int ClosestNodeToBot = GetClosestNodeToPosition(m_pOwner->Pos()); if (ClosestNodeToBot == no_closest_node_found) { return false; } typedef FindActiveTrigger<Trigger<Raven_Bot> > term_con; typedef Graph_SearchDijkstra_TS<Raven_Map::NavGraph, term_con> DijSearch; m_pCurrentSearch = new DijSearch(m_pWorld->GetNavigationGraph(), ClosestNodeToBot, ItemType); m_pWorld->GetPathManager()->Register(this); return true; } 43 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 44. 44 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 45. 45 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 46. 46 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 47. 47 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 48. Edge next = GetNextEdgeFromPath(path) //in a simple navgraph the edge cost is the length of the edge ExpectedTimeToReachPos = next.cost / Bot.MaxSpeed //factor in a margin of error MarginOfError = 2.0; ExpectedTimeToReachPos += MarginOfError; 48 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일
  • 49. 49 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me 11년 10월 13일 목요일