Często spotykam się ze stwierdzeniem “Gry symulują świat rzeczywisty”. Najczęściej to sformułowanie tyczy się właśnie fizyki, która jest zastosowana w grach i sprawia wrażenie mniej lub bardziej realistycznej. Jednak to nie jest do końca prawda.

Przede wszystkim my jako developerzy nie tworzymy symulacji i w naszym produkcie też nie występuje. Z symulacją mamy do czynienia wtedy, kiedy przy pomocy odpowiedniego aparatu matematycznego robi się dokładne obliczenia, jak ma się zachowywać dany obiekt, gdy działają na niego różnego rodzaje siły (grawitacja, tarcie, uderzenie w inny obiekt itp.). W grze mamy zaś do czynienia z czymś, co ma WYGLĄDAĆ jak fizyka w świecie rzeczywistym, co pozwala na uproszczenie wielu obliczeń, a co za tym idzie nie można tego nazwać symulacją.

Istnieje możliwość zaprogramowania silnika fizycznego w taki sposób, by rzeczywiście tworzył symulację. Problemem wtedy okazuje się wydajność konsol oraz komputerów, które posiadają gracze. Nawet gry stricte symulatorowe, choć fizyka w nich wydaje się bardzo realistyczna, to korzysta z uproszczeń na rzecz optymalizacji. Mając już za sobą uściślenie, że gry nie robią symulacji, a tworzą jedynie coś, co wizualnie ma ją przypominać (patrząc w przyszłość z czasem zapewne się to zmieni), możemy zacząć odpowiadać na pytanie “jak się projektuje fizykę do gry?”.

Zanim zaczniemy cokolwiek robić, trzeba ustalić jak fizyka w grze ma działać i jak bardzo ma być podobna do tej rzeczywistej. Co to dokładnie oznacza? Przede wszystkim trzeba określić gatunek gry. W grze symulatorowej będzie ona bardzo realistyczna, by jak najdokładniej oddać realia tego, co chcemy przedstawić. Dla przykładu produkcja rajdowa-symulatorowa będzie kładła duży nacisk na to, jak ma się zachowywać samochód w zależności od parametrów pojazdu (mocy silnika, rodzaju opon itd.), rodzaju podłoża oraz pogody.

Przypomnijmy, że często tego rodzaju gry posiadają niższy poziom trudności tzw. zręcznościowy, gdzie fizyka pojazdu jest uproszczona w taki sposób, by łatwiej się go prowadziło, aby każdy mógł się cieszyć z rozgrywki. Innym przykładem gier, które mają różną realizację fizyki są produkcje spod gatunku RPG. Niektóre mają stosunkowo realistyczną fizykę wynikającą np. z faktu specyficznych czarów (np. fala uderzeniowa, która odpycha przedmioty i wrogów). Inne mają tę fizykę stosunkowo umowną, gdzie tylko niektóre rzeczy można poruszać lub działa ona tylko na zasadzie grawitacji, która “ciągnie” gracza w dół.

Ciekawym przypadkiem są tu też gry, które w ogóle nie używają fizyki, a wszystkie akcje, które mają wyglądać na fizyczne są odtwarzane przy pomocy animacji. Ma to swoje uzasadnienie, gdy chcemy zawsze otrzymać identyczny efekt w każdym przypadku. Inna też fizyka panuje w bijatykach. W nich fizyka ma być efektowna, by można było niekiedy wyprowadzać stosunkowo długie kombinacje ciosów w powietrzu, które pomimo tego, że łamią rzeczywiste prawa fizyki, to mają wyglądać na prawdopodobne.

Jak widać duże znaczenie ma to jaką grę chcemy stworzyć, jednak trzeba pamiętać, że fizyka nie ogranicza się tylko do poruszania przedmiotów, obiektów czy też całych postaci. Ma ona też za zadanie pokazać oddziaływania poszczególnych elementów postaci w zależności od tego, jak się poruszają. Najlepszym przykładem tego typu interakcji są włosy oraz niektóre elementy ubrań (np. peleryny). Gdy postać się porusza w danym kierunku lub spada element fizyczny (jakimi właśnie mogą być włosy i elementy ubioru) musi reagować na to podążając za postacią. W większości grach można ten element zrobić przy pomocy animacji, jednak gdy postać może mieć bardzo dużo różnych stanów akcji, jak na przykład w bijatykach, to wybiera się rozwiązanie fizyczne. Dzięki temu oszczędza się czas pracy animatorów, mimo to ich zadaniem jest ustawienie elementów, by zachowywały się naturalnie.

