Animations in games
(of 3D Solid Objects)
Procedural Designed / scripted
Rigid
Articulated
Free form
Skeletal Animations
Blend-Shapes
Rigid body dynamics Pre-made
transforms
(ASSETS) (PHYSIC ENGINE)
Ragdolling Inverse kinematics
(generic) deformable object
simulation usually too expensive
Cloth/
garments
Ropes
Arrivandoci per gradi…
Animazioni cinematiche
spazio mondo (globale) spazio oggetto ruota 1 spazio oggetto automobile spazio oggetto ruota 2
spazio oggetto automobile
t 0
t 1
Arrivandoci per gradi…
animazioni cinematiche
T0
T1
T1,1 T1,2 T1,3 T1,4
posizonamento della automobile
(rispetto al mondo) posiz. della
ruota (rispetto
all’
automobile)
spazio mondo
spazio macchina 1
spazio ruota 1.1
time
t0 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 …
trasformazioni
Animazione:
Un robot
animato…
TT0
T1 T2
T4 T6
Robot (bacino) spazio mondo
busto1
gamba Sx
gamba Dx
spalla Dx
spalla Sx
polpaccio Dx busto2
T3
T7
piede Dx T8 T5
collo
bones (“ossa”) root bone
Trasf. locale del bone piede (“da piede a polpaccio”)
Quellaglobale (“da piede a robot”):
T2*T7*T8
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 (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 deloscheletro(riggers) definizione delloskinningsu un modello (skinners)
“animation”: definizione delle animazioni (animators)
“Skinning”
della mesh
(qui, ad 1 osso solo).
… ad oggetti
articolati deformabili
Idea: poter legare 1 vertice a più ossa Trasformazione del vertice:
interpolazionedelle trasformazioni associate alle ossa scelte
pesiinterpolaz 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 Nmaxossa)
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)
Posa:
struttura dati
Una trasformazione associata ad ogni bone i
Trasformazione locale:
(delbone 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:
(delbone i)da: spazio osso i
a:spazio osso del padre di i utili per costruire la posa
Trasformazione globale:
(delbone i)da:spazio osso i nella posa data a:spazio osso root nella posa data
Trasformazione finale:
(per ilbone i)da:spazio root nella rest pose
a:spazio root nella posa data (di destinaz) utili per applicare la posa alla mesh
a volte, solo la componente
“rotazione”
(“ossa non estendibili”:
estensione ossa def.
nel rig, costante su tutte le pose)
definita nel rig
Rig (o scheletro):
struttura dati 2/2
1.
Gerarchia (albero) di ossa
con un root boneon top
2.
Una posa speciale «rest pose»
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) busto 1
spalla dx spalla sx R2
R4 R6
gamba gamba dx
sx
polpaccio busto 2 dx
R3 R7
piede collo Dx
R5 R8
R3 R1
bacino (root) busto 1
spalla dx spalla sx P2
P4 P6
gamba gamba dx
sx
polpaccio busto 2 dx
P3 P7
piede collo Dx
P5 P8
P3 P1
trasf. finale piede, da rest pose a posa X = P2P7 P8 (R2 R7R8)-1= P2P7P8(R8)-1(R7)-1(R2)-1 pose X
rest pose
From Rest Pose to a given pose
bacino (root) busto 1
spalla dx spalla sx R2
R4 R6
gamba gamba dx
sx
polpaccio busto 2 dx
R3 R7
piede collo Dx
R5 R8
R3 R1
bacino (root) busto 1
spalla dx spalla sx P2
P4 P6
gamba gamba dx
sx
polpaccio busto 2 dx
P3 P7
piede collo Dx
P5 P8
P3 P1
pose X rest pose
trasf. finale piede, da rest pose a posa X = P2P7 P8 (R2 R7R8)-1= P2P7P8(R8)-1(R7)-1(R2)-1 same as
Bone transforms in a pose.
E.g. for «right foot» bone:
Local Transform:
P
8from «right foot» to «right lower leg»
Global Transform:
P
2P
7P
8from «right foot» to «character»
uses the Hierarchyof the Skeleton
once its computed, Hierarchyno longer needed!
Final Transform:
P
2P
7P
8R
8-1R
7-1R
2-1from «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 object frame of the character, i.e. the frame of the root bone
the space wheremesh vertices are defined!
Posa (per uno scheletro dato) : struttura dati
posa= array di trasformazioni (locali) definito per 1 dato rig!
costo in ram: n_ossax 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]
… …
Local Transform
It includes:
• a Rotation: always!
• a Translation: maybe If not, use the one defined in the rest poseof the rig.
==> a pose cannot redefine bone lengths.
• a Scaling: maybe If not ==> a pose cannot redef the size of the body part.
Posa (per uno scheletro dato) : struttura dati in GPU
posa= array di trasformazionifinali (per 1 dato rig! )
costo in ram: n_ossax 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:
R2R7(P7)-1(P2)-1
trasformazioni finali
trasformazioni locali (della rest pose o della posa data)
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:
Bone Index Weight
9 (Spine B) 0.4
13 (Chest) 0.1
15 (Shoulder Right) 0.4 16 (Forearm Right) 0.1
Vertex 120
Quanti link ad osso per vertice
Dipende dal game engine!
N
maxtipicamente:
1 (sottopezzi rigidi?) (no need to store weights!) 2 (cheap, e.g. su dispositivi mobili)
4 (top quality – standard)
Decrementare N
max?
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
GPU = poco controllo:
interpolaz fra Nmaxtrasf (costante) bones non utilizzati: peso 0
Costo in RAM
(della scheda video) strutture dati semplici per GPU-RAM array a lungezza fissa:Nmaxcoppie (indice , peso)
anche dove, localmente, ne basterebbero meno (es 1 osso solo, a peso implicitamente 1)
Bone Index Weight 9 (Head) 1.0
-- 0.0
-- 0.0
-- 0.0
es:
(riassunto)
Skeletal animations:
tre Assets (strutture dati)
Rig
(o skeletro)
Tree di bones (ossa)
Ognibone=> sistema di riferimento (in rest pose) (sistama dell’osso root = sistema oggetto)
Skinned
3D Model
Mesh con associazionevertici=> 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)
Animation GPU Object
LOAD
Life of an Animation in a Game Engine
DISK CENTRAL RAM GPU RAM
Animation Object
IMPORT
Animation File
Skeleton Skeleton
Final Transforms Local
Transforms
Mesh GPU Object
Mesh SkeletonFile
File
Mesh GPU Object
(Once again,
Memory Management)
Mesh Object
Mesh GPU Object Mesh
Object
GPU Object Mesh
Object Mesh ObjectMesh
ObjectMesh ObjectMesh
Object Animation
Object Animation
AnimationFile File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
AnimationFile File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
File Animation
File
Skeleton File
Animation Object Animation
Object
Mesh SkeletonFile
SkeletonFile Object
DISK CENTRAL RAM GPU RAM
Animation GPU Object
I task del Rigging e Skinning
(di un modello 3D)
Rigging – authoring del rig definizione dello scheletro (in contesto movies: anche dei
controlli che verranno usati per manipolarlo)
Skinning – authoring dello skinning
“paint” dell’attributo link (pesati) da vertici a ossa
I task del Rigging e Skinning
(di un modello 3D)
Rigging :
definire uno scheletro (e una rest pose) in un insieme mesh, una volta per tutte
Skinning
(di una mesh):
painting associazione vertice ossa
Animation
(di un rig)authoring delleanimazioni (scheletali) More about this later
rigger
skinner
animator task dei modellatori digitali! (aiutati / sostituiti da appositi strumenti)
Real time “Skinning”
task of the rendering engine, done in GPU
+ =
skinned model (asset in GPU RAM)
skeletal animation
(asset in GPU RAM)
animated model
Skinning - how it works (in GPU)
83
model in rest pose
a vertex (in rest pose)
1
Transform:
0 1 2 3 Bone: Weight:
bone a 0
bone b 1
bone c 2
bone d 3
dest.
pose
x vertex skinning
blend
Skinning - how it works (in GPU)
deformed model
vertex (in dest pose)
p p
n n
model in rest pose
dest.
pose
a vertex (in rest pose)
GPU real time Skinning – two variants
Transform:
0 1 2 3 Bone: Weight:
bone a 0
bone b 1
bone c 2
bone d 3
blend
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) (a choice of the rendering engine)
Applicare le pose:
Linear Blend Skinning
Per ogni vertice della mesh:
) ( ] [
max
1
R N
i
i i
P
w T b x
x
= ∑
=
x
Rx
P interpolaz. delle trasformaz.legate dal rigging al vertice
posiz del vertice definito nella rest pose.
Skinning del vertice
(con Nmax = 4):
) , (
) , (
) , (
) , (
4 4
3 3
2 2
1 1
w b
w b
w b
w b
computaz a bordo della scheda video (in GPU)
Ortogonalità
animazioni / modelli
RIG
(skeleton) Animation Walk
Animation Jump
Animation Die
Model A
Model B
Model C