Animations in games Animazioni cinematiche
Transcript
Animations in games Animazioni cinematiche
Video Games Dev - 2015/2016 29/01/2016 Animations in games (of 3D Solid Objects) Designed / scripted Procedural (PHYSIC ENGINE) (ASSETS) Rigid Pre-made transforms Rigid body dynamics Articulated Skeletal Animations Ragdolling Free form (generic) deformable object simulation Blend-Shapes usually too expensive Inverse kinematics Cloth/ garments Ropes Arrivandoci per gradi… Animazioni cinematiche spazio oggetto ruota 2 t1 spazio oggetto ruota 1 spazio oggetto automobile t0 spazio oggetto automobile Marco Tarini - Univ. Insubria spazio mondo (globale) 1 Video Games Dev - 2015/2016 29/01/2016 Arrivandoci per gradi… animazioni cinematiche posizonamento della automobile (rispetto al mondo) posiz. della ruota (rispetto all’ automobile) spazio mondo T0 spazio macchina 1 T1 T1,1 T1,2 T1,3 T1,4 Animazione: trasformazioni spazio ruota 1.1 time Un robot animato… T4 busto2 T5 spalla Dx Marco Tarini - Univ. Insubria collo T1 T1,1 T1,2 T1,3 T1,4 … t1 T1 T1,1 T1,2 T1,3 T1,4 … t2 T1 T1,1 T1,2 T1,3 T1,4 … spazio mondo T T0 T3 t0 root bone Robot (bacino) T1 busto1 gamba Sx bones T2 (“ossa”) gamba Dx T7 polpaccio Dx T6 spalla Sx T8 Trasf. locale del bone piede (“da piede a polpaccio”) Quella globale (“da piede a robot”): T2*T7*T8 piede Dx 2 Video Games Dev - 2015/2016 29/01/2016 Arrivandoci per gradi: Da assemblaggio di pezzi… Fin qui: una mesh per ogni osso (es, carlinga, ruota) Ok per oggetti meccanici con strutture semplici (macchina, braccio meccanico con 2 giunti…) Ma, per un “robot” di ~20-40 ossa? Mesh separate per braccia, avambraccia, falangi, falangine, falangette… Assemblaggio con le matrici (dopo modellazione 3D) molto scomodo. … a oggetti articolati Idea: mesh skinned 1 sola mesh per tutto il personaggio attributo per ogni vertice: indice di osso un modello 3D animabile! Ortogonalità modelli / animazioni! cioe’: ogni modello skinned: va su tutte le animazioni ogni animazione: applicabile a tutti i modelli “Skinning” della mesh (qui, ad 1 osso solo). (basta che si riferiscano ad una stesso scheletro) 500 modelli e 500 animazioni = 1000 oggetti in RAM invece di 500x500 combinazioni I task dell’artista digitale: “rigging”: definizione delo scheletro (riggers) definizione dello skinning su un modello (skinners) “animation”: definizione delle animazioni (animators) Marco Tarini - Univ. Insubria 3 Video Games Dev - 2015/2016 29/01/2016 … ad oggetti articolati deformabili Idea: poter legare 1 vertice a più ossa Trasformazione del vertice: interpolazione delle trasformazioni associate alle ossa scelte pesi interpolaz fissi (per quel vertice) Strutture dati: attributi X vertice Per ogni vertice: [ indice osso , peso ] x Nmax (Tipicamente, Nmax = 4 o 2, vedi dopo) “Skinning” della mesh (a Nmax ossa) Rig (o scheletro): struttura dati 1/2 Albero di ossa Osso: Spazio vettoriale (frame) in cui esprimere alcuni pezzi del personaggio (l’oggetto aniamato) es, in un umanoide: braccio, avambraccio, bacino, … (il significato biologico di “osso” non c’entra!) Spazio associato al root bone = = spazio oggetto (del personaggio) Scheletro di un personaggio umanoide medio: min ~20 ossa (tipicamente) normale: ~40 ossa. max: hundreds) Marco Tarini - Univ. Insubria 4 Video Games Dev - 2015/2016 29/01/2016 Posa: struttura dati Una trasformazione associata ad ogni bone i Trasformazione locale: (del bone i ) da: spazio osso i a: spazio osso del padre di i a volte, solo la componente “rotazione” (“ossa non estendibili”: estensione ossa def. nel rig, costante su tutte le pose) Posa: struttura dati Una trasformazione associata ad ogni bone i Trasformazione locale: (del bone i ) da: spazio osso i a: spazio osso del padre di i utili per costruire la posa Trasformazione globale: (del bone i ) a volte, solo la componente “rotazione” (“ossa non estendibili”: estensione ossa def. nel rig, costante su tutte le pose) da: spazio osso i nella posa data a: spazio osso root nella posa data Trasformazione finale: (per il bone i ) da: spazio root nella rest pose a: spazio root nella posa data (di destinaz) utili per applicare la posa alla mesh Marco Tarini - Univ. Insubria definita nel rig 5 Video Games Dev - 2015/2016 29/01/2016 Rig (o scheletro): struttura dati 2/2 Gerarchia (albero) di ossa 1. con un root bone on top Una posa speciale «rest pose» 2. i modelli 3D devono essere modellati in questa posa detta anche «T-pose», «T-stance», per lo stesso motivo per il quale le magliette a maniche corte sono dette T-shirt ;) From Rest Pose to a given pose bacino (root) bacino (root) R1 R3 rest pose busto 1 R3 gamba sx spalla dx gamba dx pose X R5 collo R6 spalla sx polpaccio dx R8 piede Dx busto 1 P3 R7 busto 2 R4 P1 P3 R2 gamba sx spalla dx gamba dx P7 busto 2 P4 P2 P5 collo P6 spalla sx polpaccio dx P8 piede Dx trasf. finale piede, da rest pose a posa X = P2 P7 P8 (R2 R7 R8)-1 = P2 P7 P8 (R8)-1(R7)-1 (R2)-1 Marco Tarini - Univ. Insubria 6 Video Games Dev - 2015/2016 29/01/2016 From Rest Pose to a given pose bacino (root) bacino (root) R1 R3 rest pose busto 1 R3 gamba sx spalla dx gamba dx pose X R5 R6 spalla sx collo polpaccio dx R8 piede Dx busto 1 P3 R7 busto 2 R4 P1 P3 R2 gamba sx spalla dx gamba dx P7 busto 2 P4 P2 P5 collo P6 polpaccio dx spalla sx P8 piede Dx same as trasf. finale piede, da rest pose a posa X = P2 P7 P8 (R2 R7 R8)-1 = P2 P7 P8 (R8)-1(R7)-1 (R2)-1 Bone transforms in a pose. E.g. for «right foot» bone: Local Transform: P8 from «right foot» to «right lower leg» Global Transform: P2 P7 P8 the object frame of the character, i.e. the frame of the root bone from «right foot» to «character» uses the Hierarchy of the Skeleton once its computed, Hierarchy no longer needed! Final Transform: P2 P7 P8 R8-1 R7-1 R2-1 from «character» in rest pose to «character» in dest. pose uses the Rest Pose of the Skeleton (R1 … RN) once its computed, Rest Pose no longer needed either! the space where mesh vertices are defined! Marco Tarini - Univ. Insubria 7 Video Games Dev - 2015/2016 29/01/2016 Posa (per uno scheletro dato) : struttura dati posa = array di trasformazioni (locali) definito per 1 dato rig! costo in ram: n_ossa x bytes_per_trasf Osso i Trasform[ i ] #0 (bacino, root) T[0] Local Transform #1 (spine) T[1] It includes: #2 (chest) T[2] • a Rotation: always! #3 (shoulder sx) T[3] • a Translation: maybe … … #10 (polpaccio) T[10] … … • a Scaling: maybe If not, use the one defined in the rest pose of the rig. ==> a pose cannot redefine bone lengths. If not ==> a pose cannot redef the size of the body part. Posa (per uno scheletro dato) : struttura dati in GPU posa = array di trasformazioni finali (per 1 dato rig! ) costo in ram: n_ossa x bytes_per_trasf Osso i Trasform[ i ] #0 (bacino, root) T[0] #1 (spine) T[1] #2 (chest) T[2] #3 (shoulder sx) T[3] … … #10 (polpaccio) T[10] … … calcolato in preprocessing come: R2 R7 (P7)-1 (P2)-1 trasformazioni locali trasformazioni finali Marco Tarini - Univ. Insubria (della rest pose o della posa data) 8 Video Games Dev - 2015/2016 29/01/2016 Skeletal Animation : struttura dati (CPU o GPU) Array 1D di pose (i keyframes dell’animaz skel) Costo RAM: (num keyframes) x (num ossa) x ( bytes x trasf) Ogni posa, un tempo dt rispetto all’inizio dell’animaz t0 A volte, looped e interpolaz primo keyframe con ultimo Skinned Mesh: struttura dati Una Mesh provvista di skinning Un per vertex attribute Per ogni vertice: [ indice osso , peso ] x Nmax volte es: Vertex 120 Bone Index 9 (Spine B) Marco Tarini - Univ. Insubria Weight 0.4 13 (Chest) 0.1 15 (Shoulder Right) 0.4 16 (Forearm Right) 0.1 9 Video Games Dev - 2015/2016 29/01/2016 Quanti link ad osso per vertice Dipende dal game engine! Nmax tipicamente: 1 (sottopezzi rigidi?) (no need to store weights!) 2 (cheap, e.g. su dispositivi mobili) 4 (top quality – standard) Decrementare Nmax ? in preprocessing (es task per un game tool) (perchè limite superiore a num link x verice?) Costo in performance Nmax trasformazioni finali da interpolare in GPU nel vertex shader es: Bone Index GPU = poco controllo: interpolaz fra Nmax trasf (costante) bones non utilizzati: peso 0 Costo in RAM (della scheda video) Weight 9 (Head) 1.0 -- 0.0 -- 0.0 -- 0.0 strutture dati semplici per GPU-RAM array a lungezza fissa: Nmax coppie (indice , peso) anche dove, localmente, ne basterebbero meno (es 1 osso solo, a peso implicitamente 1) Marco Tarini - Univ. Insubria 10 Video Games Dev - 2015/2016 29/01/2016 Skeletal animations: tre Assets (strutture dati) (riassunto) Rig (o skeletro) Tree di bones (ossa) Ogni bone => sistema di riferimento (in rest pose) (sistama dell’osso root = sistema oggetto) Skinned 3D Model Mesh con associazione vertici => bones Per vertice: [ indice osso , peso ] x Nmax Animazioni scheletali Sequenza di pose Posa = trasformazione locale Ɐ bone possibile formati file (per tutti e tre gli asset): .SMD (Valve), .FBX (Autodesk), .BVH (Biovision) Life of an Animation in a Game Engine DISK CENTRAL RAM GPU RAM Local Transforms LOAD IMPORT Animation File Animation Object Skeleton Skeleton Animation GPU Object Final Transforms Marco Tarini - Univ. Insubria 11 Video Games Dev - 2015/2016 29/01/2016 (Once again, Memory Management) DISK CENTRAL RAM Animation Animation Animation Animation Animation Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File Animation File File File File File File Mesh Mesh Object Mesh Object Mesh Object Mesh Object Animation Object Animation Object Animation Object Object Mesh Skeleton File Skeleton File File GPU RAM Mesh Mesh GPU Mesh GPU Object GPU GPU Animation Object Object Object GPU Object Mesh Skeleton File Skeleton File Object I task del Rigging e Skinning (di un modello 3D) Rigging – authoring del rig Skinning – authoring dello skinning definizione dello scheletro “paint” dell’attributo link (pesati) (in contesto movies: anche dei da vertici a ossa controlli che verranno usati per manipolarlo) Marco Tarini - Univ. Insubria 12 Video Games Dev - 2015/2016 29/01/2016 I task del Rigging e Skinning (di un modello 3D) task dei modellatori digitali! (aiutati / sostituiti da appositi strumenti) Rigging : definire uno scheletro (e una rest pose) in un insieme mesh, una volta per tutte rigger Skinning (di una mesh): painting associazione vertice ossa skinner Animation (di un rig) authoring delle animazioni (scheletali) More about this later + animator = skinned model skeletal animation (asset in GPU RAM) (asset in GPU RAM) animated model Real time “Skinning” task of the rendering engine, done in GPU Marco Tarini - Univ. Insubria 13 Video Games Dev - 2015/2016 29/01/2016 Skinning - how it works (in GPU) dest. pose x vertex skinning model in rest pose Bone: Weight: Transform: 0 bone a 0 1 bone b 1 2 bone c 2 3 bone d blend 3 1 a vertex (in rest pose) 83 Skinning - how it works (in GPU) dest. pose model in rest pose a vertex (in rest pose) Marco Tarini - Univ. Insubria p n p n deformed model vertex (in dest pose) 14 Video Games Dev - 2015/2016 29/01/2016 GPU real time Skinning – two variants (a choice of the rendering engine) Bone: Weight: bone a bone b bone c bone d 0 1 2 3 Transform: 0 1 blend 2 3 How this is done? linear interpolation of matrices: “Linear Blend Skinning” (old school, still very much used) quaternion based interpolation: “Dual Quaternion Skinning” (more complex, fewer artifacts) Applicare le pose: Linear Blend Skinning Per ogni vertice della mesh: interpolaz. delle trasformaz. legate dal rigging al vertice N max xP = ∑ wiT [bi ] ( xR ) i =1 computaz a bordo della scheda video (in GPU) posiz del vertice definito nella rest pose. Skinning del vertice xR (b1 , w1 ) (con Nmax = 4): (b2 , w2 ) (b3 , w3 ) xP (b4 , w4 ) Marco Tarini - Univ. Insubria 15 Video Games Dev - 2015/2016 29/01/2016 Ortogonalità animazioni / modelli RIG (skeleton) Animation Walk Animation Jump Animation Die Model A Model B Model C Intro: skinning Marco Tarini - Univ. Insubria 16 Video Games Dev - 2015/2016 29/01/2016 Intro: skinning Marco Tarini - Univ. Insubria 17