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.