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.
infinite universe
moż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.Odpowiedzi:
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
źródło
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ą:
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.
źródło
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!
źródło