Do stworzenia fizyki gry, nie tylko potrzebujemy ustalenia gatunku gry, którą tworzymy, ale też tego jakie i ile elementów fizycznych ma zawierać. Mając już informacje o tym możemy przejść dalej. Kolejnym etapem projektowania jest wybór narzędzi, przy pomocy których będziemy realizować fizykę. W większości przypadków naszym głównym narzędziem jest SDK silnika fizycznego wbudowanego w silnik graficzny, którego używamy. W popularnych silnikach takich jak Unreal, czy Unity jest zaimplementowany już silnik fizyczny odpowiadający za grawitację, kolizje oraz oddziaływania pomiędzy obiektami posiadającymi masę i jakąś energię. Przy silnikach autorskich jest różnie.

Niekiedy jest wykorzystywany inny gotowy silnik fizyczny (np. PhysX od Nvidii, w silniku graficznym Unity to właśnie ten silnik fizyczny jest używany, lecz nie w swojej pełnej krasie) lub jest on pisany od podstaw przez programistów, jednak tematem jest projektowanie fizyki, a nie jej tworzenie, więc pozwolę sobie opuścić to zagadnienie. Jak widać wybór narzędzi potrzebnych do zaprojektowania fizyki nie jest szczególnie trudny, bo jakby nie patrząc mały jest w tym nasz wybór, a raczej odgórnie narzucany przez silnik graficzny, którego używamy. Wybór narzędzia nie oznacza, że jesteśmy ograniczani co do możliwości.

Współczesne silniki fizyczne są na tyle uniwersalne, że nie mają problemów z różnymi rodzajami gier. W dużej mierze możemy oddać zarówno to, jak zachowuje się samochód rajdowy jadący po błocie, jak i łyżeczkę spadającą ze stołu na podłogę. I dokładnie to jest nam potrzebne do kolejnego etapu projektowania, czyli konkretny element, do którego chcemy zrobić oddziaływanie fizyczne. Dzięki temu, że silnik fizyczny niejako za nas robi wszystkie obliczenia dotyczące kolizji i poszczególnych oddziaływań pomiędzy obiektem a środowiskiem, to jednak my decydujemy jaki to jest przedmiot i to jak ma on oddziaływać na inne. To jest zadanie i łatwe, i trudne zarazem.

Z jednej strony wiem z jakim przedmiotem mam do czynienia, z jakiego jest materiału i wiem, co się z nim dzieje, kiedy upada na podłogę. Jednak nie zawsze to co wiemy ze świata rzeczywistego może być przełożone jeden do jednego do świata wirtualnego. Więc co trzeba zrobić, by dobrze przełożyć fizykę świata rzeczywistego, by w świecie wirtualnym wyglądało to realistycznie?

Pierwszą rzeczą jaka jest nam potrzebna do rozpoczęcia prac nad “ufizycznianiem” danego przedmiotu jest jego analiza. Potrzebujemy paru jego parametrów, a pierwszym jest masa przedmiotu. To ona decyduje jak mocno będzie oddziaływać na inne obiekty oraz to, ile siły będzie potrzebne, by go poruszyć. Kolejnym elementem jest to, z czego jest zrobiony. Nie potrzebujemy znać dokładnego materiału, lecz to jak oddziałuje na inne przedmiotu. Głównie chodzi tu o tarcie.

Każdy materiał fizyczny posiada parametr tarcia. Jeśli przyjmuje zero, to jest śliski jak lód, zaś gdy parametr wynosi jeden, to ma tak duże tarcie, że wytraca siłę każdego obiektu, który wejdzie z nim w kolizję. Tutaj trzeba pamiętać, że tarcie musi być większe niż można by wywnioskować z obserwacji w świecie prawdziwym. Wynika to z faktu, że w świecie wirtualnym nie ma czegoś takiego jak powietrze, więc tarcie wynikające z aerodynamiki jest tutaj zerowe i nie istnieje. Nic jednak nie szkodzi na przeszkodzie, by dodać tarcie powietrza, jednak robienie tego dla każdego obiektu fizycznego w grze może poskutkować spadkiem wydajności nawet na najwydajniejszych komputerach, dlatego prościej i optymalniej jest zwiększyć tarcie samego przedmiotu.

