무한 우주를 렌더링하는 방법?


15

3D 유니버스를 렌더링하는 게임 개발 업계의 모범 사례가 무엇인지 궁금합니다.

보다 구체적으로 :

  • 데이터 포인트가 제공되고 정적입니다. 각 지점에는 위치, 색상 및 크기가 있습니다.
  • 전체 데이터 세트는 사용 가능한 메모리보다 훨씬 큽니다.
  • 사용자는 한 번에 더 큰 그림을 보려면 "확대"할 수 있어야합니다.

가장 순진한 접근 방식은 유니버스를 큐브로 분할하고 보이는 것만 렌더링하는 것입니다. 이 시나리오에서 어떻게 "확대"를 구현해야하는지 잘 모르겠습니다. 가능한 각 확대 / 축소 수준에 대해 큐브를 미리 계산해야합니까? 아니면 더 나은 접근 방법이 있습니까?

기술에 구애받지 않는 솔루션을 찾고 있습니다.


2
최대 시야 거리를 계획하거나 먼 지점을 병합하여 개별적으로 렌더링하지 않아도되거나 "점"이 불투명하고 정렬되어 대부분의 지점이 주어진 관점에서 숨겨져 있습니까? 위의 보류 중 어느 것도 없으면 사용자가 대부분의 점 (또는 적어도 상당 부분)을 동시에 볼 수있는 카메라 각도를 찾는 것을 막을 방법이 없습니다.
Ilmari Karonen

4
그건 그렇고, 조금 이국적이지만 절차 적으로 생성 된 데이터를 고려 했습니까? 맞춤 제작 영역의 이점은 없지만 내용은 대량의 데이터가 아니라 방정식을 기반으로한다는 것입니다. 창의력을 발휘하면 많은 것들을 단순화 할 수 있습니다 (:
Alan Wolfe

1
에 대한 infinite universe축소 / 확대는 다른 수준으로 확대 한 후 일부 Mandelbrot 곡선에서 두 점 사이의 관계 추적과 유사 할 수 있습니다. 어떤 수준에서는 정밀도를 잃어이를 구별하거나 다시 찾을 수 없습니다.
user2338816 2016 년

1
@AlanWolfe 사용자 정의 제작은 여전히 ​​가능합니다. 가장 대표적인 예는 1000 개 정도의 별에 대한 실제 별 위치를 가지고 있거나 Sol (Sol과 실제 행성 및 달 포함)에 가장 가까운 오래된 Frontier 게임입니다. 절차 상 생성 되지 않은 장소에 있는지 확인하고 다른 "레이어"로 추가하면됩니다.
루안

@IlmariKaronen 네, 맞습니다. 나는 최대 뷰 거리를 가지고 있고, 나는 명나라 당나라의 대답에 따라 거리 포인트를 병합합니다 생각
Anvaka

답변:


8

이것은 Celestia의 소스 코드를 통한 추측과 감추기를 기반으로합니다.

Celestia를 사용하면 행성 주위를 비행하고 축소하여 전체 은하계를 볼 수 있습니다. 나는 소스 코드를 탐색하고 공간을 재귀 적으로 8 개의 8 인자로 나누는 구조 인 octree를 사용하는 것을 발견했다.

렌더러는 octree를 순회하여 환경을 렌더링하고 멀리있는 오브젝트를 깊이 순회하지 않습니다.

Celestia는 또한 Octant의 절대 크기를 추적합니다. 여기서 Octant의 절대 크기는 Octant 내부의 별의 절대 크기를 기반으로합니다. 8 분이 서로 가까이 있으면 Celestia는 별을 개별적으로 렌더링하고 8 분이 멀리 있으면 Celestia는 8 분을 8 분의 1의별로 렌더링합니다.

또한 개체에 의미있는 계층이 연결될 수 있습니다. 예를 들어, 별과 가깝거나 (데이터베이스에서 반경이 선언 된 경우) 행성이 렌더링됩니다. 행성이 충분히 가까이 있으면 (화면에서 픽셀이 잘림) 3D 모델이 그려집니다.

내가 지명 할 수있는 다른 우주 게임은 비공개 소스 인 Orbiter와 Kerbal Space Program입니다. 또한 절차 적으로 스타 맵을 생성 한 프론티어 갤럭시를 살펴 보았습니다. 해체를 통해 게임의 작동 방식을 분석하는 웹 사이트가 있습니다 : http://www.jongware.com/galaxy1.html


12

이 퍼즐에는 여러 가지 조각이 있으며, 각 조각은 깊고 흥미로운 토끼 탐사 구멍을 제공합니다. 그들 중 일부는 다음과 같습니다.

  • 세부 수준-상세하거나 단순화 된 모델, 스프라이트 또는 점, 또는 멀리있는 개체를 자동으로 (또는 수동으로) 선택합니다.
  • 컬링 (Culling)-필요한 것만 그리도록 선택합니다. 이것은 시야에있는 것 (절두체 컬링), 다른 것들 뒤에 숨겨져 있지 않은 것 (폐쇄 컬링) 또는 다른 임시 방법 일 수 있습니다. (@Alan Wolfe의 답변은 컬링을 용이하게하는 데 도움이되는 데이터를 구성하는 몇 가지 방법을 설명합니다.)
  • 스트리밍-한 번에 메모리에 모두 맞지 않는 경우 필요에 따라 스토리지에서 메모리로 월드 데이터 가져 오기
  • 스카이 박스-카메라에서 "무한 거리"인 구에 매우 먼 거리의 물체를 미리 렌더링 할 수 있습니다.

그리고 자신의 비밀 소스는 특정 응용 프로그램 요구에 따라 이러한 기술과 사용하는 기술, 그리고 언제 어떤 조합이 될 것입니다.


2

계층 적 및 / 또는 희소 한 것이 있으면 여기서 도움이 될 것입니다.

빈 공간이 많으므로 빈 공간을 나타 내기 위해 저장소를 사용할 필요가 없습니다. 일반적인 계층 적 접근 방식은 공간을 8 개의 작은 큐브로 재귀 적으로 세분화하고 완전히 차지할 수있는 가장 작은 큐브에 객체를 저장할 수있는 Oct 트리와 같은 것입니다.

octree는 뷰 절두체의 모든 객체 목록을 쿼리하여 시야각 내에 있고 멀리 떨어져 있지 않은 객체의 목록을 얻을 수 있도록하는 데 아주 좋습니다. 희소 솔루션은 x, y, z 위치에 대한 정보를 요청할 수있는 희소 그리드와 같을 수 있지만 빈 공간이 아닌 셀에 대한 정보 만 저장하면됩니다.

사용되는 다른 일반적인 계층 적 접근 방식에는 bsp 트리 (공백을 2 개의 반 간격으로 재귀 적으로 분할)와 유사한 kd 트리가 포함됩니다.

개인적으로 octree는 좋은 출발점이 될 수 있다고 생각합니다. 빈 공간에서 메모리를 낭비하지 않도록 필요한만큼만 세분화해야합니다. 또한 정적 객체와 동적 객체에 대해 다른 솔루션을 원할 수도 있습니다.

bsp와 같은 일부 솔루션은 매우 효율적일 수 있지만 구성하는 데 시간이 오래 걸리므로 일반적으로 객체를 이동 / 변경하는 데 적합하지 않습니다.

자세한 내용에 대해 궁금한 점이 있으면 알려주세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.