Universitat Oberta de Catalunya

Animación con expresiones

Dentro del campo de la animación por ordenador se utilizan diferentes técnicas para animar los objetos de una escena: desde la animación “manual” fotograma a fotograma hasta técnicas de inteligencia artificial que mediante unos comportamientos predefinidos permiten dotar de vida a los personajes; estos comportamientos no son más que programas o rutinas en un lenguaje determinado; 3D Studio dispone del lenguaje MaxScript para realizar este tipo de animación, aunque para tareas más simples pueden utilizarse descripciones matemáticas del movimiento mediante las expresiones que se aplican sobre un objeto mediante los controladores.

La teoría

El controlador de Expresiones permite en 3D Studio utilizar fórmulas matemáticas para animar los objetos de una escena; de esta forma pueden automatizarse algunos procesos que de hacerse de forma manual requerirían mucho trabajo y precisión. Es el caso que se plantea en este artículo, donde se verá como puede animarse el giro de una rueda en función de la distancia recorrida; lo mismo podría aplicarse para objetos esféricos o de cualquier tipo, siempre que giren alrededor de su centro y tengan un radio definido.

Si intentásemos animar de forma manual una rueda, creada a partir de la primitiva “toroide”, tendríamos que hacerla girar más o menos en función de si la distancia recorrida es mayor o menor, teniendo en cuenta el tamaño de ésta. Para una misma distancia, una rueda grande dará menos vueltas que una rueda de menor radio. Creando un fotograma clave al inicio de la animación y otro al final donde grabaríamos la rotación del toroide, tendríamos una rueda que dará vueltas sobre su eje. Si no se ajusta correctamente el número de vueltas o posteriormente se cambia la posición final o se modifica el radio, la rueda parecerá patinar sobre el suelo, por lo que este sistema no resulta muy adecuado.

Un poco de matemáticas (pero sólo un poco…)

Aprovechando que podemos conocer el radio de la rueda, y sabiendo que la longitud de su perímetro es igual a 2*pi*radio (donde “pi” vale 3,1416…), cuando la rueda haya recorrido su perímetro habrá dado una vuelta, por lo que es fácil controlar la rotación de la rueda conociendo la distancia que se ha desplazado.

Por tanto, para completar una vuelta, la rueda tiene que girar 360º, desplazándose una distancia igual a su perímetro:

giro( º) = (360* desplazamiento / 2*pi*radio)

Advertencia (consulte a su farmacéutico)

Para realizar el ejercicio de este artículo se presupone un conocimiento previo de 3D Studio y su interfaz, así como de la utilización y asignación de controladores, jerarquías, creación y vinculación de ficticios y creación de materiales. De todas formas se adjuntan las escenas que se obtienen en cada paso, para poder ir siguiendo el ejercicio.

La realización de este ejercicio puede provocar efectos secundarios cómo: descubrimiento de nuevas funciones de 3D Studio, ganas de experimentar con nuevas fórmulas, etc. No se recomienda realizar otras actividades mientras se haga ésta.

¡Manos a la obra!

Pasos a seguir para controlar la rotación de la rueda en función de la distancia desplazada en el eje X:

  1. Crear un ficticio de nombre “Ficticio01” (menú “Crear/Ayudantes/Ficticio”)que será padre de un toroide “Toroide01” que hará de rueda, a la que aplicaremos un modificador “Xformar” (menú “Modificar/ Más -> Xformar”). Encajaremos la rueda dentro del ficticio, para poder controlarla mejor. Si ahora movemos el ficticio, la rueda deberá seguirle, pero todavía sin girar. (escenarueda01“).El modificador “Xformar” sirve para aplicar una transformación (de escalado, movimiento o rotación) o a un objeto pero desde el catálogo de modificaciones. Más adelante accederemos a este modificador para poder hacer girar el toroide en base a la función matemática.
  2. Abriremos el TrackView y desplegando la rama “Objetos”, desplegaremos las sub-ramas “Fictio01” y la “Toroide01” que se encuentra dentro. Acto seguido procederemos a realizar las siguientes asignaciones de controladores:
    1. Desplegando la rama “Objeto modificado” del “Toroide01” aplicaremos en la rama “Gizmo/Rotación” del “Xformar” un controlador “XYZ Euler”. (escenarueda02“).
    2. Desplegando la rama “Toroide01\Objeto Modificado\Objeto\Radio1” asignar un controlador “Flotante Bezier”; de esta manera será posible leer el radio de la rueda (el “Radio 1” es el radio externo del toro) para aplicarlo a la fórmula que calcula el giro de la rueda, y si variamos el tamaño de la rueda, la fórmula lo tendrá en cuenta. (escenarueda03“).
    3. Desplegando la rama “Toroide01\ Objeto Modificado \Xformar \Gizmo \Rotación Rotacion de Z” asignar controlador “Expresión Flotante”. Esto va a permitir controlar la rotación alrededor del eje Z del objeto mediante una expresión. (escenarueda04“).
