SlideShare uma empresa Scribd logo
1 de 114
넥슨 데브캣 스튜디오 프로젝트DH팀
심예람 (alleysark@nexon.co.kr)
자연스러운 용의 비행을 위한
공중 내비게이션 시스템 개발기
<프로젝트DH> AI 내비게이션 시스템
심예람 / 앨리삵 / alleysark
• 프로젝트DH 클라이언트 프로그래머
• 컴퓨터 그래픽스 전공
• 2년차 게임 개발자
프로젝트DH 소개
언리얼 엔진 4로 제작되고 있으며
사실적인 애니메이션을 추구합니다
잠깐, 용이라구요?
용은 걸을 수도, 날 수도 있습니다
그리고 굉장히 넓은 지역을 이동합니다
이 세션에서는,
“용의 자연스러운 공중 내비게이션을 위한
3차원 패스 파인딩 및 패스 팔로잉 시스템”
개발기를 소개합니다
이와 함께 언리얼 엔진 4 환경에서
내비게이션 시스템을 어떻게 확장했는지
간단히 소개 드립니다
문제 정의하기
디렉터 요구 사항
• “공중 길 찾기 기능이 필요합니다”
• “DH의 맵은 6km x 6km 정도 됩니다”
• “필요한 경우 기획자의 의도대로
가이드 가능했으면 좋겠습니다”
“무엇보다,
용처럼 날게 해주세요!”
• 도대체 용처럼 난다는 게 어떻게 난다는 거죠?
일단... 용이 어떻게 나는지
공부해 보았습니다
…
비행 방식에 따라 모션이 달라집니다
• 이륙, 착륙, 수직 상승, 활강, 뱅크턴, 급정지…
Dragon silhouette images from kisspng.com
지형 지물 혹은 상황에 따라
독특한 모션들을 보이기도 합니다
• 수직 강하
• 정지 비행
• 절벽을 따라 활강
• 독특한 착륙
• 스파이럴
공중에서의 방향 전환은
일정한 선회 반경 및 선회율을 유지합니다
• 공중 정지와 후진 비행이 가능합니다
• 하지만 속도를 무시한 채 급선회 할 수 없습니다
DH에서 요구하는 공중 내비게이션 시스템 정리
• 3차원 패스 파인딩 기능이 되어야 함
• 용의 움직임에 맞는 부드러운 경로를 생성함
• 비행중인 경로의 유형에 맞게 애니메이션이 반응함
• 생성되는 경로에 기획자의 의도가 반영될 수 있었으면 좋겠음
• 내비게이션을 위한 데이터가 크지 않아야 함
관련 연구 조사
Recast Navigation
• UE4에서 사용하는 내비게이션 시스템
• 지상 전용 내비게이션
• 내비게이션 메시를 기반으로 길을 찾음
• NDC2017 자료 참고
• <구형맵에서는 어떻게 길을 찾아야 하나요?
기초부터 이해하는 Recast 내비게이션 메시> 하지훈
http://masagroup.github.io/recastdetour/
Path Follow UE4 Plugin
스플라인 패스 팔로잉
• 매우 심플한 디자인
• 만들어진 스플라인 패스를 따라가게 해 줌
• 패스 파인딩 기능은 없음
https://www.unrealengine.com/marketplace/path-follow?sessionInvalidated=true
DoN AI Navigation
복셀 기반 3D 내비게이션
• 오픈소스 (MIT License)
• 일반적으로 생각하는 복셀 기반
내비게이션의 UE4 구현체
• 부드러운 곡선 경로 생성 불가
• 기획자의 의도를 반영하기 어려움
• 맵이 넓을 수록 복셀 데이터량 급증
http://www.drunkonnectar.com/3d-pathfinding-ue4/
Mike Roberts and Pat Hanrahan. 2016.
Generating Dynamically Feasible Trajectories
for Quadrotor Cameras. ACM Trans. Graph. 35, 4, (SIGGRAPH 2016)
드론 비행 경로 최적화 기법
• 드론의 물리적 비행 능력과 환경 요소를 고려한
경로 생성 어시스트
• 스플라인 기반의 경로 생성
• 실시간 경로 생성 기법은 아님
리뷰
• 기존의 지상 내비게이션을 공중 전용으로 확장하기는 어렵다
• 복셀 기반의 내비게이션은 생명체의 움직임을 표현하기엔 부적절하다
• 복셀 기반의 내비게이션 방식으로 어찌 표현한다 해도,
맵의 크기 때문에 복셀 데이터량 감당하기 어렵겠다
• 물리적 타당성에 너무 몰두하지는 말자
• 스플라인이 부드러운 경로를 표현하는 데 딱인데 다루기 까다롭다
스플라인 기반의 하늘 길 시스템
용을 위한 실크로드!
‘길’을 중심으로 자유롭게 비행 가능한 영역 정의
• 하늘 길이라 이름 붙였습니다
하늘 길을 기반으로
용의 실제 이동 경로를 생성
• 안전이 보장된 길을 중심으로 이동 경로를 구합니다
생성된 이동 경로를 선행하는 프로브
프로브를 쫓아가는 용
• 유연한 패스 팔로잉을 위해 완충장치를 두었습니다
url: demo_short
구성요소: 웨이포인트
• 하늘 길 고속도로의 IC역할
• 안전 반경을 기록
• 연결된 하늘 길 목록을 관리
구성요소: 하늘 길 도로
• 스플라인으로 제작
• 일정 간격마다 안전 반경을 기록
• 웨이포인트에 연결
구성요소: 프로브
• 최종 경로를 따라 가는 객체
• 전체 경로에 대한 분석 결과를 기록해 둬
용이 언제 어떻게 날아야 할 지를 결정함
• 용의 비행을 직접적으로 제어
이어서
• 하늘 길 시스템의 핵심 요소인 스플라인
• 하늘 길 시스템의 패스 파인딩 절차
• 하늘 길 시스템의 프로브 패스 팔로잉 절차
• UE4 내비게이션 시스템 확장
하늘 길 시스템의 핵심 요소: 스플라인 커브
• 복잡한 것 없이 핵심만 설명합니다!
Cubic Bézier Curve
• 부드러운 곡선을 표현하는 수단
• 연쇄적인 보간을 통해 시간 t에서의 위치를 결정
• Parametric curve
시간 t에서의 위치는 언제나 동일
Cubic Hermite Spline
• 2개의 점과 기울기로 곡선 조각을 표현
곡선 조각 = cubic hermite curve
• 점과 탄젠트의 시퀀스로 스플라인 곡선을 표현
• 각 점 𝑷에서 C1 연속
• 각 세그먼트를 cubic bézier curve로 변환 가능
𝑷 𝒏, 𝑷 𝒏 +
𝟏
𝟑
𝑻 𝒏, 𝑷 𝒏+𝟏 −
𝟏
𝟑
𝑻 𝒏+𝟏, 𝑷 𝒏+𝟏
연속성(continuity)
• 해석학에서 함수의 부드러운 정도(smoothness)를 설명하는 방법
• Parametric continuity / Geometric continuity
• 커브(곡선 혹은 곡면)의 부드러운 정도를 설명하는 방법
• 연속성의 수준(order)에 따라 매개변수적 혹은 기하학적 특징이 달라짐
연속성(continuity)
• Parametric continuity
• 𝑪−𝟏
: 커브가 끊어져 있음
• 𝑪 𝟎
: 커브가 연결되어 있음
• 𝑪 𝟏
: 1차 미분 가능, 보간 속도가 동일
• 𝑪 𝟐
: 2차 미분 가능, 보간 가속도가 동일
• 𝑪 𝒌
: k차 미분 가능
• Geometric continuity
• 𝑮 𝟎
: 커브가 점에서 만남
• 𝑮 𝟏
: 동일한 탄젠트를 공유함
• 𝑮 𝟐
: 동일한 곡률의 중점을 공유함
𝐶1
연속, 𝐺1
연속
𝐶1
연속 아님, 𝐺1
연속
느림
빠름
UE4 USplineComponent
• Cubic hermite curve 세그먼트로 이루어짐
• Arriving / Leaving Tangent
• 커브 연결점에서 전 후 탄젠트가 다를 수 있음
• C1 연속이 아닐 수 있음
• 보간 속도의 일관성을 보장하기 위해
reparameterization table을 만들어 둠
• 하늘 길은 USplineComponent의 코어인 FInterpCurve<> 템플릿 자료구조로 제작함
하늘 길 시스템 – 패스 파인딩
하늘 길 시스템 – 패스 팔로잉
언리얼 엔진 AI 시스템과 융합
패스 파인딩 절차
1. 출발/도착 지점에서 하늘 길로 임시 경로 연결
2. 그래프 최단 경로 탐색 수행
3. 들어오고 나가는 경로를 생성
4. 스무딩 및 최종 경로 스플라인 생성
출발 도착
출발/도착 지점에서 하늘 길 연결
• 출발/도착 지점은 하늘 길 밖에 있음
출발 도착
출발/도착 지점에서 하늘 길 연결
• 출발/도착 지점은 하늘 길 밖에 있음
• 이 위치에서 ‘보이는’ 하늘 길로의
임시 링크를 생성
출발 도착
하늘 길 그래프 최단 경로 탐색
• 임시 링크를 포함하여 그래프 탐색: A* search
출발 도착
하늘 길 그래프 최단 경로 탐색
• 임시 링크를 포함하여 그래프 탐색: A* search
• 하늘 길의 가중치를 달리 할 수 있음
들어오는 길, 나가는 길 생성
• 출발/도착 지점에서 하늘 길로의 연결은 ‘길’로써의 사용하기엔 미흡함
• 출발/도착 지점 속도와 진입/탈출 지점 속도를 고려한 길 생성 절차가 필요함
• 어떻게? 다시 길 찾기 문제?!
• 짧은 거리의 두 지점을 부드럽게 잇는 간단한 방법을 고안
두 지점 사이를 잇는 ‘합리적인’ 경로 생성
• 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용
두 지점 사이를 잇는 ‘합리적인’ 경로 생성
• 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용
• 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면
두 지점 사이를 잇는 ‘합리적인’ 경로 생성
• 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용
• 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면
• 극좌표상 일정 위치를 후보 지점으로 하고
두 지점 사이를 잇는 ‘합리적인’ 경로 생성
• 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용
• 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면
• 극좌표상 일정 위치를 후보 지점으로 하고
• 각 후보 지점의 선호도를 계산
두 지점 사이를 잇는 ‘합리적인’ 경로 생성
• 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용
• 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면
• 극좌표상 일정 위치를 후보 지점으로 하고
• 각 후보 지점의 선호도를 계산
• 높은 우선순위의 후보 지점부터 경로 유효성 검증
• 두 지점과 선택된 후보 지점을 거치는 스플라인 생성
들어오는 길, 나가는 길 생성
• 출발 지점 속도(용의 초기 속도), 진입점 탄젠트,
탈출점 탄젠트, 도착 지점 속도(목표 방향)
출발 도착
들어오는 길, 나가는 길 생성
• 출발 지점 속도(용의 초기 속도), 진입점 탄젠트,
탈출점 탄젠트, 도착 지점 속도(목표 방향)
• 임시로 연결한 직선 경로를 부드러운 경로로 대체
출발 도착
비포장 도로는 싫어요!
연결된 패스 스무딩하기
• 결과 경로 시퀀스에는 꺾인 지점들이 많음
출발 도착
비포장 도로는 싫어요!
연결된 패스 스무딩하기
• 결과 경로 시퀀스에는 꺾인 지점들이 많음
• 하늘 길의 안전 반경을 벗어나지 않는 선에서
전체적인 경로를 부드럽게 만들어야 함
출발 도착
비포장 도로는 싫어요!
연결된 패스 스무딩하기
• 결과 경로 시퀀스에는 꺾인 지점들이 많음
• 하늘 길의 안전 반경을 벗어나지 않는 선에서
전체적인 경로를 부드럽게 만들어야 함
• 용의 크기를 고려하여 스무딩 된 패스가
안전 반경을 벗어나지 않아야 함 출발 도착
패스 스무딩 과정
• 웨이포인트 였던 위치가 꺾이는 지점
패스 스무딩 과정
• 웨이포인트 였던 위치가 꺾이는 지점
• 꺾인 지점의 인접 세그먼트 위의
일정 거리상 위치를 샘플링
패스 스무딩 과정
• 웨이포인트 였던 위치가 꺾이는 지점
• 꺾인 지점의 인접 세그먼트 위의
일정 거리상 위치를 샘플링
• 각 지점 사이가 이어져도 안전반경 내에서
안전한지를 검사
패스 스무딩 과정
• 웨이포인트 였던 위치가 꺾이는 지점
• 꺾인 지점의 인접 세그먼트 위의
일정 거리상 위치를 샘플링
• 각 지점 사이가 이어져도 안전반경 내에서
안전한지를 검사
• 용의 크기를 고려할 때 이어도 안전한
가장 바깥쪽 두 샘플 포인트를 선정
패스 스무딩 과정
• 웨이포인트 였던 위치가 꺾이는 지점
• 꺾인 지점의 인접 세그먼트 위의
일정 거리상 위치를 샘플링
• 각 지점 사이가 이어져도 안전반경 내에서
안전한지를 검사
• 용의 크기를 고려할 때 이어도 안전한
가장 바깥쪽 두 샘플 포인트를 선정
패스 스무딩 과정
• 웨이포인트 였던 위치가 꺾이는 지점
• 꺾인 지점의 인접 세그먼트 위의
일정 거리상 위치를 샘플링
• 각 지점 사이가 이어져도 안전반경 내에서
안전한지를 검사
• 용의 크기를 고려할 때 이어도 안전한
가장 바깥쪽 두 샘플 포인트를 선정
• 두 지점 사이에 부드러운 곡선을 생성하여 연결
패스 스무딩: 두 지점의 탄젠트 조정
• 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음
패스 스무딩: 두 지점의 탄젠트 조정
• 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음
• 탄젠트 세그먼트들의 Closest point를 구하고
패스 스무딩: 두 지점의 탄젠트 조정
• 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음
• 탄젠트 세그먼트들의 Closest point를 구하고
• 해당 지점 까지 탄젠트를 클램프
패스 스무딩: 두 지점의 탄젠트 조정
• 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음
• 탄젠트 세그먼트들의 Closest point를 구하고
• 해당 지점 까지 탄젠트를 클램프
• 물론.. 단순 클램핑으로 해결되지 않는 케이스들도 많음
하늘 길 시스템 – 패스 파인딩
하늘 길 시스템 – 패스 팔로잉
언리얼 엔진 AI 시스템과 융합
스플라인 시간 t의 위치로 용 위치 갱신…?
• 스플라인을 단순히 따라가게 하면 용의 움직임이 단조로움
• Reparameterization 정밀도가 낮으면 일정한 속력으로 이동하지 못함
• 외력에 의한 경로 이탈을 제어하기 힘듦
• 공격받았을 때, 장애물(다이내믹 오브젝트)에 부딪쳤을 때…
용보다 앞서 움직이는 프로브,
프로브를 따라가는 용
• 프로브는 스플라인 위를 정직하게 이동
• 용은 프로브를 향해서 날아감
• 프로브는 용이 뒤쳐지거나 앞서지 않도록
속도를 제어함
• 프로브는 용의 패스 팔로잉 로직의 완충 장치
http://www.damentrading.com/en/buy-a-ship/06920-tugboat
프로브를 따라 나는 용… 어떻게?
• ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음
• 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨
프로브를 따라 나는 용… 어떻게?
• ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음
• 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨
• 전체 패스를 분석하여 일정한 기준으로 구간을 나눔
프로브를 따라 나는 용… 어떻게?
• ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음
• 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨
• 전체 패스를 분석하여 일정한 기준으로 구간을 나눔
• 각 구간의 최대/최소 속력, 선회 속력, 롤링 등을 분석
프로브를 따라 나는 용… 어떻게?
• ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음
• 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨
• 전체 패스를 분석하여 일정한 기준으로 구간을 나눔
• 각 구간의 최대/최소 속력, 선회 속력, 롤링 등을 분석
• 구간 별 모션 유형을 결정
패스 분석: 선형 속도 변화
• 경로의 Z성분 극점을 기준으로
선형 속도에 유의미한 변화가 발생함
• 1차 도함수 극점: 기울기 - → + 혹은 + → -
• 2차 도함수 극점: 기울기 변화량,
즉 변곡점(inflection point)
A
B
C
A
B
C
A
B
C
패스 분석: 선형 속도 변화
• 하강하다 다시 상승하는 구간으로 예를 들면,
• A → B 구간 점진적으로 속력 줄어듦
• B → C 구간은 속력이 더 이상 줄 수 없어
고도 상승을 위한 날갯짓 시작
• 물리적으로 타당한 것은 아니지만
결과가 나쁘지는 않다
패스 분석: 극점(extremity) 계산
• Cubic Hermite curve: 3차 다항식
𝑪𝒖𝒓𝒗𝒆 𝒙 = 𝟐𝑷 𝟎 + 𝑻 𝟎 + 𝑻 𝟏 − 𝟐𝑷 𝟏 𝒙 𝟑
+ −𝟑𝑷 𝟎 − 𝟐𝑻 𝟎 − 𝑻 𝟏 + 𝟑𝑷 𝟏 𝒙 𝟐
+ 𝑻 𝟎 𝒙 + 𝑷 𝟎
𝑪𝒖𝒓𝒗𝒆′
𝒙 = 𝟔𝑷 𝟎 + 𝟑𝑻 𝟎 + 𝟑𝑻 𝟏 − 𝟔𝑷 𝟏 𝒙 𝟐
+ −𝟔𝑷 𝟎 − 𝟒𝑻 𝟎 − 𝟐𝑻 𝟏 + 𝟔𝑷 𝟏 𝒙 + 𝑻 𝟎
𝑪𝒖𝒓𝒗𝒆′′
𝒙 = 𝟏𝟐𝑷 𝟎 + 𝟔𝑻 𝟎 + 𝟔𝑻 𝟏 − 𝟏𝟐𝑷 𝟏 𝒙 + −𝟔𝑷 𝟎 − 𝟒𝑻 𝟎 − 𝟐𝑻 𝟏 + 𝟔𝑷 𝟏
• 3차원 벡터의 수직 성분에 대해서만 계산 𝑪𝒖𝒓𝒗𝒆′
𝒙 = 𝟎 𝒘𝒉𝒆𝒏 𝒙 =
−𝒃 ± 𝒃 𝟐 − 𝟒𝒂𝒄
𝟐𝒂
𝑪𝒖𝒓𝒗𝒆′′
𝒙 = 𝟎 𝒘𝒉𝒆𝒏 𝒙 =
−𝒃
𝒂
잠깐! 2차 미분이라뇨,
Hermite Spline은 C2 연속이 아닌걸요?!
• 연결 지점의 Arrive/Leave 탄젠트를 맞췄다 해도
C2 연속을 보장할 수 없음
• 심지어 패스 스무딩 등의 과정을 거치며 C1 연속이 아닐 수도 있음
• 그래서 커브의 연결 지점은 패스 구분을 위한 포인트로 강제함
• CAD 툴을 만드는 게 아니니 적당히 넘어가도 괜찮습니다 ㅎㅎ..
C1 연속인 연결점
C2 연속인 연결점
패스 분석: 선회 속도 변화
• 선회란 항공기가 곡선을 그리듯 진로를 바꾸는 것
• 빠른 선회를 위해 양력이 선회 반경의 중심 쪽을
향할 수 있도록 몸을 틀어줘야 함
• 뱅크 턴(bank turn)이라고 부르는 공중 기동 기법
• 속력이 일정할 때 선회 반경이 작아지면 선회율 상승
• 선회 반경은 수평 곡률에 반비례
• 즉, 수평 곡률 상승 → Bank Angle 상승
https://www.quora.com/What-is-the-relationship-between-turn-rate-and-g-force-when-an-aircraft-turns
패스 분석: 수평 곡률(curvature) 계산
• 곡률은 굽은 정도를 표현하는 수치:
𝑪 𝒕 = (𝒙 𝒕 , 𝒚 𝒕 ), 𝜿 =
𝟏
𝒓
=
𝒙′ 𝒚′′−𝒚′ 𝒙′′
𝒙′𝟐+𝒚′𝟐 𝟑/𝟐
• 수직 성분인 XY 컴포넌트에 대해 계산
• 패스의 곡률이 큰 지점일 수록 선회 반경이 작음
• 수평 곡률에 따라 bank angle에 해당되는
롤(roll) 회전 요소 계산
𝒓
패스 팔로잉: 프로브 제어
• 프로브는 용과 적정 거리를 유지하며 스플라인 위를 움직여야 함
• 일정 속력을 유지하되 용과의 거리가 가까워지면 속력을 높이고,
거리가 멀어지면 속력을 늦춤
패스 팔로잉: 용 움직임 제어
• 프로브의 현재 구간 유형을 확인
• 현재 위치의 기울기로 가속력, 속력 계산
• 프로브로의 방향으로 속력 만큼 이동 거리 𝚫𝐩 계산
패스 팔로잉: 용 움직임 제어
• 프로브의 현재 구간 유형을 확인
• 현재 위치의 기울기로 가속력, 속력 계산
• 프로브로의 방향으로 속력 만큼 이동 거리 𝚫𝐩 계산
• 용을 프로브로의 방향으로 정렬하기 위한 회전 속력 계산
• 현재 위치의 롤(roll) 회전 요소를 누적
• 최종 회전 속력 만큼 회전 값 𝚫𝐑 계산
패스 팔로잉: 용 움직임 제어
• 프로브의 현재 구간 유형을 확인
• 현재 위치의 기울기로 가속력, 속력 계산
• 프로브로의 방향으로 속력 만큼 이동 거리 𝚫𝐩 계산
• 용을 프로브로의 방향으로 정렬하기 위한 회전 속력 계산
• 현재 위치의 롤(roll) 회전 요소를 누적
• 최종 회전 속력 만큼 회전 값 𝚫𝐑 계산
• 용 객체의 위치 / 회전 갱신
패스 팔로잉: 용 움직임 제어
• 패스 유형이 바뀌는 시점을 용 객체에게 통지
• 용 객체는 실버바인 모션 엔진을 통해 적절한 로코모션 재생
• 비행 로코모션 연구는 WIP!!
경로 재탐색 전략: Pruning & Grafting
• AI 내비게이션 대상은 움직이는 물체인 경우가 많음
• 타겟이 이동한 경우 패스의 갱신이 필요함
경로 재탐색 전략: Pruning & Grafting
• AI 내비게이션 대상은 움직이는 물체인 경우가 많음
• 타겟이 이동한 경우 패스의 갱신이 필요함
• 패스의 적당한 지점을 찾아 잘라 냄 (pruning)
경로 재탐색 전략: Pruning & Grafting
• AI 내비게이션 대상은 움직이는 물체인 경우가 많음
• 타겟이 이동한 경우 패스의 갱신이 필요함
• 패스의 적당한 지점을 찾아 잘라 냄 (pruning)
• 해당 지점의 위치와 탄젠트를 유지한 채 타겟 위치로 패스 파인딩
• 새 경로를 기존 경로에 접붙이기 (grafting)
요약
• 패스 파인딩
• 출발/도착 지점에서 하늘길로 임시 경로 연결
• 그래프 탐색
• 부드럽게 들어오는 길, 나가는 길을 생성
• 전체 경로 스무딩
• 패스 팔로잉
• 비행 유형별로 구간을 나눔
• 프로브의 위치를 갱신
• 용의 위치 및 회전, 그리고 모션을 갱신
• 필요한 경우 경로 재탐색
하늘 길 시스템 – 패스 파인딩
하늘 길 시스템 – 패스 팔로잉
언리얼 엔진 AI 시스템과 융합
UE4 내비게이션 흐름
AIController
MoveTo
NavigationSystem
FindPathSync
NavigationData
(RecastNavMesh)
FindPath
PathFollowingComponent
RequestMove NavPathSharedPtr
패스 파인딩
패스 팔로잉
UpdatePathSegment
FollowPathSegment
AIController 확장
• AI 에이전트 관리 주체
• MoveTo 기능과 유사하게 FlyingMoveTo 요청 구현
• 하늘 길 시스템을 통해 실질적인 공중 패스 파인딩 수행
• Path Following Component 교체
PathFollowingComponent 확장
• UE4가 제공하는 AI 에이전트 패스 세그먼트 팔로우 제어 컴포넌트
• 지상 이동은 기존대로 동작
• 공중 이동 요청의 경우 프로브의 Update / Follow 로직으로 대체
공중 내비게이션 흐름
DhAIController
FlyingMoveTo
FlightPathSystem
FindPathSync
FlightPathData
DhPathFollowingComponent
RequestFlyingMove FlightPathProbePtr
UpdateFlightPathProbe
FollowFlightPathProbe
결과
데모 영상 – 용 시점
url: demo_dragon_view
데모 영상 – 하늘 뷰
url: demo_sky_view
데모 영상 – 경로 재탐색
url: demo_repath
하늘 길 에디터 툴
• 언리얼 엔진 에디터에서 사용
• 스플라인으로 경로를 쉽게 변형 가능
• 안전 반경을 재계산해줌
• 설치까지 자동화 한다면 좋겠지만…
비용?
• 자세한 프로파일링과 최적화 작업 전
• 그렇지만, 게임 플레이에 영향 주지 않는 수준의 퍼포먼스
• 비싼 부분
• 스플라인의 잦은 생성과 파괴
• 레이 트레이스, 캡슐 오버랩 테스트
• 최적화 대상!!
미 구현 사항 및 향후 계획
• 용의 날갯짓에 맞게 용 움직임 제어
• 물리 법칙에 맞게 용 움직임 제어
• 스플라인 오프세팅(offsetting)
• 비동기 패스 파인딩
• 복셀 기반 패스 파인딩 하이브리드?
개발하며
• 연구와 실전 개발은 많이 다르구나
• 설계 시 고려하지 못한 코너 케이스들의 향연
• 역사가 깊은 AI 내비게이션, 아직까지 실버 불릿은 없는 것인가..
• 더 잘 만들고픈 욕심과 현실적 한계 사이에서 균형 잡기
감사합니다
Q & A

