26
Game Programing Gems [3.4] A*의 미학적 최적화 +[3.6] 네비게이션 메시를 이용한 단순화된 3D 이동과 길찾기 2015 – 07 – 02 NHN NEXT 남세현

Game programing gems 3.4 3.6

Embed Size (px)

Citation preview

Game����������� ������������������  ����������� ������������������  Programing����������� ������������������  ����������� ������������������  Gems����������� ������������������  [3.4]����������� ������������������  A*의����������� ������������������  미학적����������� ������������������  최적화����������� ������������������  +[3.6]네비게이션����������� ������������������  메시를����������� ������������������  이용한����������� ������������������  단순화된����������� ������������������  3D����������� ������������������  이동과����������� ������������������  길찾기

2015 – 07 – 02 NHN NEXT 남세현

자연스럽지 않은 A* 결과물   A* 게임을 위한 알고리즘 아니야.  ◦ 탐색 알고리즘 중 하나일 뿐.  

  그래서 결과물 자연스럽지 않음  ◦ 미학적인 수정이 필요  

  수정 방법 3가지  1.  경로를 직선되게  

2.  경로를 매끄럽게  

3.  경로를 직접적이게 (쓸데없이 돌아가지 않게)  

1. 경로를 직선되게   A*의 결과물 = 지그재그  ◦ 술 취한 사람  

  게임에서의 길찾기 목표 != 인공지능학의 최단거리 문제 해결  ◦ 유닛이 지능적이고 자연스럽게 이동하는 것이 목표  

  비틀거리는 경로, 해결 방법  1.  A* 알고리즘 내에서 직선을 고려하기  

2.  A* 결과물을 가지고 직선되게 만들기  

1.1 알고리즘 내에서 직선을 고려하기   거리 비용은 같음  ◦  하지만 시각적으로 차이  

  A*는 두 차이를 느끼지 못함  ◦  차이를 느끼도록 도와주자!  

  해결 방법  ü   방향이 달라질 때 가중치 더하기  

  주의점  ◦  완성된 경로에서 가중치를 나중에 더하는게 아니라  

◦  매 단계때 가중치 더해서 계산  

1.1 알고리즘 내에서 직선을 고려하기   근데…  ◦  그건 b같은 상황에서의 이야기  

  공간이 비균등 할 때는  ◦  서로 다른 길인데 같은 거리비용?  

◦  그런거 없다 ㅠ 확률 낮음  

“공간이 비균등 할 때 같은 비용 경로들 중  좀더 직선화된 경로를 찾는다는 것 자체가 무의미하다.”  

1.2 결과물을 가지고 직선되게   비균등 할 때는 어떻게 직선되게 처리할까?  ◦ 알고리즘 내부를 수정하지 말고  ◦ 결과물을 수정하자  

  핵심 키워드 : 가시성  Visibility  ◦ 현재 위치 A에서, 다른 위치 B가 보이나?  ◦  위치 A에서는 위치 B까지의 가시성을 가지고 있다.  

◦ 현재 내가 볼 수 있는 점 중 가장 멀리 있는 점까지 가자  ◦  (P  :  Posi;on)  P[i]  -­‐>  P[i+1]  가 아니라,  P[i]에서 P[i+n]까지 한방에 가자  ◦  단,  P[i]가 P[i+n]까지 가시성을 가지고 있어야 함  

  별거 없음!  선 그어서 장애물 있는지 없는지로 판단함.  

1.2 결과물을 가지고 직선되게

•  [빨강����������� ������������������  다음은����������� ������������������  주황]����������� ������������������  인데,����������� ������������������  [빨강����������� ������������������  –����������� ������������������  파랑]����������� ������������������  으로����������� ������������������  가자����������� ������������������  이거임.����������� ������������������  ����������� ������������������  •  [빨강����������� ������������������  –����������� ������������������  초록]은����������� ������������������  장애물����������� ������������������  있어서����������� ������������������  안됨����������� ������������������  

