martes, 9 de febrero de 2010

Paper Edu

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

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/







3dmax things

Universidad Lasalle Noroeste

Animacion por computadora IV

"Good Rotation of an sphere in all axes"

Jennifer Rios Holanda spontaneous and short version =)

Matricula: 059171

Teacher: Enrique rosales

So… let’s begin saying what is the problem im trying to solve and explain about making a ball roll.

First: if I roll it in the “x” axis everything is fine, I managed to do this.

And if I want to roll it in the “y” axis, all is good I can do it too, all of this with just a code in the rotation o each axis, but what happens when I want to roll it in both axis at the same time?, whoops! That rotation is not alright at all =(

well then just do the same as everyone has been saying and good luck =D.....kidding!

ok, ok well, lets see

to begin, there is a solution called, quaternions, so what is this quaternion?, is an imaginary axis between the already known axes "x" & "y", you see we already managed to separately move the ball, but when you choose the triangle that inmeaddiatly moves both at the same time, because it is not designed like the other axes, its a mess when you move the ball, it has no coherence in movement at all, so what we need is to make it understand in that option to move equally.

for that we need the next script

but first how to put it

Assigning the Script

-Open track view curve editor, find the sphere you created and select the rotation controller under transform (sphere/Transform/Rotation)

-Click the assign controller button and pick rotation script and then click OK

-then you can put the next.

obj = $Sphere01 -- change sphere by the name you have

timeres = 1f

fn getrot t =

(

if t<=0f then return quat 0 0 0 1 -- t=0 => no rotation

t0 = t-timeres -- previous frame time

t1 = t -- current time

rot0 = getrot(t0) -- previous rotation:

p0 = at time t0 obj.position-- previous position

p1 = at time t1 obj.position-- current position

if(p0==p1) then return rot0 -- no distance is traveled

dif = p1-p0 -- difference in positions

len = Length(dif) -- distance that's traveled

vec = dif / len -- normalized movement vector.

r0 = at time t0 obj.radius -- previous radius

r1 = at time t1 obj.radius -- current radius

rotax = cross vec [0, 0, 1] -- rotation axis

angle = 360*len/((r0+r1)*pi)-- rotation amount (in degs)

rotdif = quat angle rotax -- rotation from t0 to t1

rot1 = rot0 + rotdif -- total rotation

)

getrot(currentTime)

Click Evaluate and if no error is shot, click Close in the script rotation dialog box.

lets not forget the credits: http://www.cuneytozdas.com/tutorials/maxscript/

Rotación de Esfera Jorge Alejandro

Universidad La Salle Noroeste

Animación 4 - Maestro: Enrique Rosales

Jorge Alejandro Ybarra

Mat. 059018


Crear el rigging de una esfera para que gire correctamente en todos sus ejes.


Se comienza creando una esfera y un plano, siendo la esfera hija de este último, para que al mover el plano la esfera gire en los ejes X y Y.

El eje Y de la esferaes el que gira al moverse la posición X del plano; se asigna un controlador Float Expression a la rotación en el eje Y de la esfera, desde el Curve Editor.

Dentro del Float Expression se crean 2 variables:

  • posX: que está vinculada a la posición del eje X del plano.
  • radio: vinculado al radio de la esfera.


Se crea una expresión matemática que calcula los radianes que gira la esfera al desplazarse.


degToRad((posX)/(2*pi*radio))*360


donde:


  • degToRad: convierte grados a radianes.
  • pi: es variable reservada en 3DMax que contiene el valor matemático de π


Para observar la rotación de la esfera se da clic al botón Evaluar, si no hay errores cerramos el Curve Editor y movemos el plano en el eje X. Observamos como la esfera gira correctamente en su eje Y.


Hacemos exactamente lo mismo para la rotación del eje X de la esfera, sólo que se vincula con la posición Y del plano.


Ahora movemos el plano en Y, y observamos la rotación de la esfera en su eje X.
Se ha logrado que la esfera gire en base al movimiento de un controlador, alternadamente en los ejes X y Y. Sin embargo, al mover el controlador en ambos ejes, la esfera gira de forma extraña, de manera inadecuada, así que se debe buscar una solución para este problema.


Una de las posibles soluciones a este problema es el uso de Quaternion. Es una forma alternativa de representar rotaciones a través de cualquier eje. Consiste en números complejos en 4D que representan los valores de rotación mediante funciones de senos y cosenos. En otras palabras, crea un eje imaginario sobre la esfera, que controla la rotación de los demás ejes, haciendo posible que la esfera gire en 2 ejes al mismo tiempo.


Para asignar Quaternion a la esfera, desde el Curve Editor, se asigna el controlador Rotation Script a la rotación general de la esfera. Dentro de este controlador ingresamos el siguiente código:



obj = $Sphere01

timeres = 1f


fn getrot t =

(

if t<=0f then return quat 0 0 0 1

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)



Al ingresar este código simplemente se da clic en el botón Evaluar y se mueve el controlador en ambos ejes para corroborar que efectivamente la esfera se mueve correctamente en los ejes X y Y, simultáneamente.



Bibliografía: http://www.cuneytozdas.com/tutorials/maxscript/

Rotación de una esfera en todos sus ejes.

Universidad La Salle Noroeste

Animación por computadora IV

Guillermo Ruiz Félix


Objetivo


Rodar una esfera sobre una superficie plana en cualquiera de sus ejes.


Desarrollo


Se comenzará creando una esfera y un plano, donde la esfera será hija del plano para que al mover el plano, se mueva la esfera junto con él. Ahora nos dedicaremos a realizar la rotación de la esfera en el eje X, se selecciona la esfera, después abrimos el Curve Editor, buscamos la rotación de la esfera en el eje que queramos, en este caso el eje X, ya ubicado el eje deseado, le asignamos un controlador (Float Expression).


A continuación se mostrará una ventana donde crearemos dos variables:

  1. Una de ellas será para la posición en X de la esfera
  2. La otra sería para el radio de la esfera.


A la primera variable le vamos a asignar un controlador, el cual será la posición X de la esfera. A la segunda variable le asignaremos el controlador del radio de la esfera.


Volviendo al Float Expression, agregamos la siguiente expresión matemática:


“degToRad((posX)/(2*pi*radio))*360”


  • degToRad es para convertir los grados en radianes.
  • posX es la variable que habíamos creado anteriormente.
  • pi es la expresión matemática de 3.1416 y es variable reservada de 3DsMax.


Para confirmar que nuestro procedimiento fue correcto damos clic en el botón “Evaluate” y si no marca ningún error, significa que el procedimiento fue correcto y ya podemos cerrar Float Expression.


Desde la vista perspectiva, podemos arrastrar a la esfera desde su eje X y observar con claridad que la esfera rueda correctamente en su eje X.


Hasta ahora, la esfera gira en un solo eje, para poder hacer que la esfera gire correctamente en su eje Y, simplemente se aplica el mismo procedimiento utilizado para el eje X, cambiando las variables correspondientes.


Después de haber realizado el procedimiento para el eje Y, se puede observar que la esfera gira correctamente en los dos ejes, pero al momento de desplazar los dos ejes de manera simultánea, el giro de la esfera es irregular. Por lo que nos damos cuenta que el procedimiento utilizado hasta el momento, no ofrece una solución completa para alcanzar nuestro objetivo, el cuál les recuerdo que es hacer girar la esfera en todos sus ejes.


A continuación les mostraré una alternativa que dará una solución completa a nuestro problema de la esfera, utilizando “cuaterniones”.


Para los que no han escuchado acerca de los cuaterniones, aquí les presento una breve introducción, los cuaterniones son una forma alternativa de representar rotaciones a través de cualquier eje. Un cuaternión consiste en números complejos en 4D que representa los valores de rotación mediante funciones sinodales y cosinodales.


Ya que sabemos que es un cuaternión, ahora veremos como asignárselo a la esfera:


Seleccionamos la esfera y nos vamos al Curve Editor, le asignamos el controlador Rotation Script, pero ésta vez en lugar de asignarlo a cualquier eje de rotación de la esfera, se lo asignamos a la rotación general de la esfera.


Dentro del controlador Rotation Script agregamos el siguiente código:


obj = $Sphere01

timeres = 1f

-----------------------------------------------------

fn getrot t =

(

if t<=0f then return quat 0 0 0 1 -- t=0 => no rotation

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)


Después de ingresar el código, da clic en el botón “Evaluate” para confirmar que no existe ningún error, de ser así, podemos cerrar la ventana.


Éste código permitirá que al esfera gire libremente hacia cualquier dirección.


Bibliografía:

http://www.cuneytozdas.com/tutorials/maxscript/

Rotation of a sphere


Sergio margarito cabrales moreno



Well 2 weeks ago on my animation class the teacher gave us a problem to solve, he wanted us to crate a sphere and that sphere should move in any direction, this doesn’t look really difficult, the thing is that if the user change the radius or the form of the sphere, the sphere should rotate in proportion of it shape, we were a little worried because this was going to be our grade of the partial. So the class resolved the problem or we thought we had the problem solve but then we realized that as soon you rotate the sphere on the X and Y axis at the same time the sphere rotation was turn to crap, so this was the real problem to be solve.



Development of the problem


My class and i saw this homework as a teamwork so we join into some teams each team tried to solve the problem, each team searched for information, until one of the teams found the correct info and this is the way we solved it:


we create a sphere the radius doesn’t matter, on the position (0,0,0), then you assign a checker texture to the sphere so you can see the movement with clarity, ok the next step it’s to create a plane on the same coordinates of the sphere, after this you link the sphere to the plane for some movements we will do later.


Now open the curve editor, select the axis that you want the sphere to rotate ( the view should be at local) select the X axis of rotation right click on it and select add component and the select float expression, create a new variable (any name) and to this variable assign the X position of the plane, this position will be control it by an assign controller then create an other variable to assign the radius, after this you need to write this expression:


degToRad((posX)/(2*pi*radio))*360

what this expression means it’s that for each unit that the sphere moves in the Xposition it will be divided by its perimeter that will be multiplied by 360 and that result will be change into radians. with this you just need to do the same on the Y axis. But will happend what i said thte begining of the paper if you try to move the sphere in both axis at the same time the sphere will lose control.






This problel will be solve with quaternions, and a script for the sphere:


The script for the sphere its the next one:

obj = $Sphere01 -- change the name here

timeres = 1f --time which will make the difference (1frame)

fn getrot t = -- where the function is created to perform the rotation

(

if t<=0f then return quat 0 0 0 1 -- t=0 If no movement returns the quaternion basis (no rotation, because the value is 0) otherwise

t0 = t-timeres -- you subtract the current time at which requested the timer (first frame)

t1 = t -- the function is recorded


rot0 = getrot(t0) -- previous rotation


p0 = at time t0 obj.position—previous rotation

p1 = at time t1 obj.position—current rotation

if(p0==p1) then return rot0 – if they return the same value, then there’s no movement


dif = p1-p0 -- subtract positions

len = Length(dif) -- and the length function will give us the length of the previous subtraction difference

vec = dif / len -- is the normal vector with the difference between the length


r0 = at time t0 obj.radius -- previous ratdius

r1 = at time t1 obj.radius -- current radius


rotax = cross vec [0, 0, 1] – axis of rotation

angle = 360*len/((r0+r1)*pi) —amount of rotation in degrees

rotdif = quat angle rotax -- get the quaternion rotation in the difference between positions

rot1 = rot0 + rotdif -- total rotation

)


To make this work we need at least 2 different frames in motion since it requires two different times one for the position in X and the other for Y, We can also find the unit vector, dividing it by the length of the vector that is the length of the distance the ball crossed.

p0 = at time t0 obj.position
p1 = at time t1 obj.position

dif = p1-p0
len = Length (diff)
vec = diff / len

After that find the the rotation axis. with the distance and direction of motion we can get the rotation axis, the floor is oriented horizontally, so the force that it’s apply to the floor is in the z axis, The rotation axis has to be perpendicular to this vector as well, and then with that, we find the vector of the rotation axis using a cross product between vectors. 3ds Max has a function called cross. The function is rotax cross vec = [0,0,1].

So To get the quantity of rotation, if the sphere gives a complete turn, it would have to travel a distance equal to its circumference. So if we divide the distance we found prior to its circumference, well find how many rotations has to take to go that distance. The circumference of a circle is 2 * pi * r. We n to think about the radio changes then well use the average of the 2 radius at r0 and r1. So we can get the rotation angle (in degrees) needed to travel a the distance than is angle = 360 * len / ((r0 r1) * pi)


Already with the rotation axis and the times that is going to be rotated we build the QUATERNION. 3ds Max comes with a function that needs these values
rotax rotdif = quat angle
Rot1 = rot0 rotdif

and there you have it problem should be solve, this was a really complicated job to do it and to understand it, and our grades were in danger but i think we solved the problem


Sergio margarito cabrales moreno

059061

Http://www.cuneytozdas.com/tutorials/maxscript/
The code and the explanation was written by Tozdas Curney.

2)http://en.wikipedia.org/wiki/Quaternion

3)http://mathworld.wolfram.com/Quaternion.html