Czym jest proceduralna generacja?

18.08.2024
Czym jest proceduralna generacja? Teoria

Minecraft, Terraria, Rimworld, Rust, Noita… Wiecie co łączy te gry? Strasznie je lubię. Ale przede wszystkim ogromne, unikalne światy, które możemy stworzyć jednym kliknięciem, a które jednocześnie przytłaczają swoim rozmiarem i złożonością. W Minecrafcie możemy w parę sekund stworzyć świat, który składa się z milionów bloków, podobnie zresztą w Terrari. Natomiast w Rust każdy serwer ma swoją własną, unikalną wyspę, która dodatkowo co jakiś czas się zmienia. Niektóre gry mają światy tak gigantyczne, że nie da się ich zwiedzić w całości – choć we wspomnianym Minecrafcie to mało prawdopodobne, to już w No Man’s Sky gdzie wita nas galaktyka 18 kwintylionów (a konkretnie 18,446,744,073,709,551,616) planet jest to po prostu niewykonalne. Naturalnie nasuwa się pytanie:

Przecież nie ma takiej możliwości, aby ktokolwiek ręcznie postawił te wszystkie miliony brył, rysował codziennie kilkaset map czy wyrzeźbił kwintyliony planet. Podejrzewam, że nawet stażyści na bezpłatnym stażu mieliby z tym nie lada problem!

Wiecie co robią leniwi programiści jak nie chce im się czegoś robić? Piszą kod, który robi to za nich. Tak robią studenci informatyki, którzy nie mają ochoty wstawać rano, żeby zapisać się na wykłady na kolejny semestr – piszą skrypty, które robią to za nich (potwierdzone info). Podobnie robią twórcy gier, którzy nie mają ochoty rzeźbić kwintyliona planet ręcznie – piszą kod, który to robi. A konkretniej korzystają z przeróżnych technik, w tym algorytmów proceduralnego generowania.  To stwierdzenie może brzmieć złowrogo poprzez słowo “algorytm” i “proceduralny”, ale te słowa oznaczają nic innego jak “krok po kroku, wedle określonego schematu (procedury)”. Takich algorytmów jest wiele, każdy z nich posiada zestaw swoich zastosowań i każdemu z nich poświęcę kilka osobnych artykułów – na razie wystarczy nam wiedza że takie istnieją, i że to nie żadne czary-mary, a parę sprytnie napisanych linijek kodu.

Jednak co dokładnie oznacza “Tworzenie światów”? Czy te algorytmy to jakaś sztuczna inteligencja i czy to oznacza, że artyści nie muszą już tworzyć rysunków ani modeli trójwymiarowych? Niezupełnie. Weźmy jako przykład grę “Rust” (nie mylić z językiem programowania o tej samej nazwie!). Tak wyglądają przykładowe mapy z lotu ptaka z kilku różnych rozgrywek:

Można zauważyć w nich podobne cechy np. występującą strefę pustynną, leśną i zimową. Każda mapa jest wyspą, jednak same mapy znacząco się od siebie różnią. Algorytm krok po kroku decyduje o kształcie świata, następnie o umiejscowieniu plaż, lasów i gór, a także o rozmieszczeniu osad, formacji skalnych, fauny i flory. Do każdego z tych etapów wykorzystywane są różne techniki, o których szczegółowo opowiem w kolejnych materiałach.

Na podstawie tych samych wygenerowanych reguł co w dwuwymiarowej mapie, tworzony jest świat 3D, w którym ma miejsce rozgrywka. Jednakże to artyści musieli wcześniej przygotować indywidualne modele wszystkiego co widzimy – drzew, kamieni, traw itp. Można powiedzieć, że graficy przygotowali “klocki”, z których zostanie później zbudowany świat wedle określonych reguł – czyli z odpowiednio dobranych przez programistów algorytmów proceduralnego generowania. Tak wygląda już wygenerowana mapa, tym razem z punktu widzenia gracza:

Oczywiście to jest przykład jednej gry, rozwiązania i wykorzystanie algorytmów różnią się w zależności od potrzeb, ale powyższy schemat możemy zauważyć w grach zdecydowanie najczęściej – choćby w Minecrafcie czy Terrarii. 

Jeśli dalej wydaje Ci się to niejasne to można to zobrazować w ten sposób: gdyby dać kilku osobom ten sam zestaw klocków LEGO i poprosić ich o zbudowanie średniowiecznego zamku, każdy zbudowałby nieco inny zamek, ale najprawdopodobniej konstrukcje byłyby do siebie podobne, ponieważ do ich budowy użyto takich samych klocków. W tym przykładzie klocki to obiekty uprzednio przygotowane przez artystów, a budowniczy to algorytm.

