Animación procedimental de una rueda en Max (II)

Ha llovido bastante desde que publiqué la primera parte de esta serie de posts. Continúo hoy con la segunda de las dificultades planteadas allí, es decir, una vez tenemos la rueda girando con sólo dos keys, vamos a conseguir que siga los desniveles del terreno, subiendo y bajando cuando corresponda.

La reflexión es la misma que realizábamos en la primera parte: siempre tenemos la posibilidad de lograr nuestro propósito con técnicas de animación “convencional”, por llamarlas de alguna manera. Sin embargo, nos hemos propuesto emplear técnicas procedimentales, a base de ajustar parámetros, expresiones y scripts. Para los fines que nos ocupan, modificaremos uno de los ejemplos básicos de MaxScript ofrecidos por Autodesk.

Vamos a ello. Lo primero que hemos de hacer es seleccionar nuestra rueda y, dentro de Motion, asignar un controlador Float script a la posición Z del objeto, como se muestra en la siguiente figura.

Controlador float script

En la ventana de edición del script necesitaremos definir dos variables: una asociada al cilindro que nos sirve como rueda (la llamaremos cl)  y otra asociada al plano que nos sirve como terreno (la llamaremos pl). Después, en el recuadro Expression pegaremos el script que se encargará del trabajo.

RuedaAnim5

El código de este pequeño script es:

local testRay = ray cl.pos [0,0,-1]
local nodeMaxZ = pl.max.z
testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ
int_point = intersectRay pl testRay
int_point.pos.z + cl.radius - 0.25

Explicaremos un poco cada una de las líneas de este código. Primero, definimos un vector con origen el pivote del cilindro, dirección Z negativo y módulo 1.

local testRay = ray cl.pos [0,0,-1]

Después hallamos la coordenada Z máxima de nuestro plano.

local nodeMaxZ = pl.max.z

Situamos el origen del vector testRay un poquito por encima de la Z máxima del plano. De esta forma, queremos garantizar que nuestro vector pueda intersecar con el plano en al menos un punto (siempre según el eje Z). Recordemos que incialmente el módulo de este vector es 1, así que cabe la posibilidad de que en algún momento la totalidad del vector se quede por encima del terreno y no presente ningún punto de intersección con él. Por eso hemos de realizar este paso.

testRay.pos.z = nodeMaxZ + 0.0001 * abs nodeMaxZ

En la siguiente línea, hallamos la intersección efectiva del vector con el plano (según Z), mediante la función intersectRay y ese valor lo asignamos a una variable llamada point.

int_point = intersectRay pl testRay

En nuestra última línea de código, añadimos la dimensión del radio del cilindro al valor que hemos obtenido anteriormente (menos 0.25 unidades). El resultado de este cálculo será el que se pase a la posición Z del pivote del cilindro.

int_point.pos.z + cl.radius - 0.25

¿Por qué restamos 0.25 unidades? Porque con esto conseguimos que el punto más bajo de la rueda esté ligeramente “hundido” en el terreno, lo que nos servirá para el siguiente efecto, que es la deformación de esa zona de la rueda.

Así, con unas nociones básica de geometría y un poquito de MaxScript se pueden conseguir resultados bastante decentes en muy poco tiempo. Junto con mis saludos de despedida, os dejo el vídeo con los resultados (sin deformación de la rueda) en modo wireframe.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s