Universidad La Salle Noroeste
Animación por computadora IV
Eduardo Rodríguez
El objetivo del proyecto es hacer rodar una esfera correctamente en su eje X, en su eje Y
y en ambos al mismo tiempo.
Comenzaremos creando la primitiva (esfera) y la situaremos en el origen del mundo (0,0,0). Ya realizado este paso nos dedicaremos a programar la rotación de la esfera en el eje X. La esfera tiene que estar seleccionada, abrimos el curve editor y buscamos dentro de la esfera la parte de rotación y seleccionamos rotación en X, lo seleccionamos, le damos clic secundario y escogemos la opción de asignar controlador. Aparecerá una pequeña ventana donde nos da a elegir los diferentes controladores que nos ofrece MAX, en este caso seleccionaremos el controlador llamado FLOAT EXPRESSION.
Se abrirá una nueva ventana donde crearemos dos variables:
La primera variable será para la posición en X (posx) y la segunda variable que crearemos será la del radio de la esfera (radio). A estas variables le asignaremos controladores también, a la primer variable le asignaremos el controlador de la posición en X de la esfera y a la segunda variable le será asignado el controlador del radio de la esfera.
Ya asignados los controladores volvemos a la ventana del FLOAT EXPRESSION para asignarles una expresión matemática a las variables ya creadas anteriormente. Esta expresión es la siguiente:
“degToRad((posx)/(2*pi*radio))*360”
-- degToRad es una función para convertir los grados en radianes.
-- posx es la variable que habíamos creado anteriormente
Antes de cerrar la ventana del FLOAT EXPRESSION tenemos que asegurarnos que lo que acabamos de hacer lo hayamos hecho bien. Para esto basta con darle un solo clic a un botón que dice “evaluate”. Este botón nos dará a conocer si la expresión matemática que hicimos es correcta. Si no se encuentra ningún error, significa que lo hemos hecho bien. Ahora podremos cerrar la ventana del FLOAT EXPRESSION y dirigirnos hacia la esfera en nuestra vista de perspectiva y experimentar moviendola desde su eje X para ver el giro de la misma.
Nuestra esfera esta lista para girar libremente en su eje X, ahora tenemos que hacer que gire en su eje Y.
Para esto basta con seguir el mismo procedimiento que hicimos para hacer girar la esfera en su eje X, solo que la variable “pox” la cambiaremos por “posy”, y el controlador que le asignaremos a la variable “posy” será la posición Y de la esfera.
Ya terminado el procedimiento para la rotación en el eje Y de la esfera, se puede apreciar claramente que la esfera gira correctamente, solo que si movemos la esfera en el eje X y después en el eje Y, se nota que el giro de la esfera es irregular a la de una pelota real (extraño), al igual que si movemos ambos ejes al mismo tiempo pasa lo mismo.
Esto nos dice que este método no es lo que se necesita para poder hacer girar la esfera como se pretendía.
El siguiente método es una alternativa (hasta ahora la única que he encontrado) que nos dará la solución para nuestro problema con los giros extraños de la esfera. Haremos uso de “cuaterniones”.
Los cuaterniones son una forma alternativa de representar rotaciones a través de cualquier eje. Un cuaternion consiste en números complejos en 4D que representa los valores de rotación mediante funciones sinodales y cosinodales.
Un cuaternion (Q) equivale a:
Quat q = (x, y, z, w) = (v x * sin (T / 2), y v * sin (T / 2), v z * sin (T / 2), cos (T / 2) )
Ya que tenemos una noción de lo que es un cuaternion podemos proseguir seleccionando nuestra esfera y abrimos el “curve editor”, buscamos la propiedad de rotación de la esfera y le asignamos el controlador ¨Rotation Script¨.
Nos aparecerá una ventana en la cual se va a colocar este código:
obj = $Sphere01 -- Nombre del objeto (si tu esfera no se llama así) cambialo
timeres = 1f -- Resolución de tiempo
fn getrot t =
(
if t<=0f then return quat 0 0 0 1 -- t=0 => no rotación
t0 = t-timeres
t1 = t -- Tiempo actual
rot0 = getrot(t0) -- Rotación previa
p0 = at time t0 obj.position -- Posición previa
p1 = at time t1 obj.position -- Posición actual
if(p0==p1) then return rot0
dif = p1-p0 -- Diferencia en posición
len = Length(dif) -- Distancia que viaja
vec = dif / len -- Normalizar vector de movimiento
r0 = at time t0 obj.radius -- radio anterior
r1 = at time t1 obj.radius -- radio actual
rotax = cross vec [0, 0, 1] -- Eje de rotación
angle = 360*len/((r0+r1)*pi) -- Monto de rotación
rotdif = quat angle rotax -- Rotacion desde t0 a t1
rot1 = rot0 + rotdif -- Rotación total
)
getrot(currentTime)
Ya que el código esta en su lugar, volvemos a evaluar con el mismo botón y si no nos muestra algún error la esfera girará como a principio se deseaba.
Al momento de mover la esfera desde sus ejes no se nota que gire, pero si este movimiento lo hacemos en una pequeña animación se nota que la esfera gira de forma correcta.
http://www.cuneytozdas.com/tutorials/maxscript/
Les dejo el Link del tutorial que me ayudo a resolver el problema ;).