Jak załadować sferyczną planetę i jej regiony?

15

Projektuję grę częściowo złożoną z eksploracji planet. Chcę dla nich użyć pseudolosowego generowania, regenerując się od określonego ziarna, gdy muszę je załadować, zamiast przechowywać każdy szczegół, który byłby zbyt ciężki. Tak więc po prostu zapiszę w pliku losowe ziarno i ewentualne modyfikacje wykonane przez gracza.

Gracz musi widzieć planetę z orbity (z bardzo niskim poziomem detali, a następnie zejść na ziemię, powoli zwiększając poziom szczegółów regionu, w którym ląduje, i rozładowując te po drugiej stronie planety, które wychodzą poza pole widzenia gracza.

Gdybym musiał to zrobić na płaskim terenie, zrobiłbym to z łatwością za pomocą kwadratowego systemu fragmentów. Problem polega jednak na tym, że planety są - prawie - sferami.

Więc jaki byłby najlepszy sposób na załadowanie detali naziemnych (reliefu i uziemionych obiektów) wokół precyzyjnego punktu?
Myślałem już o dwóch rozwiązaniach, ale oba mają słabą stronę:

1. Cięcie kuli w kwadratowe kawałki.

metoda kwadratowych kawałków

Gdy gracz znajdzie się wystarczająco blisko ziemi, muszę tylko poprawić szczegóły najbliższych pól z jego / jej pozycji.
Jeśli to nie wystarczy, wciąż mogę wycinać każdy kwadrat na kwadraty, aby załadować je, gdy gracze znajdują się na ziemi lub naprawdę blisko niej.

Ale jak widać na zdjęciu, problem polega na tym, że gracz próbuje wylądować na słupie: kwadraty stają się bardzo cienkimi prostokątami, a nawet trójkątami dla ostatniej linii, a dodatkowo fakt, że będzie ich wiele do załadowania, generacja wydawałaby się zniekształcona.

2. Zaczynając od dwudziestościanu.

metoda dwudziestościanu

Tutaj mogę po prostu zwiększyć teselację trójkąta wokół pozycji gracza, gdy on / ona się zbliża.

Ale nie wiem, jak zlokalizować trójkąty blisko pozycji gracza. Słyszałem, że w tym przypadku przydatne mogą być współrzędne kartezjańskie , ale nie wiem, jak ich używać.


Używam do tego C ++ / OpenGL, więc najważniejsze do wygenerowania i załadowania tutaj są wierzchołki reprezentujące relief powierzchni i kolor / teksturę.

Araktor
źródło
Czy zanim zacznę pisać, czy twój świat jest kulą? Czy próbujesz narzucić siatkę na kulę, w której każda siatka ma właściwości zapisane w pliku?
Alec Teal
@AlecTeal Próbuję symulować planetę. Jest to globalnie sfera. A głównym problemem jest to, że gracz może próbować uziemić w dowolnym punkcie, na słupie lub wzdłuż równika.
Aracthor,
2
Więc ... muszę zapytać, czy szukałeś „silnika kulistego świata”, ponieważ jest tam wiele implementacji. Dlaczego nie działają? Dodatkowo dlatego mamy mapy sześcianów, są to standardowe wykresy na dowolnej różnorodnej topologii homeomorficznej z kuli z tego powodu!
Alec Teal
1
zasugeruj, aby ocenić również opcję kuli quad
dnk drone.vs.drones
maths.kisogo.com/index.php?title=Notes:Spherical_coordinates wstępny projekt. Potrzebuje zdjęć i do wykończenia.
Alec Teal

Odpowiedzi:

5

Okej, więc napisałem to tutaj:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(Potrzebowałem znaczników matematycznych, a także jest naprawdę dość długi)


Stosowanie dokumentu

Dokument zaczyna się od wprowadzenia pojęcia rozmaitości, rozmaitości jest tą rzeczą, w której fragmenty są „homeomorficzne” (w zasadzie: takie same jak) fragmenty R ^ n (R ^ 2 jest płaszczyzną x / y, jak można wiedzieć)

Tabela obejmuje niektóre (być może wszystkie, chociaż w przypadku kuli NIE MOŻE obejmować wszystkich) rozmaitości.

W artykule opracowuję 4 wykresy dla kuli, które zachowują kąty, czyli zachowują regularną odległość.

Jak się dowiedziałeś, podawanie współrzędnych punktom na kuli jest w rzeczywistości dość trudne! Zamiast tego (chociaż w tym przykładzie na okręgu) nadamy każdemu punktowi współrzędną formy (i, x, y), gdzie i jest liczbą od 1 do 6 dla kuli, 1 i 4 dla koła. To jest numer wykresu.

X i y odnoszą się do kątów na tym wykresie (lub tylko x, jeśli jest to okrąg).

6 wykresów kuli to górna / dolna półkula, lewa / prawa i przednia / tylna półkula.


Współrzędne

Teraz możesz nadać każdemu punktowi „ładną” współrzędną, która jest dobrze zachowana. W kategoriach matematycznych domeny wykresów są mapami „otwartymi”, co oznacza, że ​​istnieje pewna liczba dodatnia, tak że piłka wokół każdego punktu również znajduje się w zestawie. Na przykład zakres (0,1) (zbiór zawierający x, jeśli 0 <x <1) jest otwarty, weź dowolne p w (0,1) (na przykład 0,001), a następnie liczba (na przykład 0,0005) taka jak że dowolny punkt w granicach 0,0005 od 0,001 jest także w (0,1).

Oznacza to, że możesz pokonywać trasy przez wykresy.

Obecnie opracowywane przez nas wykresy pokrywają się w 45 stopniach. To znaczy, że jest wyposażony w funkcję w układzie współrzędnych (i, x, y), można bezpiecznie podać punktów postaci (I, X + A, y + b) tak długo, jak ai bw przedziale między -45 a + 45 (w stopniach)

Dowolny punkt formy (i, x + a, y + b) można bez problemu łatwo przekształcić w punkt w „normalnej” przestrzeni trójwymiarowej.


Realizacja

Masz teraz sposób na przechowywanie współrzędnych dla czegoś na kuli i oznaczenie regionów dużymi obszarami przestrzeni za pomocą tych współrzędnych, zachowują się one również jak współrzędne, są na przykład otwarte (co jest problemem, jeśli użyjesz 2 kątów zamiast)

Możesz również całkowicie odrzucić odpowiedzi „jak utworzyć zwykłą kulę”, ponieważ wystarczy zrobić 6 płaszczyzn i upewnić się, że ich krawędzie są wyrównane (co jest trywialne), a wynik jest następujący:

Otrzymasz ładną kulę z łatwymi w użyciu współrzędnymi

Wszelkie pytania prosimy o komentarz, starałem się założyć niewielką wcześniejszą wiedzę. Jestem również nowy w nauczaniu ludzi

Alec Teal
źródło
@Alec_Teal Jestem na twojej odpowiedzi, ponieważ napisałeś ją, złożoną i trudną do zrozumienia (nie jestem przyzwyczajony do tylu wzorów matematycznych), ale myślę, że muszę zrozumieć ... Czy twoja metoda naprawdę różni się od metody opartej na kostce kula jak opisano powyżej? Nie rozumiałem, czy twoje „wykresy” to rzuty kwadratowe, czy coś więcej ...
Aracthor
@Aracthor jest bardziej ogólny. Wykres jest dosłownie jak wykres w książce (map), wystarczy nałożyć siatkę na jakiś obszar. Załóżmy, że masz torus lub torus z dwoma otworami, potrzebujesz tych metod. Żadna z odpowiedzi tutaj nie dotyczy współrzędnych na sferze tak samo jak zwykłych sposobów tworzenia geometrii, co jest innym zadaniem. Mogę pomóc w formułach, próbowałem napisać to tak łatwo, jak to możliwe, ale to jest mój chleb i masło, więc nie widzę złożoności.
Alec Teal
@Alec_Teal Zatwierdziłem to, ale nadal nie sądzę, że dostałem wszystko. Ale kontynuujmy tę dyskusję w pokoju rozmów .
Aracthor
13

Jak już wykazałeś, istnieje wiele rozwiązań tego problemu, ale żadne nie jest w 100% idealne. Kule są trudne.

Na bazie kostki

Jedną z powszechnych tras, używaną przez Spore i całkiem prawdopodobne inne gry (choć trudno jest z całą pewnością stwierdzić bez zerkania pod maską), jest rzutowanie kuli na sześcian i użycie kwadratowej siatki na każdej powierzchni kostki.

(To właśnie opisują Alec Teal i dnk drone.vs.drones w powyższych komentarzach)

Sfera podzielona na podstawie sześcianu

( Zdjęcie z tego postu, które opisuje użycie reprezentacji sześciennej dla LoD )

Ma to wiele zalet metody szerokości i długości geograficznej, przy znacznie mniejszym zniekształceniu piku. Łatwo jest konwertować tam iz powrotem między pozycjami na siatce twarzy i pozycjami na kuli, albo normalizując wektor, albo dzieląc przez jego największy składnik w wartości bezwzględnej. Ładnie dopasowuje się również do technik teksturowania mapowania kostek , które mogą być przydatne podczas oglądania całej planety z odległości.

Typowe podejście do mapowania nazywa się projekcją gnomoniczną i nadal ma problem niedopasowania gęstości, jak widać na powyższym obrazku. Siatka jest znacznie bardziej gęsta w pobliżu rogów sześcianu niż w środkowej części ścian. Jeśli jednolitość jest ważna, można to zmniejszyć za pomocą odpowiednich formuł odwzorowania, ale zwykle utrudnia to odwrócenie odwzorowania.

Różnicowanie funkcji mapowania w celu poprawy jednolitości

We wszystkich przypadkach nadal będziesz mieć zniekształcenie kątowe w rogach, gdzie zwykłe przecięcie siatki czterech kwadratów o kątach 90 stopni staje się spotkaniem 3 rombów o kątach 120 stopni.

Na podstawie dwudziestościanu

Moim osobistym ulubionym podejściem będzie opisana przez ciebie dwudziestościenna wersja, ponieważ sprawia, że ​​szczytowe zniekształcenie kątowe jest tak małe, jak to możliwe. Tam, gdzie siatka trójkątna miałaby zwykle sześć trójkątów o kątach 60 stopni, wierzchołki dwudziestościanu mają 5 trójkątów o kątach 72 stopni. Każdy z nich ma mniej zniekształceń niż kwadraty w przykładzie sześcianu.

Nie jest to tak dobrze znane terytorium, jak kwadraty wersji sześcianu, i prawdopodobnie dlatego nie jest tak popularne. Praca wymaga nieco więcej matematyki.

Identyfikacja pobliskich punktów nie jest jednak tak trudna, jak mogłoby się wydawać. Każda kula geodezyjna na podstawie dwudziestościanu może zostać spłaszczona na regularnej siatce trójkątnej:

Spłaszczanie teselacji geodezyjnych na regularnej siatce trójkątnej Siatka dwudziestościanu na trójkątnej siatce

I zwykłą trójkątną siatkę można traktować jak kwadratową siatkę, jak omówiono tutaj .

Izomorfizm siatki trójkątno-kwadratowej

Kiedy więc określisz, na której powierzchni dwudziestościanu się znajdujesz (co można zrobić za pomocą raycasta przeciw dwudziestościennej siatce - nie znam żadnego sprytnego matematycznego sposobu uproszczenia tej części), otoczenie można wypełnić za pomocą znajomego przejście siatki. :)