Ramas desplegadas
  1. Acceder a “Propiedades” con el botón derecho estando situados sobre la rama “Toroide01\Objeto Modificado\Xformar\Gizmo\Rotacion\ Rotacion de Z”, y se abrirá el “Controlador de Expresiones”.
  2. Crearemos una variable donde almacenar el valor del radio de la rueda, para ello en “Nombre” pondremos “radio” y activaremos el botón “Escalar” y dando al botón “Crear” se creará la variable “radio”, después pulsar el botón “Asignar a controlador” e ir a seleccionar la rama “Toroide01\Objeto Modificado\ Objeto\ Radio1= Flotante Bezier”. De esta forma, si se varia el “Radio1” del toroide (desde el catálogo de modificaciones), la fórmula obtendrá el nuevo valor, al estar “conectada” a través del controlador “Flotante Bezier”.
  3. Seleccionar botón “Vectoriales” y crear variable “xmov”, después “Asignar a controlador” e ir a seleccionar la rama “Posicion” del “Ficticio01”. Así es como en todo momento la fórmula obtendrá la distancia recorrida por el “Ficticio01”.
  4. El siguiente paso será programar la fórmula que controlará el giro del “Gizmo” del modificador “Xformar” que se aplicó sobre el toroide; en la ventana “Expresión” escribiremos la fórmula siguiente:

-degToRad(360*(xmov.x/(2*pi*radi)))

La función “degToRad” sirve para pasar de grados a radianes (que es como opera el evaluador de expresiones ) el parámetro contenido que se pasa entre los paréntesis. El signo negativo es para que el sentido de rotación sea en la dirección del desplazamiento.
Para leer la distancia recorrida hasta el momento lo hacemos leyendo la componente “X” del vector de traslación, y se hace de la forma “xmov.x”. Si quisiéramos conocer la distancia desplazada en el eje “Y” lo haríamos con “xmov.y”. (escenarueda05“)

  1. Para comprobar que funciona, cuando movamos el “Ficticio01” en el eje de las X, el desplazamiento se trasladará en una rotación del “Xformar” que a su vez se transferirá al toroide, éste se desplazará debido a que es hijo del Ficticio01.
  2. Para poder apreciar mejor el giro, podemos asignar una textura al toroide y así se podrá ver mejor el giro de la rueda. (escenarueda06“).
  3. Comprobar como al aumentar o disminuir el radio de la rueda la rotación se adapta teniendo en cuenta en todo momento el tamaño del toroide. (escenarueda07“).
  4. Incluso es posible asignar un recorrido al “ficticio01”, de manera que la rueda siga un camino trazado por una linea y vaya girando en función de la distancia desplazada en el eje X. (escena “rueda08.max”).
  5. Haciendo copias el “Toroide01” podemos crear las 4 ruedas de un coche, y simplemente moviendo el ficticio tendremos el giro de las 4 ruedas (o sea: tracción a las 4 ruedas, como en un 4×4). (escenarueda09“).
(Al clicar sobre la imagen se muestra la animación de "ruedas.avi")

(Al clicar sobre la imagen se muestra la animación de “ruedas.avi”)

(Al clicar sobre la imagen se muestra la animación de “ruedas.avi”)

Y sin embargo se mueve:

En efecto, hemos comprobado como la rueda gira al desplazarla como si de una rueda real se tratase: dependiendo de su tamaño y la distancia recorrida, girará más o menos para que no parezca patinar sobre el suelo.

Un caso más complicado seria el de una esfera que se desplazara sobre el suelo, ya que hay que tener en cuenta la posibilidad en este caso de desplazamiento tanto en el eje X como en el Y, por lo que se tendría que controlar la distancia que se ha recorrido en cada uno de los ejes y aplicar el giro adecuado a los ejes correspondientes.

Espero que este ejercio os haya servido para ver las posibilidades del controlador de expresiones y cómo nos puede facilitar la realización de animaciones más complicadas.