Wykład 12. Animacja postaci
W grach komputerowych i wideo stosowane są następujące rodzaje animacji postaci: duszki i animacja tekstury (sprite animation) morfing (morph target animation) animacja hierarchii brył sztywnych (rigid hierarchical animation) animacja szkielet-skóra (skinned animation)
Animacja duszków (sprite animation), ze względu na jej prostotę i niskie koszty pamięciowo-obliczeniowe, była dominującą techniką animacji w erze gier 2D, ale również stosowana była w pierwszych grach 3D (np. Doom). Sprite reprezentowany jest przez czworokąt, na który nakładana jest tekstura z kanałem alfa zawierająca właściwy obraz obiektu 2D. Animacja duszka polega na cyklicznej podmianie tekstur nakładanych na czworokąt, które reprezentują sobą kolejne klatki animacji. W dzisiejszych grach komputerowych duszki (animowane i statyczne) są również wykorzystywane: w naturalny sposób grach 2D, zaś w grach 3D głównie do reprezentowania obiektów odległych od obserwatora i/lub obiektów niewielkich (np. cząstki w systemach cząstek, tłumy wiwatujące na stadionie, hordy wojowników walczących w bitwie oglądanej z dalekiej odległości). Dziesiejsze API graficzne OpenGL i DirectX oferują funkcjonalność dedykowaną sprite om, która pozwala przesyłać do potoku graficznego sprite y reprezentowane przez pojedyncze punkty (zamiast przez cztery wierzchołki na sprite).
Morfing jest animacją obiektów 3D reprezentowanych przez siatki trójkątów, która polega na deformowaniu tych siatek poprzez odpowiednie przekształcenia ich wierzchołków. W grach komputerowych/wideo wykorzystywana jest odmiana tej animacji określana jako animacja bazująca na celach morfingu (morph target animation). Cele morfingu tworzą (zwykle stosunkowo niewielki) zbiór siatek trójkątów utworzonych przez animatora, w którym każda z siatek reprezentuje pewną ustaloną, pozę krańcową (extreme pose) animowanego obiektu. Sama animacja polega na wyznaczaniu póz pośrednich animowanego obiektu poprzez liniową interpolację pomiędzy odpowiednimi wierzchołkami siatek dwóch lub więcej póz krańcowych. Animacja bazująca na celach morfingu na ogół stosowana jest w grach do animowania twarzy postaci. Należy zauważyć, że technika ta jest zwykle kosztowna pod względem pamięciowym ze względu na konieczność przechowywania w pamięci siatek póz krańcowych (w szczególności wziąwszy pod uwagę złożoność geometryczną modeli stosowanych w dzisiejszych grach).
Animacja hierarchii brył sztywnych jest pierwszą formą animacji postaci 3D oraz prekursorem animacji szkieletowej. W podejściu tym: postać reprezentowana jest przez kolekcję brył sztywnych. bryły te powiązane są ze sobą w hierarchiczny sposób na analogicznych zasadach jak to ma miejsce w przypadku kości szkieletu kręgowców do reprezentowania hierarchii powiązań wykorzystywana jest struktura drzewa, którego każdy węzeł reprezentuje bryłę wraz ze stawem (joint) łączącym tę bryłę z bryłą nadrzędną (w przypadku węzła korzenia nie ma bryły nadrzędnej)
Każdy węzeł przechowuje geometrię bryły i ortonormalny ukł. wsp. lokalnych zapisany w ukł. wsp. skojarzonym z węzłem nadrzędnym (innymi słowy macierz przekształcenia ze wsp. lokalnych do wsp. węzła nadrzędnego) lokalny ukł. wsp. korzenia jest tożsamy z ukł. wsp. modelowania i jest on zapisany w ukł. wsp. świata (innymi słowy World matrix) środek każdego (pomijając korzeń) lokalnego ukł. wsp. tożsamy jest z miejscem połączenia (stawem) bryły potomnej z bryłą nadrzędną Animacja polega na dokonywaniu odpowiednich obrotów brył względem ich stawów (początków lokalnych ukł. wsp.), przy czym dzięki zastosowaniu lokalnych ukł. wsp. zapisanych względem ukł. wsp. brył nadrzędnych obrót bryły nadrzędnej pociąga obrót brył potomnych (por. aktualizacja hierarchii przekształceń grafu sceny Wykład 10).
Zalety: sprawdza się dobrze (niejako z definicji) dla obiektów reprezentujących różnego rodzaju maszyny i roboty w odróżnieniu od animacji bazującej na morfingu, animacja hierarchii brył ma znacznie mniejsze wymagania pamięciowe w celu reprezentowania póz obiektu w pamięci należy przechowywać jedynie macierze reprezentujące lokalne układy wsp. związane ze stawami (tych ostatnich jest na ogół znacznie mniej niż wierzchołków siatek celów morfingu) Wady: efekty zastosowania animacji hierarchii brył sztywnych jako metody animowania modeli reprezentujących organizmy żywe są zwykle niezadawalające problem ciągłości połączeń między bryłami sztywnymi brak wizualnej elastyczności, która zwykle cechuje części ciała organizmów żywych
Animacja szkielet-skóra (skinned animation) łączy w sobie zalety animacji bazującej na morfingu z zaletami animacji hierarchii brył sztywnych podobnie jak w morfingu, animowane obiekty posiadają cechę ciągłości i elastyczności ich powierzchni, która zwykle charakteryzuje organizmy żywe koszty pamięciowe związane z przechowywaniem póz obiektu są tego samego rzędu jak w animacji hierarchii brył sztywnych Animacji szkielet-skóra opiera się na zastosowaniu struktury szkieletu składającego się z kości (bones), które są połączone ze sobą hierarchicznie za pomocą stawów (joints) w podobny sposób, jak to ma miejsce w hierarchii brył sztywnych.
Jednakże kości-stawy szkieletu NIE są wizualizowane służą one do przekształcania wierzchołków siatki trójkątów, która reprezentuje skórę (skinned mesh). Każdemu wierzchołkowi siatki-skóry przypisanych jest k ustalonych kości-stawów szkieletu, gdzie k jest stałe dla wszystkich wierzchołków siatki (zwykle k {1,..., 4}). Zmiana położenia kości-stawów związanych z danym wierzchołkiem pociąga za sobą zmianę lokalizacji tego wierzchołka w przestrzeni modelu siatki-skóry (skinning).
Szkielet jest drzewiastą hierarchią kości-stawów. Z każdym ze stawów skojarzony jest ortonormalny układ współrzędnych o początku w stawie. Układy współrzędnych stawów definiowane są zwykle w tzw. pozie łączenia (bind pose, T-pose) względem układu wsp. modelowania siatki-skóry, na etapie przypisywania tej siatce szkieletu.
Jeśli b X, b Y, b Z są wersorami (w postaci kolumnowej) ukł. wsp. i-tego stawu zapisanymi w ukł. wsp. modelowania skóry, zaś o jego początkiem, to macierz jednorodna B i = [b X, b Y, b Z, o] określa przekształcenie z ukł. wsp. stawu do ukł. wsp. skóry. Stąd, macierz odwrotna B i 1 określa przekształcenie z ukł. wsp. skóry do ukł. wsp. i-tego stawu. Przekształcenie określone macierzą B i 1 będziemy nazywali transformacją łączenia i-tego stawu (bind pose transformation) z siatką.
Pozy szkieletu uzyskiwane są poprzez przekształcanie układów współrzędnych związanych ze stawami, w przestrzeni współrzędnych stawów rodziców. (Jednakże układ wsp. stawu po przekształceniu pozostaje niezmieniony z punktu widzenia ukł. wsp. modelowania siatki, tj. macierze B i 1 pozostają stałe.) W celu łatwego przekształcania ukł. wsp. stawów względem ukł. wsp. ich rodziców, pozy szkieletu reprezentowane są przez lokalne ukł. wsp. stawów, zdefiniowane względem lokalnych ukł. wsp. ich rodziców. Taki sposób reprezentowania ukł. wsp. i-tego stawu jest tożsamy ze zdefiniowaniem przekształcenia P i parent(i) z lokalnego ukł. wsp. stawu do lokalnego ukł. wsp. stawurodzica. Przekształcenia P i parent(i) określane są niekiedy jako pozy lokalne stawów (joint local pose). Poza lokalna P 0 M stawu-korzenia jest odwzorowaniem z lokalnego ukł. wsp. tego stawu do ukł. wsp. modelowania siatki skóry (czyli P 0 M = B 0 ) i dla każdej pozy szkieletu jest takie samo. Pozą globalną stawu nazywamy przekształcenie z lokalnego ukł. wsp. stawu do ukł. wsp. modelowania skóry. Wobec powyższego, poza globalna P i M i-tego stawu wyraża się przez złożenie póz lokalnych stawów na ścieżce drzewa od tego stawu do korzenia: P i M = P 0 M... P parent(i) parent(parent(i)) P i parent(i)
Poza szkieletu jest w pełni określona przez pozy lokalne tworzących go stawów. Wyznaczanie pozy pośredniej szkieletu dokonywane jest przez system animacji silnika gry i polega na dokonywaniu odpowiedniej interpolacji pomiędzy różnymi (zdefiniowanymi w fazie modelowania przy użyciu odpowiedniej aplikacji, np.: Maya, 3D Studio) pozami kluczowymi szkieletu (keyframe animation). Proces interpolacji póz kluczowych dokonywany jest poprzez interpolowanie, póz lokalnych (a NIE póz globalnych) odpowiadających sobie stawów póz kluczowych. Sama interpolacja póz lokalnych stawów realizowana jest na poziomie transformacji elementarnych tworzących daną pozę, tj. transformacji obrotu, translację i ew. skalowanie (jednorodne, rzadziej niejednorodne). Z tego względu pozy lokalne stawów przechowywane są w tzw. formacie SQT: o o o skalowanie reprezentowane przez współczynnik (lub współczynniki) skalowania interpolowane liniowo (lerp) obrót reprezentowany kwaternionem interpolowane przy użyciu liniowej interpolacji sferycznej (slerp) wektora translacji interpolowane liniowo (lerp)
Z kolei, pozy globalne stawów (wyznaczane w oparciu o pozy lokalne stawów - patrz poprzednie slajdy) potrzebne są obliczenia tzw. palety macierzy wykorzystywanej w procesie nakładania siatki-skóry na aktualną pozę szkieletu (skinning). Wobec powyższego, daną pozę szkieletu wygodnie reprezentować jest w postaci struktury zawierającej zarówno tablicę póz lokalnych stawów, jak i tablicę póz globalnych stawów:
W celu nałożenia siatki-skóry na aktualną pozę szkieletu, dla każdego stawu wyznacza się tzw. macierz skinningu K i, która jest złożeniem macierzy P i M pozy globalnej stawu z macierzą B i 1 transformacji łączenia stawu : K i = P i M B i 1 Macierz B i 1 sprowadza wsp. wierzchołka siatki-skóry ze wsp. modelowania do ukł. wsp. i-tego stawu, zaś macierz P i M sprowadza ukł. wsp. i-tego stawu w aktualnej pozie do ukł. wsp. modelowania siatki-skóry. Zatem w wyniku przekształcenia dowolnego wierzchołka v siatki skóry macierzą K i otrzymamy wierzchołek v, który posiada następujące własności: z punktu widzenia ukł. wsp. i-tego stawu jest w takiej samej pozycji jak w fazie łączenia jednakże, ponieważ sam ukł. wsp. i-tego stawu uległ przekształceniu P i M względem ukł. wsp. siatki-skóry, zatem v zajmuje inne położenie w przestrzeni modelowania siatki-skóry aniżeli wierzchołek v. Innymi słowy, przekształcenie wierzchołka v macierzą K i jest tożsame z tym, że i-ty staw oddziałuje na ten wierzchołek w ten sposób, że wierzchołek podąża za ruchem tego stawu w ukł. modelowania skóry siatki. Macierze skinningu związane ze stawami tworzą tzw. paletę macierzy (matrix pallete) danej pozy szkieletu.
W rzeczywistych zastosowaniach, z każdym z wierzchołków siatki-skóry wiąże się co najwyżej 4 oddziałujące na ten wierzchołek stawy. Nowa pozycja v (we wsp. modelowania siatki-skóry) wierzchołka v siatki-skóry pod wpływem oddziałujących na ten wierzchołek stawów o indeksach i1,..., ik (k 4) wyznaczana jest poprzez zastosowanie tzw. mieszania wierzchołka (vertex blending) v = w 1 K i1 v +...+ w k K ik v, gdzie w 1 +...+ w k = 1 są nieujemnymi wagami określającymi siłę odziaływania danego stawu na wierzchołek v. Wobec powyższego, deklaracja atrybutów wierzchołka siatki-skóry ma zwykle postać:
W programowalnym potoku graficznym operacja skinningu może być dokonywana w shaderze werteksów. W takim rozwiązaniu, shader werteksów otrzymuje na wejście: paletę macierzy wyznaczoną po stronie CPU przez system animacji silnika gry dla aktualnej pozy szkieletu ponieważ paleta jest stała dla wszystkich wierzchołków siatki-skóry, przekazywana jest ona do shadera jako zmienna uniform indeksy stawów oddziałujących na dany wierzchołek oraz wagi tych odziaływań przekazywane są indywidualnie dla każdego wierzchołka jako jego atrybuty. Jednakże rozwiązanie takie na kartach graficznych poniżej standardu Shader Model 4 implikuje m.in. następujące ograniczenia: ograniczona liczba stawów-kości spowodowana ograniczoną liczbą rejestrów przeznaczonych na przechowywanie zmiennych uniform uniemożliwia wyznaczanie cieni metodą brył cieni
Pełna sekwencja póz kluczowych szkieletu w chwilach czasu t i <0, T> stanowi podstawę dla systemu animacji silnika gry do wyznaczenia pozy pośredniej dla zadanej, dowolnej chwili czasu należącej do <0, T>. Z punktu widzenia implementacji systemu animacji, funkcjonalność tę realizują zwykle obiekty określane jako kontrolery animacji. Oprócz generowania póz pośrednich na podstawie zarejestrowanej w kontrolerze sekwencji póz kluczowych, kontroler animacji na ogół oferuje możliwość mieszania ze sobą dwóch lub więcej animacji (animation blending) z różnymi wagami. Jedna z możliwych metod mieszania animacji opiera się na analogicznych zasadach, jak te wykorzystywane do wyznaczania póz pośrednich. Sprowadza się ona do określenia pozy pośredniej mieszanych animacji na podstawie póz szkieletu wyznaczonych dla tych animacji przez kontroler w zadanej chwili i następnie dokonaniu interpolacji póz lokalnych odpowiadających sobie stawów w wyznaczonych pozach szkieletu.
Po wyznaczeniu pozy szkieletu w zadanej w chwili czasu przez kontroler animacji, pozę tę zwykle należy odpowiednio skorygować w kontekście lokalnej geometrii otoczenia. Fazę tę często określa się jako przetwarzanie końcowe animacji (animation post-processing). Kinematyka odwrotna (inverse kinematics) stosowana jest w celu umieszczenia wskazanego stawu (end effector) w zadanym położeniu w przestrzeni oraz wyznaczeniu odpowiednich obrotów stawów nadrzędnych, przy zadanych ograniczonych przedziałach kątów tych obrotów. Problem ten występuje np. gdy postać przemieszcza się po nierównym terenie bez dokonania odpowiedniej korekcji, stopy postaci będą nienaturalnie zagłębiały się w lub unosiły się nad powierzchnią terenu. Jednym z najczęściej stosowanych w grach algorytmów IK jest iteracyjny algorytm cyklicznego dochodzenia do współrzędnych (CCD Cyclic Coordinate Descent).
Fizyka szmacianych lalek (ragdoll physics) stosowana jest w grach w celu oddania dynamiki postaci pod wpływem działających na nią sił (np. grawitacji) zwykle po jej wirtualnej śmierci. W dzisiejszych grach komputerowych i wideo, dynamika lalki realizowana jest zwykle przez istniejący silnik fizyczny (np. Havoc, PhysX). Sama lalka na poziomie silnika fizycznego reprezentowana jest jako kolekcja brył sztywnych (np. walce, kapsułki, kule) powiązanych ze sobą specjalnymi więzami (constraints), które symulują stawy ludzkiego ciała. Po wyznaczeniu położenia brył sztywnych w danej chwili t przez silnik fizyki, informacja ta wykorzystywana jest do aktualizacji położenia i orientacji odpowiednich stawów szkieletu na poziomie systemu animacji silnika gry. Niemniej należy zauważyć, że ze względów wydajnościowych oraz stabilności obliczeń fizycznych, liczba brył sztywnych tworzących lalkę jest na ogół mniejsza od liczby stawów-kości szkieletu. W takich okolicznościach, tworzy się odpowiednie odwzorowanie stawów-kości szkieletu na bryły lalki, które następnie wykorzystywane jest do w/w aktualizacji lokalizacji tych stawów.