Recast: 언리얼 엔진에서 내비게이션 메시로 사용하고 있는 오픈 소스 라이브러리
장점
- 메시 빌드 속도
- 길찾기 속도
- 유연한 셋팅
단점
- 근시로 인한 오차
- 에이전트 검색 속도
- 난해한 셋팅
Detour: Recast로 생성된 메시에서 길을 찾아주는 라이브러리
DetourCrowd: 에이전트들간의 충돌 회피를 하는 알고리즘
DetourTileCache: 동적 메시 생성을 위한 라이브러리
Recast: 내비게이션 메시를 생성하는 부분
RecastDemo: 비주얼라이제이션을 포함한 툴
Recast 내비게이션 메시는 여러 개의 폴리곤들과 그 폴리곤들 사이의 연결 정보로 구성되어 있음
1. 길을 찾을 때 폴리곤의 각 변의 중점을 따라 길을 찾음
2. 찾은 길의 폴리곤을 따라서 길을 똑바르게 편다
Recast에서 내비게이션 메시를 생성하는 방법
1. Rasterization: 주어진 맵의 폴리곤 정보를 분석해서 복셀로 만듦
2. Find Walkable: 복셀상에서 걸어다닐 수 있는 셀들을 찾음
3. Erode: 가장자리여서 갈 수 없는 셀들을 캐릭터의 반지름만큼 깎아냄
4. Build Region: 하나의 폐곡선으로 둘러쌀 수 있게 영역을 구분
5. Make Contour: 각각의 영역을 둘러싸는 폐곡선을 만듦
6. Make Polygon: 폐곡선을 적절하게 잘라서 볼록다각형으로 만듦
타일링을 통한 메시
그렇다면 실시간을 바뀌는 내비게이션 메시는 어떻게 처리해야 할까?
=> 재빌드를 하되, 내비게이션 메시를 타일 단위로 잘라서 한 번에 리빌드 하는 양을 줄이고, 다시 빌드하지 않아도 되는 부분을 미리 계산해서 저장해 둠(DetourTileCache)
타일링을 쓸 경우 본래 없어도 될 정점이 생기게 되면서 오탐색의 가능성이 높아짐
=> 이 문제는 경로 탐색 후 레이캐스팅을 통해 한번 더 검증해서 해결
구면 기하학
구면에서의 좌표는 일반적인 3차원 공간과 마찬가지로 (x,y,z) 벡터를 (크기는 무시하고 방향만) 사용.
구면상에서 직선은 두 점 사이의 최단 거리 (= 두 점을 포함한 대원의 일부)
원점을 지나는 평면이기 때문에 노멀 벡터로도 나타낼 수 있다
구면 상에서 두 점간의 거리는 두 지점 사이의 각으로 정의 된다.
단 이렇게 되면 높이에 따라 유닛의 이동 속도가 달라지는 문제가 생긴다.
구면에서 Recast를 적용하려면 구면을 격자로 쪼개야 한다
=> 정육면체를 구면으로 사영하는 쿼드 스피어 방식을 사용
출처: http://ndcreplay.nexon.com/NDC2016/sessions/NDC2016_0073.html
'NDC > Dev' 카테고리의 다른 글
[NDC 2016] 유니티, iOS에서 LINQ 사용하기 (0) | 2023.01.15 |
---|---|
[NDC 2014] 멀티쓰레드 프로그래밍이 왜이리 힘드나요? (0) | 2022.10.18 |
[NDC 2014] 파이썬과 친구들 (0) | 2021.12.06 |
[NDC2013] 테스트 꾸준히 잘하는 법 (0) | 2021.11.14 |
[NDC2013] 라이브 프로젝트에서 C++로 테스트 주도 개발하기 (0) | 2021.11.13 |