3D 세계에 대한 내비게이션 그리드를 어떻게 생성합니까?


11

이 문제에 대한 해결책을 찾으려고합니다. 3D 공간의 사각형 모양으로 x, y 바닥 좌표에 고정 된 정점 그리드 형식으로 탐색 메쉬를 작성하려고합니다. 그러나 나는 그것에 관한 방법을 알아 내려고 노력하는 데 문제가 있습니다.

Recast 라이브러리를 살펴 보았습니다. 꽤 강력한 방법이지만 더 큰지도와 열린 공간에서는 속도가 느려집니다. 또한 높이 맵으로 월드 공간에 꼭짓점과 모서리를 생성하는 방법을 모르겠습니다.

저의 다음 생각은 언리얼 엔진 3이하던 일을하는 것이 었습니다.

https://udn.epicgames.com/Three/NavigationMeshReference.html

메쉬를 생성하기 위해 레이 캐스트를 사용하는 것이 었습니다. 레이 캐스트를 멈추는 방법을 알 수 없었습니다.

그래서 ... 다음 옵션은 상자 였고, 아마도 상자 캐스트였습니다. 2의 거듭 제곱 크기로 세분화 된 볼륨을 만듭니다. 상자를 그리드에 맞추고 직사각형 프리즘을 아래쪽으로 광선으로 쏘십시오. 지면의 일부인 지오메트리 조각에 떨어지고 사각형이 교차하지 않으면 사각형을 남겨 두십시오. 그리고 볼륨의 한계에 도달 할 때까지 계속 진행하십시오. 가장자리를 연결 해야하는지 확인하기 위해 두 쌍의 정점 사이의 경사가 도보 가능한 경사 내에 있는지 확인하고 이것이 참이면 병합하십시오.

내 주요 문제는 ... 이것은 매우 최적의 것 같지 않습니다. 그것을 생각하지 않고, 추정시 프로세스는 다층 레벨에 대해 O (N ^ 3)입니다. 꽤 불쾌 할 수 있습니다.

마지막 비트는이 사각형의 직사각형 그룹을 자동으로 생성하기위한 것입니다. 이 작업을 수행하는 방법을 완전히 모르겠습니다. 언리얼 구현은 슬로프로 구분합니다. 그러나 그리드 형식을 유지하려고합니다. 따라서 반드시 필요한 것은 아닙니다. 경로 찾기 프로세스를 타일 단위로 분할하기 위해 여전히 큰 직사각형 타일을 만드는 데 문제가 남아 있습니다. 타일은 너무 크거나 작을 수 없습니다.

질문은 ...

이 띠 모양의 navmesh를 생성하는 효율적인 방법은 무엇입니까? 그리고 타일을 만드는 좋은 방법은 무엇입니까?


언제 메시를 생성 할 것으로 예상됩니까? 컴파일 타임,로드 타임 또는 실시간? 우리는이 같은 문제로 어려움을 겪고 시나리오 (오버랩 경로가없는 하향식 사수에서로드 타임 생성)에 대한 과잉이라고 결정하고 쿼드 트리 기반 접근 방식을 사용하기로 결정했습니다. 이것은 우리에게 충분했습니다. 그래서 나는 내가 요구하는 것이 실제로 필요하거나 시간 요구가 될 수 있기 때문에 초기 요구 사항을 충족시키는 가장 쉬운 솔루션이 무엇인지 추측합니다. 좋은 솔루션을 관리한다면 어떻게 해결했는지 듣고 싶습니다.
Niels

@Niels 사전 빌드를 계획하고 게임에로드 할 계획입니다.
moonshineTheleocat

그런 다음 플레이어가 기다리지 않기 때문에 시간이 너무 많이 걸리지 않아야합니다. 무언가가 작동하면 언제든지 최적화 할 수 있습니다.
Niels

레벨이 얼마나 큽니까? 우리는 대형 게임에서 재방송을 사용했으며 아무런 문제가 없었습니다. 타이 값 등을 조정하면됩니다.
Steven

난 당신이 "그리드"비트를 놓친 것 같아요. 다시 사용하는 타일과는 다릅니다. 나는 그러한 일을하기 위해 재방송을 용도 변경하는 방법을 알아 내려고 노력하고 있습니다. 그러나 그것은 대부분 악몽이었습니다.
moonshineTheleocat

