esqueletos - uhu.es

43
Esqueletos Visualización Gráfica FCO. ALFREDO MARQUEZ UHU

Upload: others

Post on 22-Nov-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Esqueletos - uhu.es

Esqueletos

Visualización Gráfica

FCO. ALFREDO MARQUEZ

UHU

Page 2: Esqueletos - uhu.es

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)

Page 3: Esqueletos - uhu.es

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

Page 4: Esqueletos - uhu.es

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

Page 5: Esqueletos - uhu.es

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

Page 6: Esqueletos - uhu.es

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.

Page 7: Esqueletos - uhu.es

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

Page 8: Esqueletos - uhu.es

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

Page 9: Esqueletos - uhu.es

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…)

Page 10: Esqueletos - uhu.es

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.

Page 11: Esqueletos - uhu.es

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

Page 12: Esqueletos - uhu.es

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

Page 13: Esqueletos - uhu.es

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

Page 14: Esqueletos - uhu.es

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…

Page 15: Esqueletos - uhu.es

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]

Page 16: Esqueletos - uhu.es

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…

Page 17: Esqueletos - uhu.es

Tipos de Articulaciones

Page 18: Esqueletos - uhu.es

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...

Page 19: Esqueletos - uhu.es

Articulaciones Bisagra (1-GDL

Rotacional)

1

0cossin0

0sincos0

0001

zyx

xx

xx

xRx

rrr

L

Rotación sobre el eje x:

Page 20: Esqueletos - uhu.es

Articulaciones Bisagra (1-GDL

Rotacional)

1

0cos0sin

0010

0sin0cos

zyx

yy

yy

yRy

rrr

L

Rotación sobre el eje y:

Page 21: Esqueletos - uhu.es

Articulaciones Bisagra (1-GDL

Rotacional)

1

0100

00cossin

00sincos

zyx

zz

zz

zRz

rrr

L

Rotacion sobre el eje z:

Page 22: Esqueletos - uhu.es

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

Page 23: Esqueletos - uhu.es

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

Page 24: Esqueletos - uhu.es

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

Page 25: Esqueletos - uhu.es

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

Page 26: Esqueletos - uhu.es

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

Page 27: Esqueletos - uhu.es

Articulaciones Translacionales (3-

GDL)

Para un traslación general con 3-GDL:

1

0100

0010

0001

zzyyxx

Txyz

trtrtr

tL

Page 28: Esqueletos - uhu.es

Otras Articulaciones

Compound

Libre

Tornillo

Restringida

Etc.

No-Rigidas

Escaladas (1 eje, 3 ejes, preservación de volumen…)

Atornilladas

Etc.

Page 29: Esqueletos - uhu.es

Proyecto de programación #1:

Esqueletos

Page 30: Esqueletos - uhu.es

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

Page 31: Esqueletos - uhu.es

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

Page 32: Esqueletos - uhu.es

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

Page 33: Esqueletos - uhu.es

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]

}

Page 34: Esqueletos - uhu.es

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)

Page 35: Esqueletos - uhu.es

Posible Desglose de Objectos

Uno debería considerar hacer objetos

(clases) para lo siguiente:

GDL

Articulacion

Esqueleto

Page 36: Esqueletos - uhu.es

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

Page 37: Esqueletos - uhu.es

Que es un GDL?

Datos

Valor

Min, max

Funciones

SetValue() (se puede fijar el valor en el momento de la creación)

GetValue()

SetMinMax()…

Page 38: Esqueletos - uhu.es

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

Page 39: Esqueletos - uhu.es

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

Page 40: Esqueletos - uhu.es

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

Page 41: Esqueletos - uhu.es

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

}

Page 42: Esqueletos - uhu.es

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;

}

Page 43: Esqueletos - uhu.es

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

}

}