Edytować:

Jeśli używasz geodezyjnej klasy I, możesz rozpakować swoje planety na pięć prostokątnych wykresów w celu efektywnego przechowywania fragmentów poziomów / tekstur / map wysokości, podobnie jak sześć kwadratowych wykresów, których używałbyś do przechowywania wersji opartej na kostce:

Rozpakowywanie geosfery na prostokątne wykresy

(Może to pomóc w rozwiązaniu problemu podniesionego przez Fuzzy Logic w innej odpowiedzi. Jest to również możliwe, ale nieco bardziej skomplikowane dla geodezji klasy II. Nie badałem klasy III)

Sztuczka polega na tym, że osie tych wykresów nie są w rzeczywistości prostopadłe w użyciu, więc istniejące narzędzia / technologie do tworzenia i przesyłania strumieniowego nie obsługują tego po wyjęciu z pudełka. Jeśli i tak planujesz napisać własną transmisję strumieniową lub korzystać z generowania procedur w locie, może to nie stanowić problemu. Możesz także być w stanie obejść problem z tworzeniem, generując mapy źródłowe w wyższej rozdzielczości niż potrzebujesz, używając bardziej konwencjonalnych narzędzi, a następnie uruchamiając je w procesie pieczenia, który pobiera próbki wzdłuż siatki wykresów, aby utworzyć gęstą, wydajną reprezentację, która jest podłączana bezpośrednio w strukturę dwudziestościenną.