Zaczęliśmy z grubej rury, ale algorytmy proceduralnego generowania służą nie tylko do tworzenia całych światów w grach wideo, ale także do ich indywidualnych elementów. Poza ukształtowaniem terenu, możemy ich użyć do generacji tekstur, animacji czy choćby obiektów takich jak drzewa. Ba, nawet historia świata może być stworzona proceduralnie tak jak w przypadku gry Dwarf Fortress, gdzie nie tylko cały świat jest tworzony algorytmicznie, ale także przeszłość cywilizacji go zamieszkujących!

Dwarf Fortress

Choć wymienione wyżej Rust i Dwarf Fortress są niemalże w całości generowane proceduralnie, również w grach gdzie świat jest elementem stałym występują elementy tworzone dynamicznie – w zjawiskowym Ghost of Tsushima takie techniki są użyte do generowania i animowania trawy, w pirackim Sea Of Thieves do odwzorowania przepięknej wody a w voxelowym Teardown do… niszczenia czegokolwiek co widoczne na ekranie.

Można zauważyć, że algorytmy proceduralnego generowania używane są tam, gdzie ciężko byłoby coś wykonać w dużej skali “ręcznie”. Podobnie jak z całymi światami, ciężko wyobrazić sobie, że ktoś ręcznie miałby sadzić indywidualne źdźbła trawy, animować nieskończone morze czy symulować miliardy możliwych kombinacji zniszczenia terenu.

Odnoszę wrażenie, że ostatnimi czasy gry korzystające z takich rozwiązań przeżywają swego rodzaju renesans – powstało wiele ciekawych produkcji, które z nich korzystają, oferując niespotykany wcześniej poziom nieliniowości. Co ważne – gry te najczęściej tworzone są przez niezależnych twórców i odnoszą ogromny komercyjny sukces popularyzując tym samym nowy sposób rozgrywki – choć teraz trudno w to uwierzyć to Minecraft początkowo był tworzony przez jednego, niezależnego twórcę, a teraz ciężko znaleźć osobę, która nie słyszałaby o tej grze. Rust i Rimworld to również przykłady gier tworzonych przez niewielkie studia,  które dzięki proceduralnym światom zapewniły sobie niemalże nieskończoną regrywalność i ogromny sukces komercyjny.

Rimworld

Podsumowywując, algorytmy proceduralnego generowania to ogół różnych technik programistycznych służących do automatycznego tworzenia przeróżnych treści; odpowiednio wykorzystane zdolne są do tworzenia całych światów w grach lub ich indywidualnych części takich jak trawa, woda czy otoczenie, które możemy zniszczyć. Takich technik jest wiele, jednakże są one tylko szablonem – podobnie jak z budowlą z klocków Lego prawdziwym wyzwaniem będzie nie zrozumienie ich samych, a użycie naszej wyobraźni do zastosowania ich w praktyce.

W kolejnych artykułach przyjrzymy się bliżej poszczególnym technikom; opowiem Wam jak wykorzystać Szum Perlina do generowania wysp, wody i innych efektów, Cellular Automata do symulacji spadającego piasku a’la Terraria, Wave Function Collapse do generowania map wedle określonych przez nas reguł, czy też jak sadzić drzewa na mapie przy pomocy Poisson Disc Sampling. Podobnych technik i ich wariacji jest znacznie więcej, a tylko od nas zależy do czego ich użyjemy. Części tych algorytmów nie tłumaczę na nasz język celowo – łatwiej znaleźć źródła na stronach zagranicznych. A poza tym – części chyba lepiej nie tłumaczyć. “Kolaps funkcji falowej” nie brzmi zbyt zachęcająco, no chyba że chcesz zrobić wrażenie na znajomych!

To ja, Kuba

To ja, Kuba

Chcesz być na bieżąco z algorytmami i śmieszkami?

Zapraszam na moje social media!

Ostatnie wpisy

Szum Perlina

W poprzednich artykułach wspominałem czym są szumy i jak są wykorzystywane do tworzenia proceduralnych światów, a dzisiaj przyjrzymy się dokładniej konkretnemu algorytmowi z “rodziny szumów”, a mianowicie - “Szumie Perlina” (Perlin Noise). Tak więc bierz meliskę, włącz sobie swój ulubiony...

20.10.2025
Czytaj więcej