2. 경로를 매끄럽게   직선화의 한계  ◦ 방향이 급격하게 변하면 부자연스러움  ◦ 즉, 날카롭다!  

  그래픽스에 보면 매끄럽게 만드는 기술들 많음  ◦ 원래 지난주에 하기로 한 “보간법  –  interpola;on”  ◦  ㅠㅠ  

  곡선을 만드는 기법 중 Catmull-­‐Rom 기법  ◦ 베지어  Bazier 곡선이 더 매끄럽지만, 제어점을 지나지 않음.  ◦  Catmull-­‐Rom은 제어점을 지남.  

Catmull-­‐Rom  

Bezier  

2. 경로를 매끄럽게   A*의 결과물들을 “제어점”으로 입력함  ◦  굵은 점이 “제어점”  

 

  Camull-­‐Rom  스플라인 공식  

◦  u는 0부터 1까지의 값  ◦  u  :  0.25  =>  25% 위치의 점  ◦  u값 매번 계산 말고  미리 계산해서 퍼포먼스 이득보셈  

2. 경로를 매끄럽게

3. 경로를 직접적이게   최적화의 기본은 뭐다?  ◦ Divide  and  Conquer  : 문제를 나눠서 해결하기  

    A*도 똑같음.    

1.  큰 범위 공간에서 경로를 찾은 후  

2.  그보다 하위 공간에서 개별적으로 경로를 찾음  

  넥스트에서 블리자드 가는 법과 비슷함.  

  일단 큰 범위 공간(한국 -­‐> 미국)를 찾은후,  

  그보다 하위 공간(판교 -­‐>  인천국제공항,    LA국제공항 -­‐>  어바인)  을 찾음.  

3. 경로를 직접적이게   큰����������� ������������������  공간����������� ������������������  개념으로����������� ������������������  먼저����������� ������������������  계산����������� ������������������  ◦  1->2->3->4����������� ������������������  

  그����������� ������������������  후,����������� ������������������  세부적으로����������� ������������������  1->2����������� ������������������  를����������� ������������������  계산.����������� ������������������  ◦  현재����������� ������������������  위치에서����������� ������������������  1과����������� ������������������  2의����������� ������������������  입구����������� ������������������  중점으로����������� ������������������  

  발생하는����������� ������������������  문제는?����������� ������������������  

  “현재����������� ������������������  위치에서����������� ������������������  1과����������� ������������������  2의����������� ������������������  입구����������� ������������������  중점으로”����������� ������������������  

  문제를����������� ������������������  크게����������� ������������������  보고����������� ������������������  계산����������� ������������������  후,����������� ������������������  ����������� ������������������  디테일을����������� ������������������  잡다����������� ������������������  생기는����������� ������������������  문제가����������� ������������������  발생함.����������� ������������������  

  해결책은?����������� ������������������  ◦  세부����������� ������������������  계산����������� ������������������  시����������� ������������������  1->2����������� ������������������  말고����������� ������������������  1->3을����������� ������������������  계산함.����������� ������������������  

◦  i����������� ������������������  ->����������� ������������������  i+1����������� ������������������  말고,����������� ������������������  i����������� ������������������  ->����������� ������������������  i+2를����������� ������������������  계산하자고.����������� ������������������  

3. 경로를 직접적이게   A  에서 A+1를 계산 하지 말고  

  A  에서 A+2를 계산함.  (  방 1 -­‐> 방 3)  

  그리고 그 길로 가는데,  

  A+1 영역 까지만 가셈.  

  나머지 A+2로 가는 길 계산한건?  

  버려  

3. 경로를 직접적이게

“세부����������� ������������������  계산����������� ������������������  시����������� ������������������  1->2����������� ������������������  말고����������� ������������������  1->3을����������� ������������������  계산하자”����������� ������������������  i����������� ������������������  ->����������� ������������������  i+1����������� ������������������  말고,����������� ������������������  i����������� ������������������  ->����������� ������������������  i+2����������� ������������������  