Kolejnym elementem analizy jest to, czy przedmiot ma jakieś unikalne cechy. Dla przykładu unikalną cechą zawiasu jest to, że tak właściwie składa się z dwóch metalowych części połączonych ze sobą. Do uzyskania odpowiedniego efektu trzeba skorzystać z dodatkowych możliwości silnika fizycznego. Możliwością tą są tzw. połączenia. W silniku Unity mamy takie połączenia jak:

  • Fixed joint – które jest połączeniem stałym dwóch obiektów fizycznych, są wtedy one niejako przyspawane do siebie nawzajem.
  • Hinge joint – połączenie to działa na zasadzie zawiasu. Łączy ze sobą dwa obiekty, gdzie jeden obraca się wokół drugiego. Można ustawić maksymalny kąt, do którego dany przedmiot może się obrócić oraz czy może mieć sprężynę, dzięki której będzie starać się powrócić do konkretnego kąta, względem drugiego obiektu po tym jak inny obiekt dla przykładu w niego uderzy.
  • Spring joint – czyli połączenie sprężynowe. Krótko mówiąc działa na zasadzie sprężyny. Można ustawić jej parametry takie jak długość, sprężystość oraz opór (wytracanie energii).
  • Configurable joint – jest to połączenie, które od początku do końca jest konfigurowane przez nas.

Wymieniłem tu główne rodzaje, które mogą się różnić w zależności od silnika fizycznego. Mając już wszystkie parametry możemy przedmiot “obudować” nimi w edytorze. Tak zrobiony przedmiot będzie się zachowywał poprawnie w większości przypadków. Jednak są przypadki, kiedy przedmiot może zacząć wibrować i dostawać siły z różnych źródeł. Najczęściej przyczyną tego jest tzw. clipping.

Clipping to przechodzenie przez siebie obiektów fizycznych, gdzie te chcąc oddalić się, dodają wzajemnie siły do nieskończoności powodując dziwne zachowanie się obiektów. Da się jednak tego uniknąć, przy pomocy “warstw fizycznych”. Aby użyć tego narzędzia dany przedmiot musi znajdować się na odpowiedniej warstwie w edytorze. Warstwy powinny zawierać w sobie przedmioty konkretnego rodzaju, gdzie ten rodzaj jest determinowany przez to jak mają oddziaływać z graczem. Dlatego obiekty podłoża powinny być na innej warstwie niż obiekty, z którymi gracz może wejść w bezpośrednią interakcję.

Wracając jednak do problemu clippingu, w edytorze warstw fizycznych można ustalić, które warstwy będą oddziaływać między sobą. Dzięki temu można uniknąć problemu clippingu i to jest najprostszy sposób jaki podałem. Innym sposobem jest odpowiednie dostosowanie colliderów (krótko mówiąc są to niewidzialne dla gracza obiekty, które są mniej więcej w kształcie danego obiektu i to one są podstawą do obliczania kolizji i interakcji między obiektami fizycznymi), bo jest możliwość, że to właśnie one są źle dopasowane, jednak robienie ich odpowiedniej precyzji mocno wydłużyłoby proces tworzenia gry, jak i trzeba pamiętać o fakcie, że im bardziej skomplikowany Collider tym więcej obliczeń trzeba zrobić stąd też w ramach optymalizacji są one mniej dokładne.

Takie zaprojektowanie fizyki choć zajmuje dosyć sporo czasu ma to do siebie, że efekt końcowy jest bardzo zadowalający. Nie wszystko zostało tu opowiedziane (głównie rzeczy stricte technicznych). Brakuje tu niektórych elementów, takich jak otrzymać lepsze efekty łamiąc przy tym prawa fizyki z rzeczywistości w ramach różnych “sztuczek”. Dobrym przykładem będą tu niektóre rodzaje wybuchów. By zrobić ładny i efektowny wybuch daje się samej eksplozji mniejszą siłę, lecz wszystkim obiektom dookoła wyłącza się oddziaływanie grawitacji.

Oczywiście z realizmem ma to mało wspólnego jednak efekt końcowy daje nam ładną filmową eksplozję, a to jest głównym zadaniem fizyki w grze. Dawać ładny efekt końcowy, który nie jest symulacją. Oraz tego co ostatecznie może zająć najwięcej czasu, czyli testowania tego typu rozwiązań. Ale to jest już temat na inny artykuł.

Zapraszamy do dyskusji