sprawozdanie

Transkrypt

sprawozdanie
Rafał Grzelak
Proceduralne generowanie treści w grach
komputerowych.
22.03.2013
W niniejszej prezentacji opowiem o mojej pasji - grach komputerowych. Dokładniej to tylko o
jednym z wielu aspektów ich tworzenia, a ściślej mówiąc o jednym z aspektów ich
programowania. Pokażę czym jest, na czym polega, i jak jest wykorzystywane proceduralne
generowanie treści w grach komputerowych.
Dla ułatwienia będę używał akronimu PCG - Procedural Content Generation.
Warto też wspomnieć jako ciekawostkę, że PCG nie ma swojej taksonomii. W literaturze
występuje zazwyczaj przy okazji innych tematów, mimo że zagadnienie jest stare jak same
komputery.
Czym jest generowanie proceduralne?
Bardzo ogólnie mówiąc generowanie proceduralne jest to tworzenie czegoś przy pomocy
określonych procedur programowych.
Dla przykładu weźmy układ współrzędnych i naniesioną na niego graficzną reprezentację funkcji
liniowej. Jak wiemy, prosta linia w matematyce to zbiór nieskończenie wielu odpowiednio
ułożonych punktów, jednak w algorytmice zbiór jest skończony czyli zdyskretyzowany.
W dużym uproszczeniu prosta została narysowana przy użyciu skończonej ilości pikseli, których
położenie zostało wyliczone za pomocą równania.
Czy jest to zatem generowanie proceduralne? Absolutnie. Do wyświetlenia prostej posłużyły
przecież jasno określone procedury.
Czym jest PCG?
Powyższy przykład jest dobry na początek, ale trzeba przyznać, że raczej mało ciekawy.
Znacznie ciekawsze jest tworzenie bardziej złożonych treści. Chcę opowiedzieć o szczególnym
rodzaju treści - o „Game Content” do którego m.in. zaliczamy:
• tekstury
• modele
• dźwięki
• muzyka
• czcionki
• efekty
• animacje
• poziomy
Podział PCG.
Jak już mówiłem wcześniej dziedzina ta nie ma swojej taksonomii. Nie ma więc oficjalnego
podziału czy jakichkolwiek unormowanych definicji. W różnych źródłach mówi się o wielu
rożnych podziałach. Moim zdaniem niektóre mają sens, inne nie, ale i tak ze względu na
ograniczony czas powiem tylko o dwóch według mnie najważniejszych, a przynajmniej
najłatwiej dostrzegalnych, podziałach algorytmów PCG:
● ontogenetyczne i teleologiczne1
W skrócie algorytmy ontogenetyczne próbują odwzorować końcowy wynik fizycznego procesu
bez emulowania kroków pośrednich, natomiast algorytmy teleologiczne starają się symulować
sam proces, który doprowadził do pożądanego wyniku.
Oba te podejścia można stosować wymiennie, ale za każdym razem gdy będziemy chcieli
stworzyć coś proceduralnie wykorzystamy jedno z nich.
● online i offline
Ten podział jest również bardzo prosty. Algorytmy online generują treść w czasie rzeczywistym
podczas gdy algorytmy offline tworzą go z wyprzedzeniem np. w trakcie wczytywania programu.
Podstawowe zagadnienia potrzebne do rozpoczęcia zabawy z PCG:
● L-system (system Lindenmayera) - rodzaj gramatyki formalnej służący do tworzenia
graficznych tworów o fraktalnej budowie. L-system poza alfabetem, produkcjami i
symbolem początkowym zawiera także mechanizm konwersji ciągów do struktur
geometrycznych (np. technika żółwia). Wykonywany iteracyjnie.
●
Szum Perlina - generuje prymityw teksturowy, który wygląda na losowy, ale ma stałej
wielkości detale. Dzięki temu, że losowość jest bardziej uporządkowana, jak w naturze,
można go dowolnie transformować i wykorzystywać do wielu rzeczy np. tworzenia
realistycznie wyglądających tekstur.
Szum simpleksowy - uproszczona wersja szumu Perlina. Efekt jest trochę bardziej
„sztuczny”, ale za to zyskuje się ogromne przyspieszenie obliczeń.
●
Diagram Voronoia - podział płaszczyzny w przestrzeni dwu- lub trójwymiarowej. Dla
danego zbioru N punktów dzieli się płaszczyznę na N obszarów, w taki sposób, że każdy
punkt w dowolnym obszarze znajduje się bliżej określonego punktu niż wszystkich
pozostałych punktów
1 http://cowboyprogramming.com/2007/01/02/teleological-vs-ontogenetic/
Proceduralne wygenerowanie wyspy w kilku krokach:
1. Diagram Voronoia – podział płaszczyzny na N obszarów.
2. Relaksacja Lloyda – wycentrowanie punktów wewnątrz obszarów, a następnie ponowne
wygenerowanie diagramu Voronoia. Operacja jest powtarzana aż do uzyskania
satysfakcjonującego dla nas efektu.
3. Podział obszarów na dwie grupy, ląd i wodę, poprzez aproksymacje jakiegoś kształtu np.
bitmapy wygenerowanej przy użyciu szumu Perlina.
4. Tworzenie mapy wysokości. Przykładowy algorytm: im dalej od brzegu wyspy, tym
wyżej.
5. Tworzenie mapy wilgotności. Przykładowy algorytm: im dalej od wody, tym mniejsza
wilgotność.
6. Biomy. Bazując na mapach wysokości i wilgotności można zastosować diagram
Whittakera do wyznaczenia biomów.
7. Seria szumów i wygładzeń w celu poprawienia odbioru wizualnego.
a) Szum Perlina w celu 'poszarpania'
krawędzi biomów.
b) Rozmycie krawędzi.
c) Wygładzenie.
d) Więcej szumu Perlina.
8. Utworzenie szczytów bazując na mapie wysokości. Wartość wysokości, tj. kolor na
mapie wysokości, bezpośrednio powiązany z osią Y.
Zalety i wady PCG.
Raczej oczywisty jest powód stosowania PCG przy tworzeniu gier. Treści wygenerowane
algorytmicznie są tańsze, teoretycznie wymagają mniej czasu, mniejszego wkładu ludzkiego,
pozwalają na większą różnorodność, oszczędzają przestrzeń dyskowa itd.
Zalet PCG jest na pewno dużo. Można się zastanawiać, czemu wszystko nie jest generowane
proceduralnie? Gry będą o wiele bardziej rozbudowane i atrakcyjne, prawda?
Na proceduralnie wygenerowanej wyspie jest proceduralny las składający się z proceduralnych
drzew. W lesie znajdziemy proceduralnie stworzony labirynt w którym płonie proceduralnie
wygenerowanym ogniem pochodnia, tworząc chmury proceduralnego dymu.
Rzeczywistość nie jest jednak aż tak różowa. Przede wszystkim wypracowanie odpowiednich
algorytmów jest w praktyce trudniejsze niż na papierze. Człowiek potrafi dość łatwo wykryć
które treści zostały wygenerowane, a które stworzone manualnie. Im bardziej wyrafinowany
algorytm tym trudniej to dostrzec, jednak skomplikowanie algorytmów pociąga za sobą
wymagania sprzętowe. Procedury muszą działać w rozsądnym czasie, żeby mogły być
wykorzystane w grach, stąd uproszczenia. Uproszczenia natomiast oznaczają, mniej lub
bardziej, dostrzegalne wzorce.
Powtarzalność nie zawsze jest dużym problemem. Powstały gry, które ominęły ją w sprytny
sposób - pozwoliły użytkownikowi na ingerencje w treść. Dzięki takiemu zabiegowi gracz nie
dba o to, czy treść jest oryginalna, ale skupia się na jej modyfikacji. Przykładami takiego
podejścia są gry „sandboxowe” np. Minecraft czy Terraria.
Podsumowanie.
Proceduralne generowanie treści jest bardzo powszechnie wykorzystywaną techniką przy
tworzeniu gier komputerowych. Pomimo swoich wad i niedoskonałości cieszy się coraz większą
popularnością wśród twórców, ponieważ pozwala na redukcję kosztów i przyspieszenie
produkcji gier. Rosnąca moc obliczeniowa komputerów osobistych i konsol do gier pozwala na
stosowanie coraz bardziej złożonych algorytmów, dających coraz to lepsze efekty.