2. 저자 소개 William van derSterren William van derSterren은 게임과 시뮬레이션을 위한 전술 AI를 개발한다. 그는 개발자/컨설턴트이자 CGF-AI의 설립자이다. William은 Game Developers Conference에서 강연을 했으며 AI Programming Wisdom (Charles River Media, Inc., 2002)와 Game Programming Gems 시리즈에 글을 기고했다. 임베디드 시스템과 방위 시뮬레이션 분야의 연구 과학자로 일했던 그는 현재 차세대 콘솔용 게임의 AI 수석 프로그래머로 일하고 있다.
3. A*에 대한 복습 A* 기본 알고리즘 F = G + H 비용값=현재 노드까지의 비용 + 휴리스틱 비용 - Open List에서 F값이 가장 작은 쪽을 우선적으로 탐색 하는 것
4. A*에 대한 복습 http://hackish.tistory.com/21한국어 http://www.policyalmanac.org/games/aStarTutorial.htm영문 원본
10. (a) 적이 움직이지 않는다는 가정하의 경로(b) 적이 두 걸음 움직인다는 가정하의 경로
11. 기타 전술적 개선방안 이동하는 지점의 적의 사선(射線)(Line Of Fire)의 개수를 샌다: 사선이 적으면 적이 소수 이므로 리스크가 준다. 잠입요소 강조 : 잡초 등 엄폐가 가능한 요소가 있는 곳 외에 작은 벌점을 부여 탱크 : 능선을 피한다. 마린 : 사다리 피한다, 다른 분대원들이 저격 당한 장소 피한다. 등등 유닛에 따른 지형학적 벌점을 부여
12. 성능 이렇게 오리지널 A*에 case by case로 전술적인 능력을 더하면 더할수록 느려지는건 당연! 그러니까 그냥 각각의 지형타일의 참조테이블을 일일이 만들어서 길찾기 할 때 우선순위를 정하면 빠르고 좋을 거임!
16. 확장된 A* 비용에 대한 해결책 전술적 비용함수 계산시 부동소수점 연산을 자제 : 정수 연산을 이용해서 부동소수점 계산을 근사 하여 성능을 향상 측면과 후방에 비용이 큰 가상의 장애물을 도입한다: 쓸 때 없이 옆이랑 뒤랑 찾는 시간을 아끼자. 영역을 나누어 전략적 길찾기를 한다: 섹터 단위 보다 크니까 빠르겠죠?
17. A Fast Approach to navigation Meshes GPG3 3.7 Stephen White and Christopher Christensen, Naughty Dog
18. 저자 소개 Christopher Christensen cchristensen@naughtydog.com Christopher는 1982년 Apple II+ 컴퓨터로 처음 프로그래밍을 시작했다. 1994년 컴퓨터 공학 석사 학위를 땄지만, 학계에 남는 대신 Interplay Productions에서 PC 롤플레잉 게임을 프로그래밍하는 일을 하게 되었다. 그 후 계속 게임 업계에 남아 있으며, 현재는 Santa Monica, California의 Naughty Dog에서 프로그래머로 일하고 있다.
19. 저자 소개 Stephen White swhite@naughtydog.com Stephen White는 Naughty Dog의 프로그래밍 디렉터이며 다양한 플랫폼들에서 전문 비디오 게임 프로그래머로 15년 이상 일했다. Stephen의 작품들 중 중요한 것 몇 가지를 들자면 Jak and Daxter: The Precursor Legacy, Crash Bandicoot: Warped, Crash Bandicoot: Cortex Strikes Back, Brilliance, Deluxe Paint ST 등이 있다. 그는 비디오 게임 만들기에 매우 열성적이며, 비디오 게임 개발의 실질적으로 모든 측면들에 관여해왔다. Stephen은 아내 Linda(10 년 된 아내)의 헌신적인 남편이자 Logan(10 달 된 아들)의 헌신적인 아버지이다.
20. 네비게이션메시 복습 네비게이션메쉬란? : 3차원 지형을 2D처럼 간단하게 표현 하는 방식으로 Object가 이동 가능한 모든 지형을 Cell(삼각형)으로 표시 하여 A*와 같은 길찾기 알고리즘을 쉽게 적용 할 수 있게 해 줍니다.
25. 포탈(Portal) 포탈? : 다른 삼각현으로의 관문(doorway)에 해당 삼각형의 변은 3개, 그러므로 포탈도 3개 3변이 다른 삼각형으로 모두 연결되어있을 경우 모든 포탈을 2비트로 표현가능 00, 01, 10, 11 : 여분의 값이 하나 남네요!
26. 포탈(Portal) 현재 삼각형에서 다른 삼각형으로 이동할 때 경로를 찾는 방법 : 방법 1) A*를 사용한다. 방법 2) 아까 언급한 미리 계산해놓은 각각의 삼각형들의 포탈 정보를 담은 2차원 배열테이블을 이용
27. 2차원 배열 테이블을 이용 테이블의 메모리 소비량은 대략메시의 삼각형 개수의제곱값을4로 나눈 것에 해당 -삼각형이 256개 일 때 포탈정보를 저장해놓은 테이블의 소비 메모리는 16KB 테이블 참조를 통해서 어떤 포탈을 사용할 것인지 찾아낼 수 있으므로 속도가 매우 빠름
30. 분기점에서의 문제 목표에 도달 할 수 있는 포탈이 둘 이상인 경우, 테이블 항목은 목표에 보다 가까운 포탈을 알려준다. 하지만 미리 계산된 테이블은 단지 한 삼각형에서 다른 삼각형으로 이동하는 방법만 알려줄 뿐, 한 삼각형 점의 정확한 위치와 다른 삼각형 점의 정확한 위치는 알려주지 않으며, 따라서 테이블을 통해 얻은 경로가 반드시 최단 경로라 할 수는 없다. But 그리 문제는 안된다.
31. 테이블 만들기 삼각형의 중심(세 꼭지점과의 거리가 동일한 점)을 계산 Simple flood-fill 알고리즘을 사용하여 삼각형들을 연결하는 경로들을 찾는다. 두 삼각형들 사이의 경로가 둘 이상이라면 더 긴 경로를 폐기한다.
33. 크리처의네비게이션메시 위의 표현 2차원 원으로 표현한다. 원으로 하면 회전과 무관하기 때문에 네비게이션 메시나 장애물과의 충돌 시 크리처의 방향을 고려할 필요가 없다. 크리처와네비게이션메시의 충돌 판정을 위해서 원 대 선분, 원 대 삼각형 교차 판정을 일일이 하면 열라 느려진다.
36. 정적, 동적 장애물을 동시에 피해가자! 1. 네비게이션메시로 정적인 장애물을 피하는 경로를 알아낸다. 2. 그 경로에 동적인 장애물(원)이 있는지 파악한다. 3. 동적인 장애물이 있다면 이동백터를 수정한다. 4. 수정된 이동백터에 의한 이동이 네비메시를 벋어나면 메시 가장자리까지만 이동하도록 벡터를 수정한다.
40. 저자 소개 Thomas Young thomas.young@bigfoot.com Thomas는 오래전Amiga를 위한 하드웨어 트릭들을 코딩하면서 게임 프로그래밍을 시작했다. 그는 Sussex University에서 AI를 전공하고 학위를 땄다. 그 후 그는 Gremlin Interactive(Sheffield, U.K.)에서 AI 프로그래머로 일하면서 주로 캐릭터가 환경의 장애물들을 이해하게 만드는 것과 캐릭터가 좀 더 사실적으로 이동하게 하는 것에 초점을 두고 작업을 했다. 2000 년 그는 Gremlin(현재는 Infogames, Sheffield Hose)를 떠나서 독립 계약자로 일했으며 정교한 길찾기 시스템을 미들웨어 라이선스로 제공하는 회사를 설립했다(http://www.pathengine.com).
41. 개요 복잡한 의사결정 시스템을 가지고 있는 길찾기 시스템이라고 해도 맵에 끼어버리면 한순간에유저들의 평에 나락으로 떨어진다. 만약, 케릭터가 환경의 장애들을 적절히 다룰 수 있는 능력을 가지고 있다면, 아주 간단한 의사결정 구조만으로도 그럴듯하게 보이는 AI를 만들 수 있다. 길찾기 시스템과 충동 처리의 관계 : 케릭터가 환경 안의 장애물에 반응하는 방법을 이해하게 만드는 핵심적인 요인
42. 충돌 시스템의 제어 하에서의 이동 케릭터가벽같은 장애물을 뚫고 나가게 하는 일이 게임에서 발생한다면 대략 낭패! 그래서, AI의 의사결정은 먼저 충돌 시스템에서 OK가 떨어진 다음에 케릭터의 이동으로 이어져야 한다. 그래서 행동 코드는 충돌 코드에 강한 의존성을 갖게 된다
44. Approach#1:fault-tolerant AI (좀 틀려도 되 AI) 사람이 돌아다니면서 물체를 피할 때 물리학을 따지고 수학으로 최적화 해서 돌아다니는 건 아니다. 길 찾기 공간을 수작업으로 편집하거나 충돌처리가 일어나는 매카니즘은접어두고 맵이나 충돌할 만한 오브젝트를 보고 대략 피해갈 수 있는 루트를 자동으로 생성
46. fault-tolerant AI의 장단점 충돌이 단순하고 게임 세계가 비교적 작을때 쓰면 탁월한 효과! 하지만, 충돌상황이 상당히 복잡하면 길찾기를 대충 때려서 하기가 힘들어진다. 또한, 많은 종류의 상황들에 적용되어야 할 경우(앞에서 말한 위험지역 돌아가기 등?) 대충 찾은 길찾기는캐릭의 사망을 유도
48. 해결책? 일일이 지정 : 지그재그 할 때마다 캐릭터를 적절히 회전시키고 다음 지그재그 턴시점에서 방향도 바꾸고 다시 캐릭터 회전시키고…헉헉.. 애시 당초 못가게 하면 되잖아!!! 맵을 잘 만들란 말야. 아예 좁은 틈은 못가게 하던가. 충돌 피드백: 한번 가보고 막혔으면 그 terrain은 못 가는 곳으로 체크. 그런데 어쩌다가 빠져 나왔는데 못 가는 체크되어있으면 갇히는 겁니다.. GM부르고 게시판에 영자 욕하고…OTL 신경망 훈련 같은 기계 학습 기법들을 사용한다. 배우면서 크는거죠…. 모든 막힌 부분을 다 찾아낼 때까지 -_-; 그러니까 복잡한 데 쓰지 말란 겁니다.
49. Approach#2:Path-Finding in a Subset of Unobstructed Space 개방 공간의 부분집합에서의 길 찾기(먼 소리야) 절대로 충돌이 일어나지 않는 지형만 때내서 돌아다니자는 겁니다. 그러면 충돌처리도 생각 안 해도 되니까 아까 말한 복잡한 예외상황도 안 일어나겠죠.
51. 무적박스 방식에도 문제는 있다. 예1)카우보이 캐릭터가 말을 타고 그랜드 캐넌 맵에서 좁은 협곡도 충돌 없이 잘 가다가 갑자기 버팔로 때가 앞에서 몰려와서 이리 치이고 저리 치이다가 맵 밖으로 튕겨버렸다. 예2)좁은 해구를 요리조리 잘 피해서 순항하던 독일잠수함 U-BOAT 가 기뢰를 맞더니 폭발력의 반동으로 맵 밖으로 튕겨버렸다. 이럴 때는 그냥 카트라이더의 그것 처럼 이동 가능한 곳으로 옮겨주는 처리를 한다. 이때 이동가능 한 곳으로 돌아왔을 때부터는 모든 충돌을 무시하는 신공을 쓰면 최고다. 두어번클베를 해도 심신이 편할 수 있다.
52. 유효한 위치찾기 방법1) 이동 때마다 방금전의 유효한 위치를 보존해 두는 것. 방법1의 문제점) 캐릭터가 이미 길찾기 공간 밭에서 상당한 거리를 움직였다면 소용이 없다. 방법2) 지금 서있는 길찾기 외부 공간에서 가장 가까운 길찾기 공간 내부의 점을 알아내는 것. 방법2의 문제점) 지름길용 벾뚫기 버그를 이용할 문제가 생긴다.
54. Putting Backbones In the World 월드에 뼈를 넣자! (응?) 절대로 못지나가는 지형에 본을 박아 놓으면 찡기는 버그를 이용해서 벽 뛰어넘는 꽁수는 막을 수 있을 겁니다.
55. Approach #3: Using the Pathfinder Itself for Character collision 분리되어 있는 길찾기 모듈(Pathfinder) 자체를 케릭터 충돌에 사용한다. 캐릭터가 길찾기 공간 바깥으로 나가 버리는 일이 일어나지 않는다. 실시간으로 길찾기 모듈이 케릭터의 현재위치를 이해할 수 있다 따라서, 캐릭터는 길찾기 모듈이 돌려준 경로를 항상 안심하고 따라갈 수 있다. 단, 케릭터 충돌에 대해서 단순화된 메커니즘을 사용해야 한다. 그리서 멋은 없어지지만 빠르고 안정적이고 예측가능한 이점이 생긴다.
56. 보완책:계층화된 충돌처리 그냥 월드를 돌아다니면서 길을 갈 수 있느지 없는지는 길찾기 모듈이 관장하는 길찾기충돌층이 처리 월드를 돌아다니다가 케릭터의 높이나 방향이나 팔 다리 같은 것이 월드에 걸려서 길찾기에 영향이 주는지 등의 판단은 월드 충돌층에서 관리 평소에는 길찾기충돌층만 쓰면 속도면에서 이점이 있고, 복잡한 충돌처리가 필요한 지형이나 이벤트시에는 월드 충돌층을 이용하면 되니까 멋도 살릴 수 있다.