Jak renderować nieskończony wszechświat?

15

Jestem ciekawy, jakie są najlepsze praktyki w branży tworzenia gier, aby renderować wszechświat 3d?

Być bardziej specyficznym:

  • Punkty danych są podane i statyczne. Każdy punkt ma pozycję, kolor i rozmiar;
  • Cały zestaw danych jest znacznie większy niż dostępna pamięć;
  • Użytkownik powinien mieć możliwość „pomniejszenia”, aby zobaczyć większy obraz naraz;

Najbardziej naiwnym podejściem byłoby podzielenie wszechświata na kostki i renderowanie tylko tego, co jest widoczne. Nie jestem pewien, jak w tym scenariuszu powinienem zastosować „oddalenie”. Czy powinienem wstępnie obliczyć kostki dla każdego możliwego poziomu powiększenia? A może istnieją lepsze podejścia?

Szukam rozwiązania agnostycznego technologii.

Anvaka
źródło
2
Czy planujesz mieć jakąś maksymalną odległość widzenia, czy masz jakiś sposób łączenia odległych punktów, abyś nie musiał renderować ich indywidualnie, czy też są one „nieprzejrzyste” i ułożone tak, że większość z nich będzie ukryć się przed jakimś punktem widzenia? Ponieważ jeśli żadna z powyższych nie zostanie utrzymana, nie widzę żadnego sposobu, aby uniemożliwić użytkownikowi znalezienie kątów kamery, z których większość punktów (lub przynajmniej znaczna ich część) będzie widoczna w tym samym czasie.
Ilmari Karonen
4
Nawiasem mówiąc, trochę egzotyczne, ale czy rozważałeś dane generowane proceduralnie? Nie masz korzyści z niestandardowych obszarów tworzenia, ale wynik jest taki, że treść opiera się na równaniach, a nie dużych ilościach danych. Przy odrobinie kreatywności może to uprościć wiele rzeczy (:
Alan Wolfe
1
Pomniejszanie / powiększanie dla infinite universemoże być podobne do śledzenia relacji między dwoma punktami na niektórych krzywych Mandelbrota po powiększeniu do różnych poziomów. Na pewnym poziomie możesz stracić precyzję i nie będziesz w stanie ich rozróżnić ani nawet zlokalizować ponownie.
user2338816
1
@AlanWolfe Niestandardowe wytwarzanie jest nadal możliwe - najlepszym przykładem są stare gry Frontier, które miały rzeczywiste pozycje gwiazd dla około 1000 gwiazd lub tak blisko Sol (w tym Sol i jego rzeczywistych planet i księżyców). Po prostu upewnij się, że znajdują się w miejscach, które nie są generowane proceduralnie, i dodaj je jako kolejną „warstwę”.
Luaan
@IlmariKaronen tak, masz rację. Mam maksymalną odległość widzenia i pomyślałem, że
scalę

Odpowiedzi:

8

Opiera się to na moich spekulacjach i przeglądaniu kodu źródłowego Celestii.

Celestia pozwala latać wokół planety i oddalać, aby zobaczyć całą galaktykę. Przejrzałem kod źródłowy i stwierdziłem, że użył oktree, struktury rekurencyjnie dzielącej przestrzeń na 8 oktantów.

Mechanizm renderujący wyrenderowałby środowisko, przechodząc przez oktawę i nie przechodząc głęboko przez dalekie obiekty.

Celestia śledzi także bezwzględną wielkość oktanta, gdzie bezwzględna wielkość oktanu jest oparta na bezwzględnej wielkości gwiazd wewnątrz oktany. Jeśli oktant jest blisko siebie, Celestia renderuje gwiazdy pojedynczo, a jeśli oktant jest daleko, Celestia renderuje oktantę jako jedną gwiazdę wielkości oktanta.

Ponadto do obiektów może być dołączona znacząca hierarchia. Na przykład, jeśli jesteś blisko (promień zadeklarowany w bazie danych) do gwiazdy, jej planety są renderowane. Jeśli planeta jest wystarczająco blisko (odcięcie pikseli na ekranie), jej model 3D jest rysowany.

Inne gry kosmiczne, które mogę wymienić, to Orbiter i Kerbal Space Program, które są zamknięte. Zajrzałem także do Galerii Granicy, która ma generowaną proceduralnie mapę gwiazd. Istnieje strona internetowa analizująca działanie gry poprzez jej demontaż: http://www.jongware.com/galaxy1.html

Ming-Tang
źródło
12

Ta łamigłówka składa się z wielu elementów, z których każdy zapewni głęboką i interesującą króliczą dziurę eksploracji. Niektórzy z nich są:

  • Poziom szczegółowości - automatycznie (lub „ręcznie”) wybierając szczegółowe lub uproszczone modele, a nawet duszki lub tylko kropki lub obiekty, ponieważ znajdują się one dalej.
  • Culling - wybranie tylko tego, co jest potrzebne. Może to być to, co znajduje się w polu widzenia (ubijanie skorupy), co nie jest ukryte za innymi rzeczami (ubijanie okluzji) lub inne metody ad hoc. (Odpowiedź @Alan Wolfe opisuje niektóre sposoby organizowania danych, które pomagają w uboju).
  • Streaming - pobieranie danych światowych z pamięci do pamięci w razie potrzeby, jeśli nie wszystkie mieszczą się w pamięci jednocześnie
  • Sky box - bardzo odległe obiekty można wstępnie renderować na kulę znajdującą się w „nieskończonej odległości” od kamery.

A twój własny tajny sos będzie kombinacją tych i innych technik, których używasz i kiedy, w zależności od twoich szczególnych potrzeb aplikacji.

David Van Brink
źródło
2

Wszystko, co jest hierarchiczne i / lub rzadkie, powinno ci w tym pomóc.

Jest dużo pustej przestrzeni, więc nie trzeba używać pamięci do reprezentowania pustej przestrzeni. Typowym podejściem hierarchicznym byłoby coś w rodzaju drzewa Oct, które rekurencyjnie dzieli przestrzeń na 8 mniejszych kostek, i można przechowywać obiekty w najmniejszej kostce, którą mogą całkowicie zajmować.

Oktra jest również całkiem dobra, ponieważ możesz zapytać ją o listę wszystkich obiektów w widoku widoku, co pozwoli ci uzyskać listę tylko tych obiektów, które znajdują się w twoim kącie widzenia i nie są zbyt odległe. Rzadkie rozwiązanie może być czymś w rodzaju rzadkiej siatki, w której możesz poprosić o informacje na temat dowolnej lokalizacji x, y, z, ale musisz przechowywać informacje tylko dla komórek, które nie są puste.

Inne powszechnie stosowane podejścia hierarchiczne obejmują drzewa bsp (rekurencyjnie dzielą spację na 2 pół spacje), a także drzewa kd, które robią podobnie.

Osobiście uważam, że ósemka może być dla ciebie dobrym początkiem, upewniając się, że dzielisz tylko tak głęboko, jak to konieczne, abyś nie marnował pamięci na puste miejsce. możesz też chcieć innego rozwiązania dla obiektów statycznych niż obiektów dynamicznych.

Niektóre rozwiązania (np. Bsp) mogą być bardzo wydajne, ale ich budowa zajmuje dużo czasu, więc zazwyczaj nie są dobrym wyborem do przenoszenia / zmiany obiektów.

Mam nadzieję, że to pomoże, daj mi znać, jeśli masz jakieś pytania dotyczące szczegółów!

Alan Wolfe
źródło