Avatar
Napisane przez Opublikowane 13 marzec 2011

Generowanie terenu

Avatar
Minecraft Polska 13 marzec 2011

1) Jak ogromny jest świat ?
Wpierw postawię sprawę jasno: mapy nie są nieskończone, ale nie mają też konkretnych ograniczeń.
Poprostu będą coraz większe w miarę oddalania się. Teren jest generowany, zapisywany, ładowany i, tak jakby, redenderowany w kawałkach wielkości 16x16x128 bloków.
Te kawałki mają wartość przesunięcia, która jest 32 bitową liczbą całkowitą, mniej więcej w zakresie od 2 miliardów ujemnych do 2 miliardów dodatnich.
Jeśli udasz się w tym zakresie, około 25% odległości od miejsca, w którym jesteś, do słońca, wczytywanie i zapisywanie kawałków rozpocznie nadpisywanie starych kawałków.
W 16 części tej odległości rzeczy, które używają liczb całkowitych dla pozycji bloków, na przykład używanie
przedmiotów i odnajdywanie ścieżki, zaczną przepełniać się i zachowywać dziwnie.
I to są dwa poważne limity.

Większość innych rzeczy, jak podstawy/sedno (seeds) generowania terenu oraz lokalizacji jednostki, używa podwojonych 64 bitów
dla lokalizacji i robi wiele subtelniejszych rzeczy.
Na przykład gracz może poruszać się wolniej w najdalszych odległościach, aniżeli w pobliżu centrum świata, ze względu na
zaokrąglenie błędów (pozycja ma ogromną liczbę zmiennoprzecinkową (mantysa), niewielkie ruchy delta więc może szybciej się rozłączyć).
Generator terenu może również wygenerować dziwne struktury, takie jak ogromne bloki litego materiału, ale ostatnio nie widziałem ani nie zbadałem
dokładnie co sprawia, że tak się dzieje.

Głównym problemem długich dystansów jest to, że fizyka zaczyna wariować, więc gracz może przypadkowo
zapaść się pod ziemię lub utknąć w trakcie przechodzenia wzdłuż ściany.
Wiele z tych problemów można rozwiązać, zmieniając matematykę na lokalny model wyśrodkowany
wokół gracza, więc wszystkie liczby mają ogólnie ten sam rozmiar.
Do redenderowania, gra używa miejscowych koordynatów wewnątrz bloku oraz przesunięcia bloku względem gracza, co daje wrażenie ruchu.
Może to działać wskutek OpengGL, które wykorzystuje 32 bitowe platformy pozycyjne, lub też dlatego, że błędy zaokrąglenia
są ogromnie widoczne w trakcie wyświetlania na ekranie.
Najprawdopodobniej nie będziemy naprawiać tych błędów dopóki nie stanie się to wspólnym doświadczeniem graczy
podczas legalnego grania.
Mam przeczucie, że do tej pory nikt nie doświadczył tego ani nie doświadczy w przyszłości.
Dojście tak daleko zajmie wiele czasu. Poza tym błędy dodają tajemniczości i charyzmy Dalekim Lądom.

2) Czy wielkość terenu nie jest imponująca?

We wcześniejszej wersji Minecraft, używałem 2D Perlin Noise Heightmap, żeby ustawić kształt świata.
Lub raczej, użyłem kilku z nich. Jeden dla ogólnej wysokości, jeden dla chropowatości terenu i jeden dla miejscowych szczegółów.
Dla każdej kolumny bloków wysokość wynosiła: (wysokość + (chropowatość x szczegół)) x 64 + 64.
Zarówno wysokość jak i szorstkość były proste, tak duża skala szumów i szczegóły były bardziej zawiłe.
Zaletą tej metody jest szybkość, jako, że jest tylko 16*16*(noiseNum) próbek na kawałek do generowania.
Wadą może być nudność programu. Metoda ta nie generuje żadnych zawieszeń.
Tak więc zamieniłem ten system na podobny, oparty na 3D Perlin Noise.
Zamiast próbować "wysokość ziemi", potraktowałem wartoś szumu jako "gęstość", gdzie cokolwiek poniżej 0 nie byłoby niebem, natomiast powyżej bądź równe 0 nie byłoby ziemią.
Aby mieć pewność, że dolna warstwa jest solidna a górna nie, dodałem wysokość (zrównoważony przez poziom wody) do wyników próby.
NIestety, od razu wpadłem na problemy związane z wydajnością i grywalnością.
Problemy z wydajnością z powodu ogromnych ilości próbek do wykonania.
Problemy z grywalnością spowodowane były brakiem płaskich powierzchni bądź wzgórz.
Rozwiązaniem okazało się być poprostu pobieranie próbek w niższej rozdzielczości (skalowane 8x w poziomie, 4x w pionie) i dokonanie interpolacji liniowej.
Momentalnie w grze pojawiły się płaskie tereny, gładkie wzgórza, a większość pojedyńczych, unoszących się bloków zniknęła.
Dokładny wzór, którego używam jest trochę zawiły (i tajny!), ale powoli ewoluował w trakcie pracy nad grą.
Wciąż w użyciu jest wysokość 2D i szumowanie map także.

Wciąż przed nami na temat generacji terenu:

Strefy klimatyczne
Jaskinie i duże elementy
Drzewa, jeziora i małe elementy
Nether !



Zapraszamy do rozmowy na FORUM 

Tekst orginalny: The Word of Notch 9.03.11r


Oceń artykuł
5 1 1 1 1 1 Ocena 5.00 (1 ocena)
Udostępnij