절차 적 행성, 하이트 맵 및 텍스처


19

현재 OpenGL 절차 행성 생성기에서 작업하고 있습니다. 우주 RPG에 사용하여 플레이어가 행성 표면으로 내려갈 수 없도록 ROAM과 관련된 것을 무시했습니다. 현재 VBO가있는 큐브를 그리고 구에 매핑하고 있습니다.

나는 대부분의 프랙탈 하이트 맵 생성 기술에 익숙하며 이미 자신의 중간 점 변위 버전을 구현했습니다 (이 경우에는 유용하지 않습니다).

제 질문은 절차 적으로 하이트 맵을 생성하는 가장 좋은 방법은 무엇입니까입니다. 나는 나를 tilable 하이트 / 텍스처를 만들 수 있습니다 libnoise 보았다,하지만 지금까지 나는 내가 같은 순 생성해야 볼 수있는 .

바둑판 식 배열을 그대로 둡니다.

누구든지 가장 좋은 길을 안내해 줄 수 있습니까?

모든 의견을 보내 주시면 감사하겠습니다.

답변:


18

우선, 사람들이 착륙 할 수없는 경우 왜 높이 맵 (예 : 지오메트리 변위)을 구현 하려는지 잘 모르겠습니다. 정상적으로 맵하는 것이 더 효율적인 것 같습니다.

그렇게 말하면 원하는 것은 임의 (x, y, z)(u, v)좌표에서 사소한 좌표 로 변환하는 것입니다. 큐브 맵이 필요하지 않습니다.

대체 텍스트

대체 텍스트

  1. 모든 (u, v)텍셀에는 높이 (높이 맵 RGB = height)와 위치가 (x, y, z) = pos있습니다.
  2. 위치를 찾아 정규화하십시오 NORMAL(x, y, z) = N.
  3. 새로운 정점 = pos+N*height.

테셀레이션이 높을수록 더 잘 작동합니다. 또한 libnoise하이트 맵에 적절한 구형 매핑을 사용하십시오. 이것은 다음과 같습니다 (흑백).

대체 텍스트



1

중간 점 변위 높이 매핑을 시작하는 것이 좋습니다. OP, 왜 그렇지 않다고 생각하십니까?

플랫 맵 (예 : 메르카토르 투영)에는 수학적으로보기 흉하고 복잡한 왜곡이 있기 때문에 OP는 행성 표면을 큐브 맵으로 모델링하는 데 좋습니다.

내가 OP라면, 처음에는 큰 규모의 행성 기하학을 잊을 것입니다. 각면이 2 ** N + 1 픽셀 (2,3,5,9,17,33 ...)이고 각 텍셀이 높이 [0..N)을 인코딩하는 큐브 맵을 만들 것입니다. 여기서 0은 고도입니다. 가장 낮은 예상 트렌치와 N은 지구상에서 예상되는 가장 높은 산의 고도입니다.

그런 다음 큐브의 8 개의 정점에 대한 임의의 높이를 계산하고이를 큐브 맵의 6 개의 정사각형으로 전파하여 각 정점이 3 번 표시되도록합니다.

가장자리의 중간 점에 대해 프랙탈 높이를 재귀 적으로 생성 할 때면 가장자리 정점을 공유하는 다른면으로 전파해야합니다.

완료되면 모든 가장자리 텍셀이 두 배가되고 모든 코너 텍셀이 세 배가되는 큐브 맵이 있습니다. 노멀 맵으로 변환 할 필요가 없습니다 -Morten Mikkelsen의 논문 에있는 알고리즘을 사용하여 런타임에 하이트 맵에서 직접 노멀을 렌더링합니다.

런타임에 나는 아마도 행성의 스크린으로의 투영을 커버하는 쿼드를 렌더링하고, 픽셀 쉐이더에서 단일 광선-구 교차점 테스트를 수행하여 내가 행성에 충돌했는지 여부와 위치를 찾는다. 물론 테셀 레이트 된 구체 모델을 래스터 화하는 것보다 뛰어나고 매끄러운 가장자리를 얻을 수 있습니다.


1

픽셀의 절대 경도로 스케일링 된 최대 변위를 갖는 중간 점 변위 노이즈는 구형 노이즈 맵을 빠르게 생성 할 수 있습니다. 매개 변수로 고도, 경사, 햇빛 또는 경도를 사용하는 색상 표를 사용하면 행성을 자동으로 음영 처리 할 수 ​​있습니다.

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