Download - Esqueletos - uhu.es
Esqueletos
Visualización Gráfica
FCO. ALFREDO MARQUEZ
UHU
Cinematica
Cinematica: Es el análisis del movimiento independientemente de las fuerzas físicas. La cinemática trata con la posición, velocidad , aceleración y sus homólogos en giro, orientación, velocidad angular y aceleración angular.
Cinematica “Directa”: Es el proceso de computar (hayar) datos geométricos en el espacio “mundo” con diferentes grados de libertad (parametros)
Cinematica
Cinematica “Inversa”: Es el proceso de computar (hayar) un conjunto de parametros (grados de libertad) que hace que se alcance algún objetivo en el espacio (ejemplo: colocar la mano el pomo de una puerta …..)
Nota: La cinemática es toda una rama de las matemáticas y hay varios otros aspectos de la cinemática que no entran en la descripción
Esqueletos
Esqueleto: Es un marco de partes juntas dispuestas en una estructura de árbol. El esqueleto se utiliza como una armadura invisible para manipular la piel (skin) y otros datos geométricos del personaje
Articulación: Una articulación permite el movimiento relativo dentro del esqueleto. Las articulaciones son esencialmente matrices de transformación 4x4. Las articulaciones pueden ser rotatorias, de translación, o algunos tipos no realistas también
Esqueletos
Hueso: Realmente es sólo un sinónimo de articulación. Por ejemplo, se podría hacer referencia a la articulación del hombro o hueso de la parte superior del brazo (húmero) y significan la misma cosa
GDL
Grado de Libertad(GDL): Es una variable φ describiendo un particular eje o dimensión del movimiento dentro de una articulación
Las articulaciones típicas tienen alrededor de 1-6 GDL (φ1…φN)
El cambio de los valores de un GDL a lo largo del tiempo hace que se realice la animación del esqueleto.
GDL
En las proximas clases, ampliaremos el concepto de un GDL a ser cualquier parametro animatable dentro de la plataforma del personaje
Notar: En un sentido matemático un cuerpo rígido libre tiene 6 GDL: 3 para la posición y 3 para la rotación
Ejemplo de Jerarquía de
articulacion Root
Torso
Neck
Pelvis
HipL HipR
Head ElbowL
WristL
ElbowR
WristR
KneeL
AnkleL
KneeR
AnkleR
ShoulderL ShoulderRCuello
Cabeza
EspaldaI EspaldaD
CodoI CodoD
MuñecaI MuñecaD
RodillaI RodillaD
CaderaI CaderaD
TobilloI TobilloD
Articulaciones
Nucleo del Dato Articulacion GDL (N floats)
Matriz Local: L
Matriz Mundo: W (world)
Datos adicionales Vector desplazamiento de la articulacion: r
Limites GDL (valor min & max por cada GDL)
Tipo especifico (ejes de rotacion/traslacion, constantes…)
Dato Arbol (punteros a hijos, hermanos, padres…)
Proceso de Posicionamiento del
Esqueleto
1. Especificar todos los valores GDL para el esqueleto (hecho por el sistema de animación de mayor nivel)
2. Recorrer recursivamente en la jerarquía a partir de la raíz y utilizar cinemática directa para calcular las matrices del mundo (hecho por el sistema esquelético)
3. Utilice matrices mundo para deformar la piel y render (hecho por el sistema de la piel(skinning))
Nota: Las matrices pueden ser usadas tambien para otras cosas tales como detección de colision, etc.
Cinematica (Directa)
En el recorrido recursivo del árbol, cada articulación primero calcula su matriz local L basada en los valores de sus GDL y una fórmula de representación del tipo de articulacion:
Local matrix L = Ljoint(φ1,φ2,…,φN)
Después, la matriz mundo W es calculada concadenando L con la matriz mundo de la articulación padre
World matrix W = L · Wparent
Joint Offsets
Es conveniente tener un vector 3D offset(
de desplazamiento) r para cada
articulacion (conjunto) que representa su
punto de pivote relativo a su matriz padre
1
0100
0010
0001
zyx
offset
rrr
L
Limites de los GDL
Sería aconsejable limitar un GDL a cierto
rango (por ejemplo, el codo debería ser
limitado de 0º a 150º)
Por lo general, en un personaje realista,
todos los grados de libertad serán
limitados excepto los que controlan la raíz
Skeleton Rigging
Configurar el esqueleto es la parte inicial y mas importante del proceso de rigging
Algunas veces, los esqueletos de los personajes son construidos antes que la piel (partes), mientras otras veces, ocurre lo contrario
Para configurar un esqueleto , un artista usa una herramienta interactiva para: Construir el arbol
Posicionar el desplazamiento de la articulacion
Configurar los tipos de articulaciones
Especificar los limites en las articulaciones
Posiblemente mas cosas…
Poses
Una vez que el esqueleto está configurado, se puede entonces ajustar cada uno de los GDL para especificar la pose del esqueleto
Podemos definir una pose Φ de forma mas formal como un vector de N numeros que mapea cada uno de los valores de GDL en el esqueleto
Φ = [φ1 φ2 … φN]
Poses
Una pose es una unidad conveniente que puede ser manipulada por un sistema de animación de mas alto nivel y despues manejada a bajo nivel por el esqueleto
Generalmente, cada articulación tendrá alrededor de 1-6 GDLs, pero en total el personaje podría tener 100+ GDLs en el esqueleto
Tener en cuenta que los GDLs pueden ser usadas también por otras cosas distintas a las articulaciones, como se aprenderá mas tarde…
Tipos de Articulaciones
Tipos de Articulacion
Rotacionales Bisagra: 1-GDL
Universal: 2-GDL
Rotuladas: 3-GDL Angulos de Euler
Quaternions
Traslacional Prismatica: 1-GDL
Traslational: 3-GDL (o cualquier numero)
Componentes Libre
Atornillada
Restringida
Etc.
No-Rigidas Escaladas
Shear(alargadas o acortadas en un eje)
Etc.
Diseñadas por ti mismo...
Articulaciones Bisagra (1-GDL
Rotacional)
1
0cossin0
0sincos0
0001
zyx
xx
xx
xRx
rrr
L
Rotación sobre el eje x:
Articulaciones Bisagra (1-GDL
Rotacional)
1
0cos0sin
0010
0sin0cos
zyx
yy
yy
yRy
rrr
L
Rotación sobre el eje y:
Articulaciones Bisagra (1-GDL
Rotacional)
1
0100
00cossin
00sincos
zyx
zz
zz
zRz
rrr
L
Rotacion sobre el eje z:
Articulaciones Bisagra (1-GDL
Rotacional)
Rotación sobre un eje arbitrario a:
1
0)1()1()1(
0)1()1()1(
0)1()1()1(
)sin(
)cos(
22
22
22
zyx
zzxzyyzx
xzyyyzyx
yzxzyxxx
Ra
rrr
acasacaasacaa
sacaaacasacaa
sacaasacaaaca
s
c
L
Articulaciones Universal (2-GDL)
Para una articulación con 2-GDL que primero rota sobre x y despues sobre y:
Diferentes matrices pueden ser formadas para diferentes combinaciones de ejes
1
0
0
00
,
zyx
yxxyx
yxxyx
yy
yxRxy
rrr
ccssc
cscss
sc
L
Rotula esferica (3-GDL)
Para una articulación con 3-GDL que primero rota sobre el eje x, y y despues z:
Diferentes matrices pueden ser formadas para diferentes combinaciones de ejes
1
0
0
0
,,
zyx
yxzxzyxzxzyx
yxzxzyxzxzyx
yzyzy
zyxRxyz
rrr
cccssscsscsc
csccssssccss
ssccc
L
Quaterniones
wzyx qqqqq
12222 wzyx qqqqq
2cos
2sin
2sin
2sin
zyx aaaq
1
02212222
02222122
02222221
22
22
22
zyx
yxxwzyywzx
xwzyzxzwyx
ywzxzwyxzy
Q
rrr
qqqqqqqqqq
qqqqqqqqqq
qqqqqqqqqq
qL
Articulaciones Prismatica (1-DOF
Translacion)
Traslación con 1-GDL a lo largo de un eje
arbitrario a:
1
0100
0010
0001
zzyyxx
Ta
atratratr
tL
Articulaciones Translacionales (3-
GDL)
Para un traslación general con 3-GDL:
1
0100
0010
0001
zzyyxx
Txyz
trtrtr
tL
Otras Articulaciones
Compound
Libre
Tornillo
Restringida
Etc.
No-Rigidas
Escaladas (1 eje, 3 ejes, preservación de volumen…)
Atornilladas
Etc.
Proyecto de programación #1:
Esqueletos
Arquitectura Software
Orientado a Objetos
Hacer objetos para cosas que debieran
ser objetos
Evitar variables, datos & funciones
globales
Encapsular la información
Proveer interfaces utiles
Distribuir diferentes objetos en diferentes
ficheros
Ejemplo de Codigo
Un ejemplo de codigo se suministra en la pagina web del curso que hemos denominado ‘project0’
Se trata de una versión demo orientada a objetos de un cubo giratorio
Clases: Vector3
Matrix34
Tokenizer
Camera
SpinningCube (Cubo Giratorio)
Tester
Tareas del Projecto 1
Cargar un esqueleto desde un fichero
‘.skel’ y mostrarlo en 3D
Todas las articulaciones en el esqueleto
deberían ser articulaciones rotacionales
con 3-GDL
Computar las matrices mundo por uno
mismo y usar glLoadMatrixf()
Fecha: 2 Semanas
Ejemplo de fichero Skel
balljoint root {
[data for root]
balljoint head {
[data for head]
[children of head]
}
balljoint leg_l {
[data for leg]
[children of leg]
}
[more children of root]
}
Skel File Data Tokens
offset x y z (joint offset vector)
boxmin x y z (min corner of box to draw)
boxmax x y z (max corner of box to draw)
rotxlimit min max (x rotation DOF limits)
rotylimit min max (y rotation DOF limits)
rotzlimit min max (z rotation DOF limits)
pose x y z (values to pose DOFs)
balljoint name { } (child joint)
Posible Desglose de Objectos
Uno debería considerar hacer objetos
(clases) para lo siguiente:
GDL
Articulacion
Esqueleto
Rutinas Comunes
Muchas clases necesitarán funciones para algunas o todos los equigrafes que detallamos:
Constructor / destructor
Initialize
Load
Update (mover cosas, pose, animación…)
Dibujar (trazar)
Resetear
Que es un GDL?
Datos
Valor
Min, max
Funciones
SetValue() (se puede fijar el valor en el momento de la creación)
GetValue()
SetMinMax()…
Que es una articulacion?
Data Matrices Local & Mundo (World)
Array de GDLs
Dato Arbol (hijo/hermano/padre punteros, etc.)
Funciones Actualizar() (recursivamente generar la matriz local &
concadenarla)
Cargar()
AddChild() (añadir hijo)
Dibujar()
Nota: Uno podría tambien hacer una clase base articulacion y derivar varios tipos especificos de articulaciones. En este caso, podría ser buena idea hacer una función virtual para MakeLocalMatrix() que llame a la rutina transversal base
Que es un Esqueleto?
Data
Arbol de articulacion (podría solo necesitar un
puntero a la articulación raiz)
Funciones
Cargar
Actualizar (recorrer el arbol & calcular la
articulacion)
Dibujar
Estructura de Datos Arbol
El esqueleto requiere solamente la estructura de datos arbol N-ario mas básica
La principal cosa que el arbol necesita es un camino sencillo para ejecutar un recorrido primero en profundidad
Hay varias opciones: Use STL
Implementar una estructura de datos arbol
Almacenar los punteros hermano y primer hijo en la propia articulación
Almacenar un arbol linealizado como un array en el esqueleto
Actualizar & Dibujar
void Joint::Update(Matrix &parent) {
… // Compute LocalMatrix
… // Compute WorldMatrix
… // Recursively call Update() on children
}
void Joint::Draw() {
.. // Do some OpenGL
.. // Recursively call Draw() on children
}
Cargar
bool Skeleton::Load(const char *file) {
Tokenizer token;
token.Open(file,"skel"));
token.FindToken("balljoint"));
// Parse tree
Root=new Joint;
Root->Load(token);
// Finish
token.Close();
return true;
}
bool Joint::Load(Tokenizer &t) {
token.FindToken("{"));
while(1) {
char temp[256];
token.GetToken(temp);
if(strcmp(temp,"offset")==0) {
Offset.x=token.GetFloat();
Offset.y=token.GetFloat();
Offset.z=token.GetFloat();
}
else // Check for other tokens
else if(strcmp(temp,"balljoint")==0) {
Joint *jnt=new Joint;
jnt->Load(token);
AddChild(*jnt);
}
else if(strcmp(temp,"}")==0) return true;
else token.SkipLine(); // Unrecognized token
}
}