Skip to main content
Recast Detour
DevRookie JINN
몬스터가 플레이어를 추격하려면?
맵을 클릭해서 움직이고 싶다면?
지형정보
길찾기
길찾기
다익스트라, 플로이드 등등,
다양한 길찾기 알고리즘들이 있지만 Pass
• A* 알고리즘
가장 기본적이고 대중적인 길찾기 방식
간단하게 설명해서 이웃 노드들을 돌며
목적지까지의 거리를 계속 계산해
가장 가까운 길을 찾음
그나마 위에것들에 비해 실시간 연산 비용이 싼 편이지만
그마저도 비싸서 더 효율적인 알고리즘이 수도없이 많음…
지형정보
2D, 심지어 그리드 형식은 가장 간단하다
걍 배열이니까…
하지만 3D라면?
후후… 우습군요 휴먼
우리에겐 ‘메쉬’라는
‘지형 정보’가 이미 있답니다
하지만 엄청나게 큰 무지무지 크고 디테일한 지형이라면?
길찾는 객체가 무지무지 많다면?
메쉬는 삼각형들로 이뤄져있으니,
이걸 ‘노드’ 로 사용하면 되겠죠?
매우 빠르고, 메모리도 적고
지형 인식이라는 무겁고 비싼 작업을
저렴하게 슈킹할 수 있음
그래서 간소화된 지형 정보 NavMesh가 필요합니다
와 정말 좋네요!
근데 네비메쉬를 어떻게 만들죠?
영상을 한번 봅시다
https://www.inven.co.kr/webzine/news/?news=208862
언리얼에서는?
1. 네비 바운딩 볼륨 배치 2. 네비메쉬 생성 3. 이동 함수 호출
어떤 식으로 구현되어 있을까요?
코드를 따라
심연까지 내려가면…
“dt” 라는 키워드를 발견!
:: 대충 Recast 라이브러리 썼다는 뜻
네비메쉬
Detour
:우회하다
Recast
:재구성하다
길찾기
왜 쓰는가?
No Use
Use
네비메쉬
길찾기
아니 어차피 언리얼 네비 사용법만 알면
굳이 라이브러리 사용법은 몰라도 되는 거 아닌가???
온라인이라 AI 서버에서 돌릴건데? ㅅㄱ
Recast Detour 설치
• 깃헙 https://github.com/recastnavigation/recastnavigation
• vcpkg install recastnavigation
*데모 보려면 깃헙에서 받아야함
1. Premake5 다운 https://premake.github.io/
2. premake5.exe를 RecastDemo 폴더로
3. 실행하면 demo솔루션 생성됨
Premake5 설치
1. 깃헙 SDL2 다운 https://github.com/libsdl-org/SDL/tree/SDL2
*다른 버전 받으면 안됨!!
SDL2 설치
2. ...SDLVisualC 경로의 SDL.sln 솔루션 실행
솔루션 중에서 SDL2와 SDL2main 두개만 lib으로 뽑으면 됨
1. 빌드된 lib 파일은 RecastDemoContribSDLlibx86 폴더로 복붙
2. SDLinclude 폴더 채로 RecastDemoContrib 복붙
SDL2 설치
데모 프로젝트를 켜보면 네비메쉬 생성 함수에서
친절하게 스탭별로 주석이 다 달려있음
네비 메쉬 생성
• Step 1. Initialize build config (몰라도 됨, 툴 GUI 셋팅)
• Step 2. 폴리곤 복셀화
Rasterize input polygon soup.
• Step 3. 이동 가능 표면 필터링
Filter walkables surfaces.
• Step 4. 표면 추리기 및 영역 분할
Partition walkable surface to simple regions.
• Step 5. 윤곽선 추출
Trace and simplify region contours.
• Step 6. 네비 메쉬 생성
Build polygons mesh from contours.
• Step 7. 네비 메쉬 디테일 조정
• Create detail mesh which allows to access approximate height on each polygon.
• (Optional) Step 8. Create Detour data from Recast poly mesh.
네비 메쉬 생성 요소
지형 메쉬정보(PNCT)를 기반으로 네비 메쉬 생성
Step 2. 폴리곤 복셀화
폴리곤의 기울기가 설정된 Agent Slope보다 높다면 제외 (절벽임)
전체 영역을 CellSize / CellHeight 크기의 직육면체로 분할 후
폴리곤이 걸쳐있다면 해당 직육면체 사용 (AABB 점 충돌)
Rasterize input polygon soup.
Step 3. 이동 가능 표면 필터링
복셀끼리의 높이차를 Agent MaxClimb와 비교
(다리길이 검사)
Filter walkables surfaces.
Agent Height에 따라 위&아래 사이를 지나갈 수 있는지 검사
(키높이 검사)
Step 4. 영역 분할
Partition walkable surface to simple regions.
복셀 정보로 영역화를 진행,
HeightField(Height Map)을 구성한다,
인접한 복셀끼리 서로이웃 추가 해줌
에이전트 너비 체크 및 영역(Region)을 분할한다.
분할 방식은 세가지를 지원하는데 각각 장단점이 있음
(속도x 디테일o) VS (디테일x 속도 o)
Watershed Monotone Layer
값에 따라 작은 영역을 큰 영역에 병합 시킴
Step 5. 윤곽선 추출
Trace and simplify region contours.
윤곽선(Contours) 즉 네비메쉬가 될 정점들을 찍는다
HeightField 정보를 기반으로 직접 윤곽선을 따라(Walk)가면서 정점을 찍음
Region 단위로, 이웃과 인접한 정점은 따로 기록해놈
처음에 뽑힌 정점들은 너무 디테일하기 때문에 직선으로 단순화시킨다.
Step 6. 네비 메쉬 생성
단순화된 윤곽선 추출 데이터를 기반으로 폴리곤 구성
단순화된 폴리곤이기 때문에 지형에 묻혀있는 모습
Step 7. 네비 메쉬 디테일 조정
만들어두었던 HeightFeild 및 원본 mesh를 참고하여 디테일 조절
Create detail mesh which allows to access approximate height on each polygon.
Create Detour data from Recast poly mesh.
Step 8. Detour용 길찾기 데이터 구성
언리얼이 Recast Detour 기반이긴 하지만
많이 개조된 부분이 Detour & TileCache
Tile이나 Detour쪽은 다음에 자세히
알아보는 것으루…
참고자료
• https://makga.tistory.com/288
• https://meistertj.tistory.com/2
• https://www.slideshare.net/KooKyeongWon/0903-recast
• 언리얼 공식 문서들
• https://www.youtube.com/watch?v=8-
4KzycX_9o&t=2153s&ab_channel=megayuchi
• http://digestingduck.blogspot.com/(라이브러리 개발자 블로그)