Mais conteúdo relacionado

Mais procurados

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다Lee Dustin
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술henjeon
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자TonyCms
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법강 민우
 
전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017
전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017
전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)Bongseok Cho
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019devCAT Studio, NEXON
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1Hong-Gi Joe
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략YEONG-CHEON YOU
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기YEONG-CHEON YOU
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.Wuwon Yu
 

Mais procurados (20)

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술Ndc2010 전형규   마비노기2 캐릭터 렌더링 기술
Ndc2010 전형규 마비노기2 캐릭터 렌더링 기술
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017
전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017
전형규, 프로젝트DH의 절차적 애니메이션 시스템, NDC2017
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.언리얼4 플레이어 컨트롤러의 이해.
언리얼4 플레이어 컨트롤러의 이해.
 

Semelhante a 심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018

[Gpg2권 박민근] 2.5 평행 수송 프레임
[Gpg2권 박민근] 2.5 평행 수송 프레임[Gpg2권 박민근] 2.5 평행 수송 프레임
[Gpg2권 박민근] 2.5 평행 수송 프레임MinGeun Park
 
프로그래머를 위한 360VR
프로그래머를 위한 360VR프로그래머를 위한 360VR
프로그래머를 위한 360VRyorung
 
Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseYEONG-CHEON YOU
 
