구형 행성과 그 지역을로드하는 방법?


15

행성 탐험으로 부분적으로 구성된 게임을 디자인하고 있습니다. 모든 세부 사항을 저장하지 않고로드해야 할 때 정의 된 시드에서 재생성하는 의사 랜덤 생성을 사용하고 싶습니다. 너무 무겁습니다. 따라서 플레이어가 수행 한 임의의 시드 및 수정 사항을 파일에 저장합니다.

플레이어는 궤도에서 행성을 볼 수 있어야합니다 (세부 정보가 매우 낮은 상태에서 지상으로 내려 가서 착륙하는 지역의 세부 정보 수준이 느리게 증가하고 다른 쪽의 정보가 언로드 됨) 플레이어의 시야 밖에있는 행성의

비행기 지상에서해야한다면, 정사각형 덩어리 시스템으로 쉽게 할 수 있습니다. 그러나 여기서 문제는 행성은 거의 구체라는 것입니다.

그렇다면 정확한 지점 주위에 접지 세부 사항 (릴리프 및 접지 된 물체)을로드하는 가장 좋은 방법은 무엇입니까?
나는 이미 두 가지 해결책을 가지고 있지만 둘 다 약점이 있습니다.

1. 구를 사각형 덩어리로 자릅니다.

스퀘어 청크 방법

플레이어가 땅에 충분히 가까워지면 자신의 위치에서 가장 가까운 사각형의 세부 사항을 개선해야합니다.
충분하지 않은 경우에도 플레이어가 바닥에 있거나 실제로 지상에있을 때 하위 사각형으로 각 사각형을자를 수 있습니다.

그러나 그림에서 볼 수 있듯이 플레이어가 극에 착륙하려고하면 문제가 있습니다. 정사각형은 매우 슬림 한 사각형 또는 마지막 선의 삼각형이되고 추가로로드하기가 쉽다는 사실에 해당합니다. 세대가 왜곡되어 나타납니다.

2. 정 이십 면체에서 시작.

정 이십 면체 방법

여기서는 플레이어가 가까워 질 때 플레이어의 위치 주위에 삼각형 테셀레이션을 늘릴 수 있습니다.

그러나 나는 플레이어의 위치보다 삼각형을 찾는 방법을 모른다. 이 경우 데카르트 좌표 가 유용 할 수 있다고 들었지만 사용법을 모르겠습니다.


C ++ / OpenGL을 사용하고 있으므로 여기에서 생성하고로드하는 가장 중요한 것은 표면 릴리프 및 색상 / 질감을 나타내는 정점입니다.


제가 글을 쓰기 전에 당신의 세계는 구체입니까? 각 그리드에 파일에 저장된 속성이있는 구에 그리드를 적용하려고합니까?
Alec Teal

@AlecTeal 나는 행성을 시뮬레이션하려고합니다. 전 세계적으로 구체입니다. 그리고 주요 문제는 플레이어가 어떤 지점, 기둥 또는 적도를 따라 접지하려고 할 수 있다는 것입니다.
Aracthor

2
그래서 .. 구현이 많을 때 "구형 세계 게임 엔진"을 검색하라고 요청해야합니다. 왜 작동하지 않습니까? 또한 이것이 큐브 맵을 갖는 이유입니다.이 이유는 구형 매니 폴드의 구상 형에 대한 표준 차트입니다.
Alec Teal

1
또한 쿼드 구 옵션을 평가하는 것이 좋습니다
DNK가 drone.vs.drones

maths.kisogo.com/index.php?title= 참고 : 구면 _ 좌표 예비 초안. 사진이 필요하고 완료해야합니다.
Alec Teal

답변:


5

좋아, 그래서 여기에 썼습니다 :

http://www.maths.kisogo.com/index.php?title= 참고 : 구면 좌표

(수학 마크 업이 필요했고 정말 길었습니다.)


문서 적용

