Your SlideShare is downloading. ×
실질적인 길 계획하기
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

실질적인 길 계획하기

433
views

Published on

http://wawworld.me …

http://wawworld.me

changhoonpark@gmail.com

Published in: Education, Technology, Sports

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
433
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 게임 인공지능 GameAI 실질적인 길 계획하기 By Changhoon Park http://wawworld.me Last Update : 2011. 08. 2811년 10월 13일 목요일
  • 2. 2 실질적인 NavGraph 구축 가시점 길 계획하기 Raven의 NavGraph 확장 지형 경로 계획자 클래스 NavMesh 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 3. 3 실질적인 NavGraph 구축 가시점 길 계획하기 Raven의 NavGraph 확장 지형 경로 계획자 클래스 NavMesh 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 4. 4 실질적인 NavGraph 구축 가시점 길 계획하기 Raven의 NavGraph 확장 지형 경로 계획자 클래스 NavMesh 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 5. 5 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 6. 6 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 7. 7 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 8. 8 실질적인 NavGraph 구축 성긴 그래프 길 계획하기 Raven의 NavGraph 밀집 그래프 경로 계획자 클래스 아이템 추가 노드경로/에지경로 공간 분할 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 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.me11년 10월 13일 목요일
  • 11. 11 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 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.me11년 10월 13일 목요일
  • 14. 14 실질적인 NavGraph 구축 특정 위치까지의 경로 길 계획하기 Raven의 NavGraph 어떤 아이템 타입까지의 경로 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 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.me11년 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.me11년 10월 13일 목요일
  • 18. 18 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 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.me11년 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.me11년 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.me11년 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.me11년 10월 13일 목요일
  • 24. 24 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 25. 25 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 26. 26 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 27. 27 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 10월 13일 목요일
  • 29. 29 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 10월 13일 목요일
  • 31. 31 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 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.me11년 10월 13일 목요일
  • 34. 34 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 10월 13일 목요일
  • 36. 36 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 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.me11년 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.me11년 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.me11년 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.me11년 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.me11년 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.me11년 10월 13일 목요일
  • 44. 44 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 45. 45 실질적인 NavGraph 구축 주석이 달린 에지 길 계획하기 Raven의 NavGraph 경로 계획자 수정 경로 계획자 클래스 경로 부드럽게 하기 노드경로/에지경로 CPU오버헤드 줄이기 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 46. 46 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일
  • 47. 47 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 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.me11년 10월 13일 목요일
  • 49. 49 실질적인 NavGraph 구축 길 계획하기 Raven의 NavGraph 경로 계획자 클래스 노드경로/에지경로 난처한 상황 By Changhoon Park http://wawworld.me11년 10월 13일 목요일