대신����������� ������������������  i+2����������� ������������������  까지����������� ������������������  가지����������� ������������������  마셈.����������� ������������������  i+1까지만����������� ������������������  가셈����������� ������������������  ����������� ������������������  

3. 경로를 직접적이게   A에서 A+2까지 경로 만들고,  A+1까지만 이동함.  

  A+1  -­‐>  A+2까지 경로는 버려야 함!  

  그리고 다시 A+2  -­‐>  A+4  경로 만들어야함.  

  즉, 새로운 방에 들어갈 때마다 새로 계산을 해야함.  

  방에 들어갈때마다 계산하느라 렉 걸리면 안됨  ◦  그러므로 움직일때 미리미리 계산하셈.  

반응성을 최대화하기   사용자는 본인의 입력에 대한 반응이 빠르길 원한다.  

  사용자를 속여서 마치 반응이 빠르게 보이게 하는 방법  

1.  “Yes  Sir!” 소리 먼저 내기  ◦  유닛이 명령을 알아듣고 즉시 움직일 듯한 인상 주기  

2.  “이제 곧 움직일거야” 눈속임 주기  ◦  총을 고쳐 잡는다던가  ◦  배기관에 연기가 나온다던가  

3.  계산 다 안끝나도 미리 일단 이동시키기  ◦  이동하면서 나머지 계산 계속 진행.  ◦  잘못하면 망함.  그러므로 아무때나 사용 X  

반응성을 최대화하기   수많은 유닛을 동시에 이동해야 하는 경우  

1.  한마리씩 계산해서 이동하기  ◦  동시에 다 계산하려면 화면이 멈춰있는 시간이 길다!  ◦  일단 한마리라도 먼저 이동시키기.  

2.  리더를 정해서 따라가자  ◦  수많은 유닛 중 한마리만 길을 계산하고  ◦  나머지 유닛은 그 유닛을 따라가도록  

3.  블리자드 입사해서 비밀문서 찾아보기  ◦  이쪽 계열은 블리자드가 노하우가 많기로 유명함.  

결론

  “나 길 찾고 있어”라는 인상을 주면 안된다.  

뽀나스 3.6 네비게이션 메시를 이용한 단순화된 3D 이동과 길찾기

별거 없다~   3D에서 길찾기는 전나 빡셈.  

  그러므로,    

 3D를 2D로 낮춰 계산할 수 있도록 하자.  

네비게이션 메쉬 만들기

네비게이션 메쉬 만들기 1.  캐릭터가 이동할 수 있는 부분을 삼각형 메쉬로 만듬.  

2.  그 메쉬는 화면에 보이는 메쉬는 아님.  단순 계산용.  

3.  그 삼각형에 점을 하나 두고, 이동하면 됨.  ◦  마치 캐릭터가 삼각형 카펫 위를 걷는 것 처럼  

4.  그 점을 구하는 방법은 투영, 혹은 y축 없애고 계산 등이 있음.  

5.  한 삼각형의 끝에 도달했는데 다른 삼각형이 없다?  -­‐> 장애물에 도착  

6.  “술통 앞으로 가십시오” 같은 것도 이런 식으로 처리 가능  ◦  메쉬 위에 특별한 점을 만들어서 그 점과 현재 위치 비교해서 처리 가능  

네비게이션 메쉬 길찾기 “길을 찾을 땐 삼각형 꼭지점이 아니라 삼각형 변의 중점을 기준으로”  

어 님아?

  그러면 전나 길이 구불구불 하잖아요  

아까 했죠? ㅎㅎ

결론   어려운 문제는     우리가 이미 아는 해결책(2D의 A*)을 생각해보고  

  그 어려운 문제의 상태(3D)를  우리가 아는 해결책에 필요한 조건(2D)까지 끌고 내려가면  

  원활히 풀 수 있다.