370 likes | 494 Views
system do animacji postaci w grach komputerowych. 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. ważne pytania.
E N D
system do animacji postaci w grach komputerowych Rafał Rudnicki Vertex 2010
plan prezentacji • ważne pytania • cele systemu animacji • obliczanie klatki • interpolacja • graf animacji • zapętlanie animacji • przejścia • wyzwalacze • wdrażanieanimacji i przykładowe rozwiązanie Rafał Rudnicki Vertex 2010
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
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
cele systemu animacji (2) • płynna animacja • (maksymalne) wykorzystanie GPU Rafał Rudnicki Vertex 2010
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
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
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
obliczanie klatki animacji (3) • geometria dopasowuje się do szkieletu • SSD (Skeletal Subspace Deformation) • uwaga na błędy na łokciu / kolanie Rafał Rudnicki Vertex 2010
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
interpolacja klatek • dane animacji mają skończoną dokładność • mając dane dot. klatki m i n musimy: • obliczyć chwile tn i tm 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
interpolacja klatek (2) Rafał Rudnicki Vertex 2010
interpolacja klatek (3) Rafał Rudnicki Vertex 2010
interpolacja klatek (4) Rafał Rudnicki Vertex 2010
interpolacja klatek (5) • efekt interpolacji międzyklatkowej: • płynniej • mniejsza ilość danych (do 8x niezauważalna) • mniejsza szczegółowość animacji Rafał Rudnicki Vertex 2010
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
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
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
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
grafy animacji (2) • prosty przykład: • ile trwa „oryginalna” animacja walk/stand_cycle? • ile może trwać? Rafał Rudnicki Vertex 2010
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
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
zapętlanie animacji (cykle) (3) Rafał Rudnicki Vertex 2010
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
przejścia (2) • automatyczne wyznaczanie przejść w systemach opartych o motion capture • skomplikowane.. ;/ Rafał Rudnicki Vertex 2010
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
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
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
przejścia (6) • parametry: • długość (czasem definiuje początek i koniec) • charakterystyka czasowa Rafał Rudnicki Vertex 2010
przejścia (7) Rafał Rudnicki Vertex 2010
wyzwalacze • kiedy przejść? • input od gracza • fizyka • AI • koniec animacji • funkcja bool fun(void) – wyzwalacz • rejestracja wyzwalaczy – mapa <string, callback> Rafał Rudnicki Vertex 2010
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
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
wdrażanie animacji do gry (2) • przykładowy eksporter Rafał Rudnicki Vertex 2010
wdrażanie animacji do gry (3) edytor Rafał Rudnicki Vertex 2010
wdrażanie animacji do gry (4) pSModelData md = loadModelDataFromFile("ludwig.model"); model = createModelFromModelData(md); pSGraphDatagd = 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); Rafał Rudnicki Vertex 2010
wdrażanie animacji do gry (5) // kod w pętliczasu ... advanceAnimation(animation, time - lastTime); updateModel(animation, model); ... // kod w funkcji wyświetlającej ... glLoadIdentity(); drawAnim(model, transformMatrix); ... Rafał Rudnicki Vertex 2010