이 문서는 매니 폴드의 개념을 소개하면서 시작합니다. 매니 폴드는이 덩어리가 "동종"(기본적으로 동일) R ^ n 덩어리 (R ^ 2는 x / y 평면입니다)입니다. 알고있다)

차트는 매니 폴드의 일부 (구의 경우 전체를 다룰 수는 없지만)를 다룹니다.

이 기사에서는 각도를 유지하는 구, 즉 일정한 거리를 유지하는 구에 대한 4 개의 차트를 개발합니다.

구의 점에 좌표를 지정하는 것은 실제로 매우 어렵습니다! 우리가 대신하는 것은 (이 예제의 원에 있지만) 각 점에 (i, x, y) 형식의 좌표를 제공합니다. 여기서 i는 구의 경우 1에서 6 사이의 숫자이고 원의 경우 1에서 4 사이의 숫자입니다. 이것은 차트 번호입니다.

x와 y는 해당 차트의 각도를 나타냅니다 (또는 원이면 x).

구의 6 개 차트는 상단 / 하 반구, 왼쪽 / 오른쪽 및 앞 / 뒤 반구입니다.


좌표

이제 당신은 evey point에 "좋은"좌표를 줄 수 있습니다. 수학적 용어로 차트의 도메인은 "개방형"맵입니다. 이는 각 점 주위의 공도 세트에 있도록 양의 숫자가 있음을 의미합니다. 예를 들어 범위 (0,1) (0 <x <1 인 경우 x를 포함하는 세트)이 열려 있으면 (0,1)에서 p를 취하고 (예 : 0.001) 다음과 같은 숫자 (예 : 0.0005)를 갖습니다. 0.0005의 0.0005 이내의 모든 지점도 (0,1)에 있습니다.

이것이 의미하는 것은 차트를 통해 방향을 전달할 수 있다는 것입니다.

이제 우리가 개발 한 차트에는 45 도의 겹침이 있습니다. 이 의미는 좌표 (I, X, Y) 안전하게 형태의 포인트를 지정할 수의 피쳐가있는 경우 (I, X + A, Y +의 b) 길이로 a하고 b(도) -45과 +45 사이

(i, x + a, y + b) 형식의 모든 점은 문제없이 "정상적인"3 차원 공간의 점으로 쉽게 변형 될 수 있습니다.


이행

이제 구의 무언가에 대한 좌표를 저장 하고이 좌표로 넓은 공간의 영역을 표시하고 좌표처럼 행동하며 예를 들어 열려 있습니다 (대신 2 각도를 사용하면 문제가됩니다)

이제 6 개의 평면을 수행하기 만하면 "정규 구를 만드는 방법"답변을 완전히 버릴 수 있으며 그 모서리가 정렬되어 있고 (사소한) 결과는 다음과 같습니다.

사용하기 쉬운 좌표가있는 멋진 구가 있습니다.

모든 질문은 의견을 주시기 바랍니다, 나는 사전 지식이 거의 없다고 가정했습니다. 나는 또한 사람들을 가르치는 새로운


@Alec_Teal 나는 당신이 그것을 게시 한 이래로 복잡하고 이해하기 어렵습니다 (나는 너무 많은 수학 공식에 익숙하지 않습니다). 그러나 나는 이해해야한다고 생각합니다 ... 당신의 방법은 큐브 기반과는 정말로 다릅니다 위에서 설명한 구? 당신의 "차트"가 정사각형이거나 더 많은 것인지 이해가되지 않았습니다.
Aracthor

@Aracthor 더 일반적입니다. 차트는 말 그대로 책의 차트와 같습니다 (지도로 표시). 모든 영역에 그리드를 적용하기 만하면됩니다. 예를 들어 원환 체 또는 2 개의 구멍이있는 원환 체가 있다고 가정하면 이러한 방법이 필요합니다. 여기서 어떤 대답도 다른 작업 인 지오메트리를 만드는 일반적인 방법만큼 구의 좌표를 다루지 않습니다. 수식에 도움을 줄 수 있고 가능한 한 쉽게 작성하려고 시도했지만 이것이 빵과 버터이므로 복잡성을 보지 못합니다.
Alec Teal