DMGregory
źródło
1
Jest tu kilka dobrych rzeczy. Dałbym +1, ale planuję napisać odpowiedź później (staram się trzymać z dala od wczesnych faz głosowania, kiedy również odpowiadam). Moim jedynym komentarzem byłoby to, że takie podejście jest lepsze do renderowania sfer niż do modelowania powierzchni
Alec Teal
Tylko, jeśli jesteś ciekawy, właśnie skończyłem moją odpowiedź.
Alec Teal,
4

Czwórka-kula z fragmentem LOD jest preferowaną metodą, jeśli chcesz być w stanie przejść z kosmosu na ziemię na dowolnym poziomie szczegółowego terenu, zarówno proceduralnym, jak i predefiniowanym mapowaniu wysokości i tekstur.

Icosasphere zapewnia bardziej jednolitą siatkę i jest łatwy do mozaikowania, ale stwarza problemy podczas próby mapowania tekstur i map wysokości, które trzeba będzie buforować i które nie będą zbyt kompaktowe ani proste w ten sposób.

Czworokąt ma punkty uszczypnięcia, ale przy wystarczającej teselacji i tak ich nie zobaczysz. Następnie możesz mapować tekstury i efektywnie implementować DLOD, tak jakby każdy region (porcja) był kwadratową siatką z małym problemem. Jest to prostsze do wdrożenia w porównaniu do icosasphere i będzie bardziej wydajne, zarówno w obliczeniach, jak i zasobach.

