Planety proceduralne, mapy wysokości i tekstury


19

Obecnie pracuję nad generatorem proceduralnych planet OpenGL. Mam nadzieję, że użyję go do kosmicznej gry RPG, która nie pozwoli graczom zejść na powierzchnię planety, więc zignorowałem wszystko, co jest związane z ROAM. W tej chwili rysuję sześcian z VBO i mapuję na kulę.

Znam większość technik generowania mapy wysokości fraktalnej i zaimplementowałem już własną wersję przesunięcia punktu środkowego (nie tak przydatne w tym przypadku wiem).

Moje pytanie brzmi: jaki jest najlepszy sposób na procedurę generowania mapy wysokości. Mam spojrzał na libnoise który pozwala mi zrobić tilable heightmaps / tekstur, ale o ile widzę, że muszę wygenerować siatkę jak ten .

Pozostawienie kafelków oczywiste.

Czy ktoś mógłby mi doradzić, jak wybrać najlepszą drogę?

Wszelkie uwagi będą mile widziane.

Odpowiedzi:


18

Przede wszystkim nie jestem pewien, dlaczego chcesz zaimplementować mapę wysokości (tj. Przesunięcie geometrii), jeśli ludzie nie będą w stanie wylądować, po prostu wydajniejsze jest normalne odwzorowanie mapy lub czegoś takiego.

To powiedziawszy, to, czego chcesz, to konwersja z arbitralnej (x, y, z)na (u, v)współrzędną, co jest banalne. Nie jest wymagana mapa cubes.

alternatywny tekst

alternatywny tekst

  1. Każdy (u, v)texel ma wysokość (mapę wysokości RGB = height) i pozycję (x, y, z) = pos.
  2. Znajdź i znormalizować pozycję NORMAL(x, y, z) = N.
  3. Nowy wierzchołek = pos+N*height.

Będzie to działać lepiej przy wyższej teselacji. Użyj również odpowiedniego libnoisemapowania sferycznego dla mapy wysokości, która będzie wyglądać mniej więcej tak (ale czarno-biała):

alternatywny tekst



1

Mapowanie wysokości przesunięcia punktu środkowego jest dobrym miejscem do rozpoczęcia. OP, dlaczego według ciebie tak nie jest?

OP dobrze jest modelować powierzchnię planety jako mapę sześcienną, ponieważ każda płaska mapa (np. Rzut mercatora) będzie miała zniekształcenia, które są brzydkie i skomplikowane pod względem matematycznym.

Gdybym był OP, na początku zapomniałbym geometrii planety na dużą skalę. Zrobiłbym mapę sześcienną, w której każda twarz ma 2 ** N + 1 pikseli (2,3,5,9,17,33 ...), a każdy texel koduje wysokość [0..N), gdzie 0 jest wysokością oczekiwany najniższy wykop, a N jest wysokością oczekiwanej najwyższej góry na planecie.

Następnie obliczyłem losowe wysokości dla ośmiu wierzchołków sześcianu i rozłożyłem je na sześć kwadratów mapy sześcianu, tak aby każdy wierzchołek pojawił się trzy razy.

Gdy rekurencyjnie generuję wysokości fraktali dla punktów środkowych krawędzi, upewniłem się, że propaguję wierzchołki krawędzi twarzy do drugiej ściany, która je dzieli.

Kiedy skończę, mam mapę kostki, w której wszystkie tekstury krawędzi są podwojone, a wszystkie tekstury narożne są potrojone. Nie trzeba konwertować go na normalną mapę - użyłbym algorytmu w pracy Mortena Mikkelsena, aby renderować normalne bezpośrednio z mapy wysokości w czasie wykonywania.

W czasie wykonywania prawdopodobnie wyrenderowałbym quad, który obejmuje rzutowanie planety na ekran, i wykonałem test przecięcia pojedynczej promienia kuli w module cieniującym piksele, aby sprawdzić, czy trafiłem na planetę i gdzie. Na pewno bije rasteryzację wysoce sferycznego modelu kuli i uzyskuje również gładką krawędź.


1

Szum przemieszczenia punktu środkowego, przy maksymalnym przesunięciu skalowanym przez bezwzględną długość geograficzną piksela, może szybko wytworzyć sferyczną mapę szumów. Tabele kolorów uwzględniające wysokość, nachylenie, światło słoneczne lub długość geograficzną, ponieważ parametry mogą być używane do automatycznego ocieniania planety.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.