martes, 9 de febrero de 2010

COMO ROTAR UNA ESFERA CORRECTAMENTE EN 3DMAX: por Marlon Rábago


Universidad La Salle Noroeste ( ULSA )
Computeranimation II
Teacher: Enrique Rosales
Student: Marlon Alejandro Rábago Heredia
09/Feb/2010


COMO ROTAR UNA ESFERA CORRECTAMENTE EN 3DMAX


INTRODUCCIÓN
Cuando queremos rotar una esfera al moverla sobre algún eje es común que tenga una rotación errónea.En este documento veremos como rotar una esfera correctamente en cada uno de sus respectivos ejes por medio del uso de flota expresión.
DESARROLLO

Una vez abierto nuestro programa 3D creamos una esfera y le asignamos un material que nos permita ver claramente cuando gira la esfera.


Seguido creamos un plano en nuestra vista tp que nos ayude a simular una superficie.Ahora asignamos nombres a nuestros objetos para facilitar el manejo de estos y los posicionamos en la posición cero.Hacemos a la esfera hija del plano por medio de la herramienta Select and Link de nuestra barra de herramientas. Seleccionamos la herramienta, seleccionamos el hijo (en este caso la esfera) y arrastramos el cursor a el plano.

Siendo el plano la superficie donde se desplazará la esfera, asignaremos que la esfera estará arriba de el plano y programaremos para que no se mueva en el eje de X, así manera cuando movamos el plano la esfera se moverá junto con el, y si movemos la esfera se moverá libremente excepto en el eje de X.





Damos clic derecho en la esfera :wide parameters / transforms/ position / X position








Nos aparecerá otra línea y la linkiamos con la misma esfera y nos aparecera otro menú:seleccionamos Object (Sphere) / radius


Aparecerá la siguiente pantalla donde nos aseguraremos que haya conexión de parte del radio a la posición en X, seleccionamos la flechita y conectar.
De esta manera inhabilitamos el movimiento manual para facilitar el movimiento mediante programación.Ahora viene la parte polémica, muy comúnmente se comete el error de programar los movimientos en Y y Z mediante ecuación matemática asignada en curve editor mediante flota expresión, lo cual esta bien pero solamente permite rotar correctamente en esos ejes, pero cuando rota en 2 ejes al mismo tiempo lo hace de forma errónea.La solución es el uso de Quaterniones, como su mismo nombre lo dice además de los 3 ejes establecidos este crea un 4to eje alternativo para representar rotaciones a través de cualquier eje.


Ahora seleccionamos la esfera y abrimos nuestro curve editor, seleccionamos la rotación general de la esfera y le asignamos el controlador de Rotation Script.

Se nos abrirá un cuadro de dialogo donde podremos declarar variables, asignarlas a objetos y programarlas con formulas matemáticas.
( 3D Max cuenta con una lista de variables y funciones asignadas por default entre las cuales se encuentra la función de quaternion entre otras)


El código que pondremos en la sección de expresión es el siguiente:

obj = $Esfera
timeres = 1f
fn getrot t =
(
if t<=0f then return quat 0 0 0 1 -- t=0 =>
t0 = t-timeres
t1 = t
rot0 = getrot(t0)
p0 = at time t0 obj.position
p1 = at time t1 obj.position

if(p0==p1) then return rot0
dif = p1-p0
len = Length(dif)
vec = dif / len
r0 = at time t0 obj.radius
r1 = at time t1 obj.radius
rotax = cross vec [0, 0, 1]
angle = 360*len/((r0+r1)*pi)
rotdif = quat angle rotax
rot1 = rot0 + rotdif
)

getrot(currentTime)

Lo que haremos será encontrar el tiempo y la distancia debido a que los cuaterniones ocupan 2 valores para crear uno nuevo imaginario, esto lo haremos basándonos en un tiempo y distancia iniciales y en un tiempo y distancia final.

Obteniendo estos encontramos el eje de rotación:
El plano simula una superficie horizontal, por lo tanto aplicando leyes de la física este implica una gravedad con su eje perpendicular y vector.

Por medio del producto cruz teniendo estos parámetros, encontramos el eje de rotación.

Cada ves que la esfera gira viaja una distancia igual a su circunferencia, por medio de una formula matemática obtenemos cuantas veces girará la esfera.

Una vez obtenidos el eje de rotación y el número de vueltas podemos sacar el quaternion con la función que tiene 3dMax.


EXPLICACIÓN DEL CODIGO:

Se asigna el nombre
Tiempo de diferencia
Función para la rotación

Valida si hay movimiento para regresar al quaternion inicial,si hay se le resta al inicial y se queda ese.
Rotación previa
Posición inicial
Posición final
Si tienen el mismo valor no hay movimiento.
Se restan posiciones
Se hace la normal del vector con la diferencia de longitud
Radio inicial
Radio final
Eje de rotación , producto cruz
Rotaciones en gradosSaca el quaternionRotación final

Manda llamar la función ya actualizada


CONCLUSIÓN
Como nada en esta vida es perfecto y aunque 3D max es una maravilla, cuando queremos rotar una esfera en 2 ejes al mismo tiempo es como si quisieramos caminar para la izquierda y la derecha al mismo tiempo, nuestro cerebro no puede con esa tarea al igual que este programa, por eso usamos los quaterniones que manejan tiempos y distancias y nos facilitan el trabajo.

BIBLIOGRAFÍA:
http://www.cuneytozdas.com/tutorials/maxscript/







No hay comentarios:

Publicar un comentario