Upload
sehyeon-nam
View
52
Download
1
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값 매번 계산 말고 미리 계산해서 퍼포먼스 이득보셈
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. 블리자드 입사해서 비밀문서 찾아보기 ◦ 이쪽 계열은 블리자드가 노하우가 많기로 유명함.
네비게이션 메쉬 만들기 1. 캐릭터가 이동할 수 있는 부분을 삼각형 메쉬로 만듬.
2. 그 메쉬는 화면에 보이는 메쉬는 아님. 단순 계산용.
3. 그 삼각형에 점을 하나 두고, 이동하면 됨. ◦ 마치 캐릭터가 삼각형 카펫 위를 걷는 것 처럼
4. 그 점을 구하는 방법은 투영, 혹은 y축 없애고 계산 등이 있음.
5. 한 삼각형의 끝에 도달했는데 다른 삼각형이 없다? -‐> 장애물에 도착
6. “술통 앞으로 가십시오” 같은 것도 이런 식으로 처리 가능 ◦ 메쉬 위에 특별한 점을 만들어서 그 점과 현재 위치 비교해서 처리 가능