1 Rafał Rudnicki Vertex 2010 system do animacji postaci w grach komputerowych
2 plan prezentacji ważne pytania cele systemu animacji obliczanie klatki interpolacja graf animacji zapętlanie animacji przejścia wyzwalacze wdrażanie animacji i przykładowe rozwiązanie Rafał Rudnicki Vertex 2010
3 ważne pytania czy będziemy korzystać z motion capture? czy tylko animacje tworzone ręcznie? czy interesuje nas fizyka animacji / efekty IK? czy postać będzie składała się z kilku siatek? czy chcemy mieć jej bounding-boxa i czy ma być to AABB czy OBB? czy chcemy mieć ładne przejścia między animacjami? czy sami je zrobimy? czy chcemy mieć animacje proceduralne (np. postać chodzi ale mierzy ręką w stronę wroga)? Rafał Rudnicki Vertex 2010
4 cele systemu animacji animacja oparta o animację kości oddzielenie wyglądu siatki od jej animacji łatwe dodawanie obsługi animacji postaci do istniejącego kodu gry 3D oddzielenie animacji od logiki animacji umieszczene animacji i logiki animacji w zasobach tak, by unikać potrzeby rekompilacji kodu gry proste sterowanie animacją Rafał Rudnicki Vertex 2010
5 cele systemu animacji (2) płynna animacja (maksymalne) wykorzystanie GPU Rafał Rudnicki Vertex 2010
6 animacja animowane modele = model + animacja dla podejścia mesh skinning (w tym SSD) kluczowy jest szkielet szkielet = pozycje i orientacje kości + hierarhia kości Rafał Rudnicki Vertex 2010
7 obliczanie klatki animacji w pliku - jak trzymać kości? –w przestrzeni rodzica –w przestrzeni modelu przestrzeń rodzica: –lepsza interpolacja międzyklatkowa w przypadku łańcuchów kości (uwzględnia obrót rodzica) –szkelet przetwarzany BFS/DFS od korzenia – słabe zrównoleglanie przestrzeń modelu –można przetwarzać równolegle –nie umożliwia efektów typu IK liczonych realtime –jeżeli nie potrzebne nam IK to oszczędzimy sporo mocy Rafał Rudnicki Vertex 2010
8 obliczanie klatki animacji (2) skąd pochodzą dane: –z pliku –z modułu fizyki / AI –z mixu różnych źródeł liczy się aby co klatę otrzymać zestaw macierzy dobry system animacji nie rysuje niczego – zestaw końcowych macierzy (+ inne dane) wystarcza = przenośność i elastyczność Rafał Rudnicki Vertex 2010
9 obliczanie klatki animacji (3) geometria dopasowuje się do szkieletu SSD (Skeletal Subspace Deformation) –uwaga na błędy na łokciu / kolanie Rafał Rudnicki Vertex 2010
10 obliczanie klatki animacji (4) w praktyce wystarczają max. 4 kości na wierzchołek (tak zrobił ID Software w MD5) co bardzo cieszy GPU animacja dzieje się w Vertex Shaderze np. GLSL: skinned_position += weights.x * (boneMatrices[int(matrixIndices.x)] * gl_Vertex); skinned_position += weights.y * (boneMatrices[int(matrixIndices.y)] * gl_Vertex);... Rafał Rudnicki Vertex 2010
11 interpolacja klatek dane animacji mają skończoną dokładność mając dane dot. klatki m i n musimy: –obliczyć chwile t n i t m odpowiadające tym klatkom –obliczyć w jakim stopniu (0 – 1) zmiksować dane potrzeba przechowywać dane m i n –wraz ze zmianą klatki obliczać tylko te, które nie są jeszcze wyliczone/które się zmieniły –być może m i n będą dotyczyć różnych animacji Rafał Rudnicki Vertex 2010
12 interpolacja klatek (2) Rafał Rudnicki Vertex 2010
13 interpolacja klatek (3) Rafał Rudnicki Vertex 2010
14 interpolacja klatek (4) Rafał Rudnicki Vertex 2010
15 interpolacja klatek (5) efekt interpolacji międzyklatkowej: –płynniej –mniejsza ilość danych (do 8x niezauważalna) –mniejsza szczegółowość animacji Rafał Rudnicki Vertex 2010
16 interpolacja klatek (6) macierze czy inne reprezentacje? (w SSD) przed wysłaniem należy przemnożyć przez odwrotną macierz kości w rest pose Rafał Rudnicki Vertex 2010
17 interpolacja klatek (7) macierze: –3x4 lub 4x4 dobre dla GPU –słabo się intepolują (liniowo wzór jest skomplikowany, w praktyce nie da się bez konwersji na inne typy) wektor pozycji + wektor Eulerowski / axis-angle: –dobre dla GPU –słabo interpolowane (błędy) wektor + kwaternion –przed wysłaniem do GPU należy przerobić na macierz –bardzo dobrze interpolowane (lerp + slerp) Rafał Rudnicki Vertex 2010
18 interpolacja klatek (8) pozycja – interpolowana liniowo (lerp, mix) – zachowanie prędkości liniowej orientacja – interpolowana sferycznie (slerp, mix) – zachowanie prędkości kątowej Rafał Rudnicki Vertex 2010
19 grafy animacji typowa gra akcji: –stanie, bieg do przodu, odskok do tyłu, chodzenie do przodu, skakanie, pochylenie się, chodzenie pochylonym, krok w prawo / lewo, atak bronią palną, atak bronią krótką, zmiana broni, radość po zabiciu, przeżywanie bólu, śmierć dla gracza liczy się zarówno jakość animacji jak i czas trwania przejścia –wojny o to, by w FPP przejścia były krótkie – zmiana broni w Quake III to 0.6s Rafał Rudnicki Vertex 2010
20 grafy animacji (2) prosty przykład: ile trwa oryginalna animacja walk/stand_cycle? ile może trwać? Rafał Rudnicki Vertex 2010
21 zapętlanie animacji (cykle) w zależności od źródła danych: –jeżeli animację tworzymy ręcznie to mamy szansę ją idelanie zapętlić –jeżeli źródłem jest motion capture to nie –tak samo przy animacjach proceduralnych Rafał Rudnicki Vertex 2010
22 zapętlanie animacji (cykle) (2) rozwiązanie – self fading (wygładzanie) musimy je robić od pierwszego przejścia przez koniec pętli (podczas pierwszego przejścia przez początek pętli jest dobrze) parametr - długość Rafał Rudnicki Vertex 2010
23 zapętlanie animacji (cykle) (3) Rafał Rudnicki Vertex 2010
24 przejścia gracz naciska klawisz (wyzwalacz) animacja dochodzi do pewnego momentu (może być natychmiast) (opcjonalnie) odgrywane jest przejście do nowego stanu animacji odtwarzana jest nowa animacja Rafał Rudnicki Vertex 2010
25 przejścia (2) automatyczne wyznaczanie przejść w systemach opartych o motion capture skomplikowane.. ;/ Rafał Rudnicki Vertex 2010
26 przejścia (3) problem: ile to trwa? czy jest grywalne? po podzieleniu cyklu na kilka części można szybciej dojść do przejścia –np. prawa-lewa noga, lewa-prawa noga dla chodzenia idealnie pozwolić na natychmiastowe odtwarzanie przejścia –ale w wielu przypadkach źle to wygląda skomplikowanie (ilość animacji/przejść) ~ 1/jakość Rafał Rudnicki Vertex 2010
27 przejścia (4) problem 2: nie da się natychmiast przejść z animacji leżenia do animacji biegania problem 3: nie da się z biegu natychmiast zatrzymać Rafał Rudnicki Vertex 2010
28 przejścia (5) cześć przejść można wyliczyć, część trzeba samemu stworzyć –dla animacji mocap można je łatwo zdobyć efekt: –przejść jest duuużo –animacje cykli muszą być porozdzielane na wiele kawałków –należy stworzyć graf legalnych przejść pomiędzy węzłami (logika animacji) –ciężko to utrzymać i sporo się trzeba napracować Rafał Rudnicki Vertex 2010
29 przejścia (6) parametry: –długość (czasem definiuje początek i koniec) –charakterystyka czasowa Rafał Rudnicki Vertex 2010
30 przejścia (7) Rafał Rudnicki Vertex 2010
31 wyzwalacze kiedy przejść? –input od gracza –fizyka –AI –koniec animacji funkcja bool fun(void) – wyzwalacz rejestracja wyzwalaczy – mapa Rafał Rudnicki Vertex 2010
32 wyzwalacze (2) kiedy przejść? –zaraz po naciśnięciu –odczekać do przejścia co jeżeli wyzwalacz został uruchomiony po idealnym momencie? –przejść z mniejszą długością –czekać na następny Rafał Rudnicki Vertex 2010
33 wdrażanie animacji do gry np. Blender: stworzenie modelu / animacji –być może skorzystanie z animacji mocapowych eksport do wybranych formatów (opcjonalny edytor:) stworzenie przejść stworzenie logiki przejść (grafu) silnik gry / kod gry: uaktualnianie pozy wyświetlanie Rafał Rudnicki Vertex 2010
34 wdrażanie animacji do gry (2) przykładowy eksporter Rafał Rudnicki Vertex 2010
35 wdrażanie animacji do gry (3) edytor Rafał Rudnicki Vertex 2010
36 wdrażanie animacji do gry (4) Rafał Rudnicki Vertex 2010 pSModelData md = loadModelDataFromFile("ludwig.model"); model = createModelFromModelData(md); pSGraphData gd = loadGraphDataFromFile("ludwig_walk- run_lowres_2.graph"); pSGraph graph = createGraphFromGraphData(gd); pSAnimation animation = createNullAnimation(); setAnimationGraph(animation, graph); setAnimationSource(animation, AnimationSource::GRAPH); setAnimationStartND(animation, "walk_passing P-L"); registerTransitionTrigger("KEYUP_A", checkKeyUpA); registerTransitionTrigger("KEYDOWN_A", checkKeyDownA);... setAnimationState(animation, AnimationState::PLAY);
37 wdrażanie animacji do gry (5) Rafał Rudnicki Vertex 2010 // kod w pętli czasu... advanceAnimation(animation, time - lastTime); updateModel(animation, model);... // kod w funkcji wyświetlającej... glLoadIdentity(); drawAnim(model, transformMatrix);...