10_무한 평면과 놀기
10_무한 평면과 놀기10_무한 평면과 놀기
10_무한 평면과 놀기noerror
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018devCAT Studio, NEXON
 
Programming game ai
Programming game aiProgramming game ai
Programming game aiguest136767
 

Semelhante a 심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018 (7)

[Gpg2권 박민근] 2.5 평행 수송 프레임
[Gpg2권 박민근] 2.5 평행 수송 프레임[Gpg2권 박민근] 2.5 평행 수송 프레임
[Gpg2권 박민근] 2.5 평행 수송 프레임
 
Picking
PickingPicking
Picking
 
프로그래머를 위한 360VR
프로그래머를 위한 360VR프로그래머를 위한 360VR
프로그래머를 위한 360VR
 
Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelase
 
10_무한 평면과 놀기
10_무한 평면과 놀기10_무한 평면과 놀기
10_무한 평면과 놀기
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
 
Programming game ai
Programming game aiProgramming game ai
Programming game ai
 

Mais de devCAT Studio, NEXON

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019devCAT Studio, NEXON
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019devCAT Studio, NEXON
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019devCAT Studio, NEXON
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019devCAT Studio, NEXON
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019devCAT Studio, NEXON
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019devCAT Studio, NEXON
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018devCAT Studio, NEXON
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018devCAT Studio, NEXON
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018devCAT Studio, NEXON
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012devCAT Studio, NEXON
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011devCAT Studio, NEXON
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010devCAT Studio, NEXON
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017devCAT Studio, NEXON
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017devCAT Studio, NEXON
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017devCAT Studio, NEXON
 

