Escuela Técnica Superior de Ingeniería

 

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.

Tiro libre

 

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:

  • skeleton :

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

  • offset :

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.

  • zaxis :

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.

  • yaxis :

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.

  • balljoint :

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.

Escena

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.

Escena

 

 

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:

  • GESkeleton :

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.

  • GEBalljoint :

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.

  • GEAnimation :

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

  • GEScene :

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.