@Alec_Teal 나는 그것을 확인했지만 여전히 모든 것을 얻지 못했다고 생각합니다. 그러나 대화방 에서이 토론을 계속합시다 .
Aracthor

13

이미 살펴본 바와 같이이 문제에 대한 여러 가지 솔루션이 있지만 100 % 이상은 아닙니다. 구는 까다 롭습니다.

큐브 기반

Spore와 다른 게임에서 사용되는 일반적인 경로 중 하나는 (구두 아래에서 엿보기없이 특정 사실을 말하기는 어렵지만) 구를 큐브에 투영하고 각 큐브 얼굴에 사각형 격자를 사용하는 것입니다.

(이것은 Alec Teal과 dnk drone.vs.drones가 위의 주석에서 설명 한 것입니다)

큐브를 기준으로 세분화 된 구

( LoD에 입방 표현 사용을 설명하는이 게시물의 이미지 )

이것은 위도-경도 방법의 장점이 많으며 피크 왜곡이 훨씬 적습니다. 벡터를 정규화하거나 절대 값에서 최대 성분으로 나눔으로써면 격자의 위치와 구의 위치 사이를 앞뒤로 쉽게 변환 할 수 있습니다. 또한 큐브 매핑 텍스처링 기술 과도 잘 어울립니다.이 기술은 지구 전체를 멀리서 볼 때 유용합니다.

일반적인 매핑 방식은 gnomonic projection 이며 위의 이미지에서 볼 수 있듯이 여전히 밀도 불일치 문제가 있습니다. 격자는면의 중심보다 큐브 모서리 근처에서 훨씬 더 밀도가 높습니다. 균일 성이 중요한 경우 올바른 매핑 수식을 사용하여이를 줄일 수 있지만 일반적으로 매핑을 반전시키기가 더 어려워집니다.

균일 성을 향상시키기 위해 매핑 기능 변경

모든 경우에 90도 각도로 4 개의 사각형을 교차하는 일반적인 그리드 교차점은 120도 각도로 3 개의 마름모꼴 모임이되는 모서리에 여전히 각도 왜곡이 발생합니다.

정 이십 면체 기반

내가 개인적으로 가장 좋아하는 방법은 피크 각도 왜곡을 최대한 작게 만들기 때문에 당신이 설명한 정 이십 면체 버전 일 것입니다. 삼각형 격자가 보통 60도 각도에서 6 개의 삼각형을 만나는 경우, 정 십이 면체 정점은 72도 각도에서 5 개의 삼각형을 갖습니다. 따라서 큐브 예제에서 각 사각형보다 왜곡이 적습니다.

그것은 큐브 버전의 제곱만큼 익숙하지 않은 영역이기 때문에 아마도 인기가없는 이유 일 것입니다. 작업하는 데 약간의 수학이 필요합니다.

근처의 포인트를 식별하는 것은 그다지 어렵지 않습니다. 정 이십 면체 기반의 측지 구체는 일반 삼각형 격자로 편평해질 수 있습니다.

지오 데식 테셀레이션을 일반 삼각 그리드로 평탄화 삼각 격자에 정 이십 면체의 그물

그리고 여기에 설명 된 것처럼 규칙적인 삼각형 격자는 사각형 격자처럼 취급 될 수 있습니다 .

삼각 사각형 격자 동형

따라서 정 이십 면체의 어떤면을 결정하면 (정 이십 면체 메쉬에 대해 레이 캐스트로 수행 할 수 있습니다-그 부분을 단순화하는 영리한 수학적 방법을 모릅니다) 친숙한 방법으로 주변 환경을 채울 수 있습니다 그리드 순회. :)

편집하다:

Class-I 측지선을 사용하는 경우 큐브 기반 버전을 저장하는 데 사용하는 6 개의 사각형 차트와 비슷하게 행성을 5 개의 사각형 차트로 풀어서 레벨 청크 / 텍스처 / 높이 맵을 효율적으로 저장할 수 있습니다.

지구권을 직사각형 차트로 풀기

(이것은 또 다른 대답으로 퍼지 로직이 제기 한 문제를 해결하는 데 도움이 될 수 있습니다. 이것은 또한 가능하지만 클래스 II 측지학에서는 조금 더 복잡합니다. 클래스 III는 조사하지 않았습니다)

비결은이 차트의 축이 실제로 사용되는 수직이 아니기 때문에 기존 제작 및 스트리밍 도구 / 기술은 즉시 사용할 수 없다는 것입니다. 어쨌든 자체 청크 스트리밍을 작성하거나 즉석 절차 생성을 사용하려는 경우에는 문제가되지 않을 수 있습니다. 또한보다 일반적인 도구를 사용하는 것보다 고해상도로 소스 맵을 생성 한 다음 차트 그리드를 따라 샘플링하는 베이킹 프로세스를 통해 소스 맵을 생성하여 직접 연결하는 조밀하고 효율적인 표현을 작성하여 작성 문제를 해결할 수 있습니다. 정 이십 면체 구조로.


1
여기 좋은 것들이 있습니다. 나는 +1을 할 것이지만 나중에 답을 쓸 계획이다 (나는 대답 할 때 투표의 초기 단계에서 벗어나려고 노력한다). 저의 유일한 의견은이 접근법이 표면을 모델링하는 것보다 구체를 렌더링하는 데 더 낫다는 것입니다.
Alec Teal

궁금한 점이 있으시면 이제 답변을 마치 셨습니다.
Alec Teal

4

청크 분할 된 LOD가 포함 된 쿼드-스피어는 절차 적 또는 사전 정의 된 높이 매핑 및 텍스처와 같은 세부 수준의 지형으로 공간에서 지상으로 이동할 수있는 경우 선호되는 방법입니다.

Icosasphere는보다 균일 한 메시를 제공하고 테셀 레이트하기는 쉽지만 캐시해야하는 텍스처와 하이트 맵을 매핑하려고 할 때 문제가 발생합니다.

쿼드 스피어에는 핀치 포인트가 있지만 테셀레이션이 충분하면 아무 것도 볼 수 없습니다. 그런 다음 각 영역 (청크)이 거의 문제가없는 사각형 격자 인 것처럼 텍스처를 매핑하고 DLOD를 효과적으로 구현할 수 있습니다. 이것은 icosasphere와 비교하여 구현하기가 더 간단하고 계산과 자원 모두에서 더 효율적입니다.

하이트 맵 및 텍스처에 대한 Gamasutra에서 절차 우주 생성에 대한 Sean O'Neil의 기사 :
-1 Perlin Noise 및 Fractal Brownian Motion을 참조하십시오.
- 행성 생성을위한 DLOD가 포함 된 절차 적 메시를위한 Part 2 ROAM 알고리즘. 성능 문제로 고통받습니다. 권장되지는 않지만 교육적 가치에는 적합합니다.
-3 대규모, 최적화 및 부동 소수점 문제와 관련된 문제를 다룹니다. 주로 우주 규모와 관련이 있지만 원하는 경우 광년 규모에서 센티미터로 전환 할 때 행성에도 적용됩니다.
-4 : 행성 생성을위한 청크 (쿼드 트리) DLOD가 포함 된 쿼드-스피어 구현에 대해 논의 <-이 기사를 특히보십시오


0

나는 프로그래밍 전문가가 아니지만 일종의 체크 포인트를 가질 수 있습니다. 물론 보안을 통해 보안 검사 점을 통과하는 동안 행성 표면이로드 될 수 있으며 그 반대도 마찬가지입니다.


이것은 탐색 가능한 행성 표면을 구체로 설계하지 않는 옵션을 열어서 문제를 우회하지만 해결하지는 않습니다.
Philipp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.