Mais de devCAT Studio, NEXON (20)

김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #2, NDC2017
 
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
이승재, 강성훈, 내가 만든 언어의 개발환경을 Visual Studio Code로 빠르고 쉽게 구축하기 #1, NDC2017
 

심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018

  • 1. 넥슨 데브캣 스튜디오 프로젝트DH팀 심예람 (alleysark@nexon.co.kr) 자연스러운 용의 비행을 위한 공중 내비게이션 시스템 개발기 <프로젝트DH> AI 내비게이션 시스템
  • 2. 심예람 / 앨리삵 / alleysark • 프로젝트DH 클라이언트 프로그래머 • 컴퓨터 그래픽스 전공 • 2년차 게임 개발자
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10. 언리얼 엔진 4로 제작되고 있으며
  • 13. 용은 걸을 수도, 날 수도 있습니다
  • 14. 그리고 굉장히 넓은 지역을 이동합니다
  • 15. 이 세션에서는, “용의 자연스러운 공중 내비게이션을 위한 3차원 패스 파인딩 및 패스 팔로잉 시스템” 개발기를 소개합니다
  • 16. 이와 함께 언리얼 엔진 4 환경에서 내비게이션 시스템을 어떻게 확장했는지 간단히 소개 드립니다
  • 18. 디렉터 요구 사항 • “공중 길 찾기 기능이 필요합니다” • “DH의 맵은 6km x 6km 정도 됩니다” • “필요한 경우 기획자의 의도대로 가이드 가능했으면 좋겠습니다”
  • 19. “무엇보다, 용처럼 날게 해주세요!” • 도대체 용처럼 난다는 게 어떻게 난다는 거죠?
  • 20. 일단... 용이 어떻게 나는지 공부해 보았습니다 …
  • 21. 비행 방식에 따라 모션이 달라집니다 • 이륙, 착륙, 수직 상승, 활강, 뱅크턴, 급정지… Dragon silhouette images from kisspng.com
  • 22. 지형 지물 혹은 상황에 따라 독특한 모션들을 보이기도 합니다 • 수직 강하 • 정지 비행 • 절벽을 따라 활강 • 독특한 착륙 • 스파이럴
  • 23. 공중에서의 방향 전환은 일정한 선회 반경 및 선회율을 유지합니다 • 공중 정지와 후진 비행이 가능합니다 • 하지만 속도를 무시한 채 급선회 할 수 없습니다
  • 24. DH에서 요구하는 공중 내비게이션 시스템 정리 • 3차원 패스 파인딩 기능이 되어야 함 • 용의 움직임에 맞는 부드러운 경로를 생성함 • 비행중인 경로의 유형에 맞게 애니메이션이 반응함 • 생성되는 경로에 기획자의 의도가 반영될 수 있었으면 좋겠음 • 내비게이션을 위한 데이터가 크지 않아야 함
  • 26. Recast Navigation • UE4에서 사용하는 내비게이션 시스템 • 지상 전용 내비게이션 • 내비게이션 메시를 기반으로 길을 찾음 • NDC2017 자료 참고 • <구형맵에서는 어떻게 길을 찾아야 하나요? 기초부터 이해하는 Recast 내비게이션 메시> 하지훈 http://masagroup.github.io/recastdetour/
  • 27. Path Follow UE4 Plugin 스플라인 패스 팔로잉 • 매우 심플한 디자인 • 만들어진 스플라인 패스를 따라가게 해 줌 • 패스 파인딩 기능은 없음 https://www.unrealengine.com/marketplace/path-follow?sessionInvalidated=true
  • 28. DoN AI Navigation 복셀 기반 3D 내비게이션 • 오픈소스 (MIT License) • 일반적으로 생각하는 복셀 기반 내비게이션의 UE4 구현체 • 부드러운 곡선 경로 생성 불가 • 기획자의 의도를 반영하기 어려움 • 맵이 넓을 수록 복셀 데이터량 급증 http://www.drunkonnectar.com/3d-pathfinding-ue4/
  • 29. Mike Roberts and Pat Hanrahan. 2016. Generating Dynamically Feasible Trajectories for Quadrotor Cameras. ACM Trans. Graph. 35, 4, (SIGGRAPH 2016) 드론 비행 경로 최적화 기법 • 드론의 물리적 비행 능력과 환경 요소를 고려한 경로 생성 어시스트 • 스플라인 기반의 경로 생성 • 실시간 경로 생성 기법은 아님
  • 30. 리뷰 • 기존의 지상 내비게이션을 공중 전용으로 확장하기는 어렵다 • 복셀 기반의 내비게이션은 생명체의 움직임을 표현하기엔 부적절하다 • 복셀 기반의 내비게이션 방식으로 어찌 표현한다 해도, 맵의 크기 때문에 복셀 데이터량 감당하기 어렵겠다 • 물리적 타당성에 너무 몰두하지는 말자 • 스플라인이 부드러운 경로를 표현하는 데 딱인데 다루기 까다롭다
  • 32. 용을 위한 실크로드! ‘길’을 중심으로 자유롭게 비행 가능한 영역 정의 • 하늘 길이라 이름 붙였습니다
  • 33. 하늘 길을 기반으로 용의 실제 이동 경로를 생성 • 안전이 보장된 길을 중심으로 이동 경로를 구합니다
  • 34. 생성된 이동 경로를 선행하는 프로브 프로브를 쫓아가는 용 • 유연한 패스 팔로잉을 위해 완충장치를 두었습니다
  • 36. 구성요소: 웨이포인트 • 하늘 길 고속도로의 IC역할 • 안전 반경을 기록 • 연결된 하늘 길 목록을 관리
  • 37. 구성요소: 하늘 길 도로 • 스플라인으로 제작 • 일정 간격마다 안전 반경을 기록 • 웨이포인트에 연결
  • 38. 구성요소: 프로브 • 최종 경로를 따라 가는 객체 • 전체 경로에 대한 분석 결과를 기록해 둬 용이 언제 어떻게 날아야 할 지를 결정함 • 용의 비행을 직접적으로 제어
  • 39. 이어서 • 하늘 길 시스템의 핵심 요소인 스플라인 • 하늘 길 시스템의 패스 파인딩 절차 • 하늘 길 시스템의 프로브 패스 팔로잉 절차 • UE4 내비게이션 시스템 확장
  • 40. 하늘 길 시스템의 핵심 요소: 스플라인 커브 • 복잡한 것 없이 핵심만 설명합니다!
  • 41. Cubic Bézier Curve • 부드러운 곡선을 표현하는 수단 • 연쇄적인 보간을 통해 시간 t에서의 위치를 결정 • Parametric curve 시간 t에서의 위치는 언제나 동일
  • 42. Cubic Hermite Spline • 2개의 점과 기울기로 곡선 조각을 표현 곡선 조각 = cubic hermite curve • 점과 탄젠트의 시퀀스로 스플라인 곡선을 표현 • 각 점 𝑷에서 C1 연속 • 각 세그먼트를 cubic bézier curve로 변환 가능 𝑷 𝒏, 𝑷 𝒏 + 𝟏 𝟑 𝑻 𝒏, 𝑷 𝒏+𝟏 − 𝟏 𝟑 𝑻 𝒏+𝟏, 𝑷 𝒏+𝟏
  • 43. 연속성(continuity) • 해석학에서 함수의 부드러운 정도(smoothness)를 설명하는 방법 • Parametric continuity / Geometric continuity • 커브(곡선 혹은 곡면)의 부드러운 정도를 설명하는 방법 • 연속성의 수준(order)에 따라 매개변수적 혹은 기하학적 특징이 달라짐
  • 44. 연속성(continuity) • Parametric continuity • 𝑪−𝟏 : 커브가 끊어져 있음 • 𝑪 𝟎 : 커브가 연결되어 있음 • 𝑪 𝟏 : 1차 미분 가능, 보간 속도가 동일 • 𝑪 𝟐 : 2차 미분 가능, 보간 가속도가 동일 • 𝑪 𝒌 : k차 미분 가능 • Geometric continuity • 𝑮 𝟎 : 커브가 점에서 만남 • 𝑮 𝟏 : 동일한 탄젠트를 공유함 • 𝑮 𝟐 : 동일한 곡률의 중점을 공유함 𝐶1 연속, 𝐺1 연속 𝐶1 연속 아님, 𝐺1 연속 느림 빠름
  • 45. UE4 USplineComponent • Cubic hermite curve 세그먼트로 이루어짐 • Arriving / Leaving Tangent • 커브 연결점에서 전 후 탄젠트가 다를 수 있음 • C1 연속이 아닐 수 있음 • 보간 속도의 일관성을 보장하기 위해 reparameterization table을 만들어 둠 • 하늘 길은 USplineComponent의 코어인 FInterpCurve<> 템플릿 자료구조로 제작함
  • 46. 하늘 길 시스템 – 패스 파인딩 하늘 길 시스템 – 패스 팔로잉 언리얼 엔진 AI 시스템과 융합
  • 47. 패스 파인딩 절차 1. 출발/도착 지점에서 하늘 길로 임시 경로 연결 2. 그래프 최단 경로 탐색 수행 3. 들어오고 나가는 경로를 생성 4. 스무딩 및 최종 경로 스플라인 생성
  • 48. 출발 도착 출발/도착 지점에서 하늘 길 연결 • 출발/도착 지점은 하늘 길 밖에 있음
  • 49. 출발 도착 출발/도착 지점에서 하늘 길 연결 • 출발/도착 지점은 하늘 길 밖에 있음 • 이 위치에서 ‘보이는’ 하늘 길로의 임시 링크를 생성
  • 50.
  • 51. 출발 도착 하늘 길 그래프 최단 경로 탐색 • 임시 링크를 포함하여 그래프 탐색: A* search
  • 52. 출발 도착 하늘 길 그래프 최단 경로 탐색 • 임시 링크를 포함하여 그래프 탐색: A* search • 하늘 길의 가중치를 달리 할 수 있음
  • 53. 들어오는 길, 나가는 길 생성 • 출발/도착 지점에서 하늘 길로의 연결은 ‘길’로써의 사용하기엔 미흡함 • 출발/도착 지점 속도와 진입/탈출 지점 속도를 고려한 길 생성 절차가 필요함 • 어떻게? 다시 길 찾기 문제?! • 짧은 거리의 두 지점을 부드럽게 잇는 간단한 방법을 고안
  • 54. 두 지점 사이를 잇는 ‘합리적인’ 경로 생성 • 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용
  • 55. 두 지점 사이를 잇는 ‘합리적인’ 경로 생성 • 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용 • 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면
  • 56. 두 지점 사이를 잇는 ‘합리적인’ 경로 생성 • 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용 • 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면 • 극좌표상 일정 위치를 후보 지점으로 하고
  • 57. 두 지점 사이를 잇는 ‘합리적인’ 경로 생성 • 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용 • 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면 • 극좌표상 일정 위치를 후보 지점으로 하고 • 각 후보 지점의 선호도를 계산
  • 58. 두 지점 사이를 잇는 ‘합리적인’ 경로 생성 • 각 지점의 탄젠트 위치를 이은 선분을 후보 공간 축으로 사용 • 후보 공간 축의 가운데 지점을 지나는 평면이 후보 공간 평면 • 극좌표상 일정 위치를 후보 지점으로 하고 • 각 후보 지점의 선호도를 계산 • 높은 우선순위의 후보 지점부터 경로 유효성 검증 • 두 지점과 선택된 후보 지점을 거치는 스플라인 생성
  • 59. 들어오는 길, 나가는 길 생성 • 출발 지점 속도(용의 초기 속도), 진입점 탄젠트, 탈출점 탄젠트, 도착 지점 속도(목표 방향) 출발 도착
  • 60. 들어오는 길, 나가는 길 생성 • 출발 지점 속도(용의 초기 속도), 진입점 탄젠트, 탈출점 탄젠트, 도착 지점 속도(목표 방향) • 임시로 연결한 직선 경로를 부드러운 경로로 대체 출발 도착
  • 61.
  • 62. 비포장 도로는 싫어요! 연결된 패스 스무딩하기 • 결과 경로 시퀀스에는 꺾인 지점들이 많음 출발 도착
  • 63. 비포장 도로는 싫어요! 연결된 패스 스무딩하기 • 결과 경로 시퀀스에는 꺾인 지점들이 많음 • 하늘 길의 안전 반경을 벗어나지 않는 선에서 전체적인 경로를 부드럽게 만들어야 함 출발 도착
  • 64. 비포장 도로는 싫어요! 연결된 패스 스무딩하기 • 결과 경로 시퀀스에는 꺾인 지점들이 많음 • 하늘 길의 안전 반경을 벗어나지 않는 선에서 전체적인 경로를 부드럽게 만들어야 함 • 용의 크기를 고려하여 스무딩 된 패스가 안전 반경을 벗어나지 않아야 함 출발 도착
  • 65. 패스 스무딩 과정 • 웨이포인트 였던 위치가 꺾이는 지점
  • 66. 패스 스무딩 과정 • 웨이포인트 였던 위치가 꺾이는 지점 • 꺾인 지점의 인접 세그먼트 위의 일정 거리상 위치를 샘플링
  • 67. 패스 스무딩 과정 • 웨이포인트 였던 위치가 꺾이는 지점 • 꺾인 지점의 인접 세그먼트 위의 일정 거리상 위치를 샘플링 • 각 지점 사이가 이어져도 안전반경 내에서 안전한지를 검사
  • 68. 패스 스무딩 과정 • 웨이포인트 였던 위치가 꺾이는 지점 • 꺾인 지점의 인접 세그먼트 위의 일정 거리상 위치를 샘플링 • 각 지점 사이가 이어져도 안전반경 내에서 안전한지를 검사 • 용의 크기를 고려할 때 이어도 안전한 가장 바깥쪽 두 샘플 포인트를 선정
  • 69. 패스 스무딩 과정 • 웨이포인트 였던 위치가 꺾이는 지점 • 꺾인 지점의 인접 세그먼트 위의 일정 거리상 위치를 샘플링 • 각 지점 사이가 이어져도 안전반경 내에서 안전한지를 검사 • 용의 크기를 고려할 때 이어도 안전한 가장 바깥쪽 두 샘플 포인트를 선정
  • 70. 패스 스무딩 과정 • 웨이포인트 였던 위치가 꺾이는 지점 • 꺾인 지점의 인접 세그먼트 위의 일정 거리상 위치를 샘플링 • 각 지점 사이가 이어져도 안전반경 내에서 안전한지를 검사 • 용의 크기를 고려할 때 이어도 안전한 가장 바깥쪽 두 샘플 포인트를 선정 • 두 지점 사이에 부드러운 곡선을 생성하여 연결
  • 71. 패스 스무딩: 두 지점의 탄젠트 조정 • 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음
  • 72. 패스 스무딩: 두 지점의 탄젠트 조정 • 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음 • 탄젠트 세그먼트들의 Closest point를 구하고
  • 73. 패스 스무딩: 두 지점의 탄젠트 조정 • 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음 • 탄젠트 세그먼트들의 Closest point를 구하고 • 해당 지점 까지 탄젠트를 클램프
  • 74. 패스 스무딩: 두 지점의 탄젠트 조정 • 두 지점의 탄젠트를 그대로 쓰면 스플라인이 꼬일 수 있음 • 탄젠트 세그먼트들의 Closest point를 구하고 • 해당 지점 까지 탄젠트를 클램프 • 물론.. 단순 클램핑으로 해결되지 않는 케이스들도 많음
  • 75.
  • 76.
  • 77. 하늘 길 시스템 – 패스 파인딩 하늘 길 시스템 – 패스 팔로잉 언리얼 엔진 AI 시스템과 융합
  • 78. 스플라인 시간 t의 위치로 용 위치 갱신…? • 스플라인을 단순히 따라가게 하면 용의 움직임이 단조로움 • Reparameterization 정밀도가 낮으면 일정한 속력으로 이동하지 못함 • 외력에 의한 경로 이탈을 제어하기 힘듦 • 공격받았을 때, 장애물(다이내믹 오브젝트)에 부딪쳤을 때…
  • 79. 용보다 앞서 움직이는 프로브, 프로브를 따라가는 용 • 프로브는 스플라인 위를 정직하게 이동 • 용은 프로브를 향해서 날아감 • 프로브는 용이 뒤쳐지거나 앞서지 않도록 속도를 제어함 • 프로브는 용의 패스 팔로잉 로직의 완충 장치 http://www.damentrading.com/en/buy-a-ship/06920-tugboat
  • 80. 프로브를 따라 나는 용… 어떻게? • ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음 • 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨
  • 81. 프로브를 따라 나는 용… 어떻게? • ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음 • 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨 • 전체 패스를 분석하여 일정한 기준으로 구간을 나눔
  • 82. 프로브를 따라 나는 용… 어떻게? • ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음 • 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨 • 전체 패스를 분석하여 일정한 기준으로 구간을 나눔 • 각 구간의 최대/최소 속력, 선회 속력, 롤링 등을 분석
  • 83. 프로브를 따라 나는 용… 어떻게? • ‘어떻게’ 비행하는가에 대한 의문은 여전히 남음 • 용의 비행 유형은 선형 속도와 회전 속도의 변화로 결정됨 • 전체 패스를 분석하여 일정한 기준으로 구간을 나눔 • 각 구간의 최대/최소 속력, 선회 속력, 롤링 등을 분석 • 구간 별 모션 유형을 결정
  • 84. 패스 분석: 선형 속도 변화 • 경로의 Z성분 극점을 기준으로 선형 속도에 유의미한 변화가 발생함 • 1차 도함수 극점: 기울기 - → + 혹은 + → - • 2차 도함수 극점: 기울기 변화량, 즉 변곡점(inflection point)
  • 85. A B C A B C A B C 패스 분석: 선형 속도 변화 • 하강하다 다시 상승하는 구간으로 예를 들면, • A → B 구간 점진적으로 속력 줄어듦 • B → C 구간은 속력이 더 이상 줄 수 없어 고도 상승을 위한 날갯짓 시작 • 물리적으로 타당한 것은 아니지만 결과가 나쁘지는 않다
  • 86. 패스 분석: 극점(extremity) 계산 • Cubic Hermite curve: 3차 다항식 𝑪𝒖𝒓𝒗𝒆 𝒙 = 𝟐𝑷 𝟎 + 𝑻 𝟎 + 𝑻 𝟏 − 𝟐𝑷 𝟏 𝒙 𝟑 + −𝟑𝑷 𝟎 − 𝟐𝑻 𝟎 − 𝑻 𝟏 + 𝟑𝑷 𝟏 𝒙 𝟐 + 𝑻 𝟎 𝒙 + 𝑷 𝟎 𝑪𝒖𝒓𝒗𝒆′ 𝒙 = 𝟔𝑷 𝟎 + 𝟑𝑻 𝟎 + 𝟑𝑻 𝟏 − 𝟔𝑷 𝟏 𝒙 𝟐 + −𝟔𝑷 𝟎 − 𝟒𝑻 𝟎 − 𝟐𝑻 𝟏 + 𝟔𝑷 𝟏 𝒙 + 𝑻 𝟎 𝑪𝒖𝒓𝒗𝒆′′ 𝒙 = 𝟏𝟐𝑷 𝟎 + 𝟔𝑻 𝟎 + 𝟔𝑻 𝟏 − 𝟏𝟐𝑷 𝟏 𝒙 + −𝟔𝑷 𝟎 − 𝟒𝑻 𝟎 − 𝟐𝑻 𝟏 + 𝟔𝑷 𝟏 • 3차원 벡터의 수직 성분에 대해서만 계산 𝑪𝒖𝒓𝒗𝒆′ 𝒙 = 𝟎 𝒘𝒉𝒆𝒏 𝒙 = −𝒃 ± 𝒃 𝟐 − 𝟒𝒂𝒄 𝟐𝒂 𝑪𝒖𝒓𝒗𝒆′′ 𝒙 = 𝟎 𝒘𝒉𝒆𝒏 𝒙 = −𝒃 𝒂
  • 87. 잠깐! 2차 미분이라뇨, Hermite Spline은 C2 연속이 아닌걸요?! • 연결 지점의 Arrive/Leave 탄젠트를 맞췄다 해도 C2 연속을 보장할 수 없음 • 심지어 패스 스무딩 등의 과정을 거치며 C1 연속이 아닐 수도 있음 • 그래서 커브의 연결 지점은 패스 구분을 위한 포인트로 강제함 • CAD 툴을 만드는 게 아니니 적당히 넘어가도 괜찮습니다 ㅎㅎ.. C1 연속인 연결점 C2 연속인 연결점
  • 88. 패스 분석: 선회 속도 변화 • 선회란 항공기가 곡선을 그리듯 진로를 바꾸는 것 • 빠른 선회를 위해 양력이 선회 반경의 중심 쪽을 향할 수 있도록 몸을 틀어줘야 함 • 뱅크 턴(bank turn)이라고 부르는 공중 기동 기법 • 속력이 일정할 때 선회 반경이 작아지면 선회율 상승 • 선회 반경은 수평 곡률에 반비례 • 즉, 수평 곡률 상승 → Bank Angle 상승 https://www.quora.com/What-is-the-relationship-between-turn-rate-and-g-force-when-an-aircraft-turns
  • 89. 패스 분석: 수평 곡률(curvature) 계산 • 곡률은 굽은 정도를 표현하는 수치: 𝑪 𝒕 = (𝒙 𝒕 , 𝒚 𝒕 ), 𝜿 = 𝟏 𝒓 = 𝒙′ 𝒚′′−𝒚′ 𝒙′′ 𝒙′𝟐+𝒚′𝟐 𝟑/𝟐 • 수직 성분인 XY 컴포넌트에 대해 계산 • 패스의 곡률이 큰 지점일 수록 선회 반경이 작음 • 수평 곡률에 따라 bank angle에 해당되는 롤(roll) 회전 요소 계산 𝒓
  • 90.
  • 91. 패스 팔로잉: 프로브 제어 • 프로브는 용과 적정 거리를 유지하며 스플라인 위를 움직여야 함 • 일정 속력을 유지하되 용과의 거리가 가까워지면 속력을 높이고, 거리가 멀어지면 속력을 늦춤
  • 92. 패스 팔로잉: 용 움직임 제어 • 프로브의 현재 구간 유형을 확인 • 현재 위치의 기울기로 가속력, 속력 계산 • 프로브로의 방향으로 속력 만큼 이동 거리 𝚫𝐩 계산
  • 93. 패스 팔로잉: 용 움직임 제어 • 프로브의 현재 구간 유형을 확인 • 현재 위치의 기울기로 가속력, 속력 계산 • 프로브로의 방향으로 속력 만큼 이동 거리 𝚫𝐩 계산 • 용을 프로브로의 방향으로 정렬하기 위한 회전 속력 계산 • 현재 위치의 롤(roll) 회전 요소를 누적 • 최종 회전 속력 만큼 회전 값 𝚫𝐑 계산
  • 94. 패스 팔로잉: 용 움직임 제어 • 프로브의 현재 구간 유형을 확인 • 현재 위치의 기울기로 가속력, 속력 계산 • 프로브로의 방향으로 속력 만큼 이동 거리 𝚫𝐩 계산 • 용을 프로브로의 방향으로 정렬하기 위한 회전 속력 계산 • 현재 위치의 롤(roll) 회전 요소를 누적 • 최종 회전 속력 만큼 회전 값 𝚫𝐑 계산 • 용 객체의 위치 / 회전 갱신
  • 95. 패스 팔로잉: 용 움직임 제어 • 패스 유형이 바뀌는 시점을 용 객체에게 통지 • 용 객체는 실버바인 모션 엔진을 통해 적절한 로코모션 재생 • 비행 로코모션 연구는 WIP!!
  • 96. 경로 재탐색 전략: Pruning & Grafting • AI 내비게이션 대상은 움직이는 물체인 경우가 많음 • 타겟이 이동한 경우 패스의 갱신이 필요함
  • 97. 경로 재탐색 전략: Pruning & Grafting • AI 내비게이션 대상은 움직이는 물체인 경우가 많음 • 타겟이 이동한 경우 패스의 갱신이 필요함 • 패스의 적당한 지점을 찾아 잘라 냄 (pruning)
  • 98. 경로 재탐색 전략: Pruning & Grafting • AI 내비게이션 대상은 움직이는 물체인 경우가 많음 • 타겟이 이동한 경우 패스의 갱신이 필요함 • 패스의 적당한 지점을 찾아 잘라 냄 (pruning) • 해당 지점의 위치와 탄젠트를 유지한 채 타겟 위치로 패스 파인딩 • 새 경로를 기존 경로에 접붙이기 (grafting)
  • 99. 요약 • 패스 파인딩 • 출발/도착 지점에서 하늘길로 임시 경로 연결 • 그래프 탐색 • 부드럽게 들어오는 길, 나가는 길을 생성 • 전체 경로 스무딩 • 패스 팔로잉 • 비행 유형별로 구간을 나눔 • 프로브의 위치를 갱신 • 용의 위치 및 회전, 그리고 모션을 갱신 • 필요한 경우 경로 재탐색
  • 100. 하늘 길 시스템 – 패스 파인딩 하늘 길 시스템 – 패스 팔로잉 언리얼 엔진 AI 시스템과 융합
  • 102. AIController 확장 • AI 에이전트 관리 주체 • MoveTo 기능과 유사하게 FlyingMoveTo 요청 구현 • 하늘 길 시스템을 통해 실질적인 공중 패스 파인딩 수행 • Path Following Component 교체
  • 103. PathFollowingComponent 확장 • UE4가 제공하는 AI 에이전트 패스 세그먼트 팔로우 제어 컴포넌트 • 지상 이동은 기존대로 동작 • 공중 이동 요청의 경우 프로브의 Update / Follow 로직으로 대체
  • 105. 결과
  • 106. 데모 영상 – 용 시점 url: demo_dragon_view
  • 107. 데모 영상 – 하늘 뷰 url: demo_sky_view
  • 108. 데모 영상 – 경로 재탐색 url: demo_repath
  • 109. 하늘 길 에디터 툴 • 언리얼 엔진 에디터에서 사용 • 스플라인으로 경로를 쉽게 변형 가능 • 안전 반경을 재계산해줌 • 설치까지 자동화 한다면 좋겠지만…
  • 110. 비용? • 자세한 프로파일링과 최적화 작업 전 • 그렇지만, 게임 플레이에 영향 주지 않는 수준의 퍼포먼스 • 비싼 부분 • 스플라인의 잦은 생성과 파괴 • 레이 트레이스, 캡슐 오버랩 테스트 • 최적화 대상!!
  • 111. 미 구현 사항 및 향후 계획 • 용의 날갯짓에 맞게 용 움직임 제어 • 물리 법칙에 맞게 용 움직임 제어 • 스플라인 오프세팅(offsetting) • 비동기 패스 파인딩 • 복셀 기반 패스 파인딩 하이브리드?
  • 112. 개발하며 • 연구와 실전 개발은 많이 다르구나 • 설계 시 고려하지 못한 코너 케이스들의 향연 • 역사가 깊은 AI 내비게이션, 아직까지 실버 불릿은 없는 것인가.. • 더 잘 만들고픈 욕심과 현실적 한계 사이에서 균형 잡기
  • 114. Q & A