|
Grado en Ingeniería Informática
Animación por
Ordenador
Curso 2025/2026
|
Trabajo 1
|
|
Proyecto en Vulkan
|
|
Objetivos
|
|
El objetivo del trabajo es generar una aplicación que muestre la
animación de un esqueleto.
Para ello se creará una nueva clase (GESkeleton) para describir esqueletos, se modificará la clase
GEBalljoint para incluir las poses y añadir articulaciones hijas para formar un árbol de articulaciones
y se creará una nueva clase (GEAnimation) para calcular las
poses del esqueleto en cada instante.
El proyecto a desarrollar deberá mostrar una
animación de un modelo de esqueleto humano ejecutando un tiro libre
de baloncesto. La animación durará cinco segundos. Para generarla
se considerarán poses intermedias de la acción y se calcularán las poses
en cada instante mediante interpolación lineal de los valores de los ángulos de rotación
de las poses.

|
|
Formato de descripción de esqueletos
|
|
La descripción del esqueleto humano se encuentra en el fichero
body.skel que utiliza un formato basado en XML. Este formato consta de las siguientes etiquetas:
Es la etiqueta principal del fichero. Contiene el atributo name con el nombre del esqueleto.
Este elemento tiene como nodos hijos las etiquetas offset (indicando la posición del esqueleto con respecto al
sistema de coordenadas de la escena), zaxis (indicando el eje Z de la orientación del esqueleto en coordenadas de
la escena), yaxis (indicando el eje Y de la orientación del esqueleto en coordenadas de la escena) y una lista
de nodos balljoint (describiendo las articulaciones vinculadas directamente a la raíz de descripción del esqueleto).
Describe la localización de un elemento, ya sea el nodo raíz del esqueleto (etiqueta skeleton)
o una articulación (etiqueta balljoint). Este elemento contiene los atributos x, y y z con
los valores de las componentes del vector de posición. Estas componentes se refieren al sistema de coordenadas local del
padre del elemento al que pertenezca la etiqueta offset.
Describe la orientación de un elemento, concretamente el eje Z de su sistema de coordenadas local.
Contiene los atributos x, y y z con los valores de las componentes del vector unitario del eje Z.
Estas componentes se describen con respecto al sistema de coordenadas local del padre del elemento al que pertenezca la etiqueta.
Describe la orientación de un elemento, concretamente el eje Y de su sistema de coordenadas local.
Contiene los atributos x, y y z con los valores de las componentes del vector unitario del eje Y.
Estas componentes se describen con respecto al sistema de coordenadas local del padre del elemento al que pertenezca la etiqueta.
Describe una articulación con tres grados de libertad (articulación rotulada o esférica). Contiene
los atributos name (nombre de la articulación) y length (longitud de la articulación). Tiene como hijos
las etiquetas offset (posición de la articulación con respecto a su nodo padre, descrita en el sistema de coordenadas
del nodo padre), zaxis (eje Z de la orientación local de la articulación, descrito en coordenadas del nodo padre),
yaxis (eje Y de la orientación local de la articulación, descrito en coordenadas del nodo padre),
limit (indicando los límites en los
valores de los grados de libertad de la articulación) y una lista de nodos balljoint
(describiendo las articulaciones hijas vinculadas a ella).
La posición base para las articulaciones hijas tiene en cuenta la longitud de la articulación. Esto
quiere decir que la posición (0,0,0) de una articulación hija corresponde al extremo de la articulación, osea, a la
posición de la articulación con un desplazamiento length en dirección Z. Por defecto, el desplazamiento de una
articulación es (0,0,0), su orientación es la del nodo padre y su pose inicial y final es (0,0,0).
|
|
Ejemplos de esqueletos
|
|
El fichero
body.skel contiene la descripción de un esqueleto en forma de cuerpo humano.
La descripción de este esqueleto parte de la zona pélvica, desde la que se definen una rama de articulaciones
para la pierna izquierda (cadera, pierna, rodilla y tobillo), una rama de articulaciones para la pierna derecha
(cadera, pierna, rodilla y tobillo) y una rama de articulaciones para el tronco (pelvis, espina dorsal y cuello).
Desde la espina dorsal se define también una rama para el brazo izquierdo (clavícula, hombro, codo y muñeca) y
otra rama para el brazo derecho (clavícula, hombro, codo y muñeca). La siguiente imagen muestra la representación gráfica
de este este esqueleto.
Para modificar la pose del esqueleto es necesario asignar valores a
los ángulos de Euler de las articulaciones. A continuación se
muestra una pose con algunos giros en varias articulaciones. En el
brazo izquierdo la articulación shoulder_l tiene un giro
de -45º en el eje Y y la articulación elbow_l tiene un
giro de -45º sobre el eje X. En el brazo derecho la articulación
shoulder_r tiene un giro de -45º en el eje X, de -30º en
el eje Y y de -150º en el eje Z mientras que la articulación
elbow_r tiene un giro de -90º en el eje X. En la pierna
izquierda la articulación leg_l tiene una rotación de -45º
en el eje X y la articulación knee_l tiene una rotación de
30º en el eje X.
|
|
Desarrollo del trabajo
|
|
El punto de partida del trabajo a desarrollar es el código
presentado en la práctica 7 de la asignatura.
Para desarrollar el trabajo es necesario crear nuevas clases y modificar algunas clases existentes respecto al código presentado
en la práctica 7:
Se trata de una clase nueva, que deberá crearse como parte del trabajo. Esta clase debe describir un esqueleto, almacenando toda
la información recogida en el fichero de descripción. La clase debe tener
los mismos métodos que la clase GEFigure para
poder utilizar un esqueleto completo como una figura dentro de una escena. Además deberá contar con getters y setters para
asignar la posición del esqueleto, su orientación y añadir las articulaciones dependientes de la raíz del árbol de articulaciones.
Se debe modificar la clase para añadir las articulaciones hijas, los límites de los grados de libertad y las poses.
Los métodos deben modificarse para realizar el recorrido
actualizando y dibujando las articulaciones hijas. La clase debe contar con
getters y setters para incluir las poses, la posición y
orientación y para añadir las articulaciones hijas.
Esta clase será la responsable de generar la animación del
esqueleto simulando el gesto de chutar un balón (moviendo las piernas y los brazos
de forma coordinada para visualizar este movimiento). La clase
debe incluir la información necesaria calcular la pose instantánea
del esqueleto, es decir, los valores de los ángulos de Euler de
cada articulación en cada instante. Este cálculo se realizará
mediante interpolaciones lineales entre valores fijados
previamente (keyframes).
Debe modificarse esta clase para generar una escena formada por el esqueleto y el suelo.
Deberá incluir también el objeto CAAnimation y un método
que actualice la pose del esqueleto a lo largo del tiempo.
|
|
Documentación a entregar
|
|
- Memoria explicativa del desarrollo del trabajo, incluyendo el código fuente de las clases creadas y de los métodos modificados
en clases existentes.
- Descripción de las poses intermedias utilizadas como base
para la animación (keyframes).
- Código fuente y compilado del trabajo, en formato electrónico.
- Descripción de las pruebas realizadas, incuyendo las capturas de ventana
que permitan visualizar el movimiento del esqueleto.
|
|
Plazo de entrega
|
|
La fecha límite de entrega del trabajo en la primera convocatoria
será el viernes 9 de enero de 2026.
La fecha límite de entrega del trabajo en la segunda convocatoria
será el viernes 6 de febrero de 2026.
El trabajo se podrá presentar a traves de la plataforma de enseñanza virtual o, directamente, enviándolo por correo electrónico al profesor.
Si el tamaño no permite la entrega, se podrá almacenar en alguna
plataforma (dropbox, consigna, ...) y enviar el enlace para su
descarga.
|
|