답변:


1

기본 3D 세계는 대부분의 게임 엔진에 편리하게 구축 할 수있는 내비게이션 메시로 표현할 수 있습니다. 액터는 다각형의 가장자리를 따라 이동할 수 있습니다.

그것은 간단한 해결책이 될 것입니다. 경로 찾기 및 navmesh 생성을위한 많은 알고리즘이 있습니다.

얼마 전에 읽은 내용을 공유하고 싶습니다.

실시 예 01

게임 세계를 정사각형 타일로 나눌 수있는 가능한 솔루션에 대해 설명합니다. 정사각형 타일이 게임에 추가 될 때마다 (플레이어가 영역 / 절차 적 지형 근처에 도달 할 때) 정사각형 타일이 추가됩니다. 그러나 더 이상 전체 navmesh를 계산할 필요는 없습니다. 해당 타일에 대해 계산하여 기존 그래프에 추가합니다. 거기에서 상당한 성능 향상.

예 02

다음 문제는 이전 예제에서 들쭉날쭉 한 움직임입니다. 나는 미래의 회전을 고려하고 방향을 일반화함으로써 지그재그 운동을 많이 줄이고 운동 유체를 만들 수 있음을 이해할 수 있습니다. 자세한 애니메이션이있는 게임은 그것을 포기하지 않지만 탐색이 대부분 구운 것으로 가정하는 오픈 월드 게임 에서이 사실을 알 수 있습니다.

질문에 대해서는 navmesh 생성 알고리즘 목록에서 Kromster의 답변 을 확인하는 것이 좋습니다 .

또한 예제가 포함 된 Left 4 DeadAI 시스템 도 확인하십시오 . 더 흥미로운 주제들

행운을 빕니다.


0

플레이어에게 로컬로 만들거나 플레이어를 따르는 작은 그리드를 만들고 각 교차로에서 횡단 가능한지 여부를 확인하는 방법에는 여러 가지가 있습니다. 다가오는 측면의 벽 / 건물 ..


좋은 생각이지만 최종 목표를 위해 실행 가능한 것은 아닙니다. 나는 큰 세상을 지원해야하며 AI가 대륙의 한 쪽에서 다른쪽으로 이동할 수 있도록해야합니다. 많은 것이 가능하지만 더 높은 노드를 생성하려면 고정 된 탐색 그리드가 있어야합니다.
moonshineTheleocat

0

이것은 내가 어디서나 본 문제입니다. 트릭은 "문제의 분리"입니다. "뭐라고?"라고 생각하는 것을 들었습니다. 화면에 표시되는 것은 "데이터 구조"가 아닙니다. 시각 자료를 데이터와 분리하여 시각 자료를 구성하는 것이 중요합니다. 그렇게하면 새로운 기본 소프트웨어 버전이 출시 될 때 항상 게임을 "미래 증명"할 수 있습니다.

게임 세계를 나타내는 데이터 구조 (일명 : 모델)를 구축하십시오. 그런 다음 데이터 구조 모델의 "보기"를 구성하십시오. 체커 보드 그리드에서 육각형 그리드로 월드를 변경하려는 경우 데이터 구조 (모델)는 동일하게 유지되지만 디스플레이는 다른 뷰를 "페인트"(렌더링)합니다.


4
우려를 분리하는 것이 일반적으로 좋은 방법이지만,이 답변은 현재 질문에 대한 답변 (예 : 주어진 월드 지오메트리 세트에서 적합한 그리드 기반 경로 찾기 모델을 생성하는 방법)에 대한 세부 사항에 대해 잘 설명되어 있습니다. 이 모델이 무엇이든 레벨을 그리는 데 사용 된 데이터와는 별개 일 것입니다. 그러나 질문에 대답하려면이 길 찾기 모델을 생성하는 방법이 여전히 필요합니다.
DMGregory

-2

이중 배열을 만듭니다. 그런 다음 객체 / 객체가 통과 할 수없는 경우 위치를 통과 할 수 없다는 것을 배열에 알려주는 방법을 사용하십시오. AI가 이동을 시도하면 이중 배열을보고 통과 가능한지 확인합니다.


4
이 배열을 채우는 방법은 어려운 부분입니다. ;)
DMGregory
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.