Zobacz artykuły Seana O'Neila na temat generowania wszechświata proceduralnego na Gamasutrze:
- Część 1 Hałas Perlina i Fraktalny ruch Browna dla map wysokości i tekstur.
- Część 2 Algorytm ROAM dla siatki proceduralnej z DLOD do generowania planet. Cierpi na problemy z wydajnością. Niezalecane, ale dobre dla wartości edukacyjnej.
- Część 3 Rozwiązuje problemy z ogromną skalą, optymalizacją i zagadnieniami zmiennoprzecinkowymi. Głównie związany ze skalą wszechświata, ale ma również zastosowanie do planet przy przechodzeniu ze skal lat świetlnych na centymetry, jeśli chcesz.
- Część 4 Omówiono implementację DLOD z kwadratowym (quad-tree) DLOD do generowania planet <- zobacz w szczególności ten artykuł

Logika rozmyta
źródło
0

Nie jestem ekspertem od programowania, ale możesz mieć jakiś punkt kontrolny. Gdy zostaniesz oczyszczony przez punkt kontroli bezpieczeństwa, z animacją oczywiście, powierzchnia planety może się załadować i na odwrót.

Aidan.W
źródło
Pozwala to obejść ten problem, otwierając opcję nie projektowania powierzchni planety jako kuli, ale nie rozwiązuje jej.
Filip