Principios de mecánica y animación - Parte 2

Modificaciones del reloj en base a la función lineal

Si analizamos las gráfica de velocidad en función del tiempo del movimiento uniforme, comprobaremos que los valores de velocidad conforman una recta horizontal debido a que la velocidad es constante. En los movimientos uniformemente variados, la velocidad también conforma una recta, debido a que la aceleración es constante, pero al ser la velocidad inicial distinta a la velocidad final, la misma presenta una inclinación o pendiente.

MRU v(t)

MRUA v(t)

MRUD v(t)

MRU v(t) MRUA v(t) MRUD v(t)
y = 0 * x + 1  m = 2/1 : y = 2 * x + 0 m = -2/1 : y = -2 * x + 2

Podemos entonces estudiar estos movimientos como funciones lineales, basándonos en la ecuación de la recta:

y = m * x + b

en donde m es el coeficiente angular de la recta, llamado pendiente y b la ordenada al origen.

Si x asume el valor de clock, obtendremos la velocidad instantánea (velocidad en el instante) en cada fase del movimiento. Determinando el valor de la aceleración, podremos conocer la posición del objeto por medio de la ecuación horaria de espacio:
e = Vo * Dt + ½ a * Dt2

Vamos a analizar un poco las graficas para ver como se comportan la aceleración y las otras variables relacionadas con ella, en cada uno de los casos.

El primer caso corresponde al movimiento uniforme debido a que la velocidad es constante en función del tiempo. Por ende, las velocidades inicial y final tienen el mismo valor, y su aceleración es nula al igual que la pendiente de la recta.
El segundo caso corresponde al movimiento uniformemente acelerado. La aceleración es positiva al igual que la pendiente, debido a que la velocidad final, es superior a la inicial.
El tercero corresponde al movimiento uniformemente desacelerado. La aceleración es negativa al igual que la pendiente, debido a que la velocidad final, es inferior a la inicial.
La ordenada al origen b representa a la velocidad inicial en los tres casos.

Si definimos la distancia a recorrer en una unidad de longitud y el intervalo de tiempo para hacerlo en una unidad de tiempo, la velocidad relativa a los mismos será igual a una unidad de velocidad, de acuerdo a la fórmula v = e / t, como se aprecia claramente en el primer gráfico.
Si balanceamos la recta (en realidad lo que se ve es un segmento de ella) por su centro hasta hacer llegar su extremo izquierdo al nivel cero, obtendremos el segundo gráfico cuya pendiente será 2, al igual que la diferencia relativa de velocidades. Siendo el intervalo de tiempo igual a uno, la aceleración tendrá el mismo valor (2, en unidades de aceleración) que Dv, conforme a la fórmula
a = v / t

El gráfico no nos muestra los valores de espacio, pero podemos deducirlo en los tres casos a partir de la velocidad media:
Vm = De / Dt

Es para mantener la velocidad media y el valor de espacio sujeto a 1, que hemos balanceado la recta por su centro. De este modo podremos utilizar esta función como un modificador del reloj que nos devuelva segmentos proporcionales de espacio con valores entre 0 y 1. La velocidad final podría ser tan alta como quisiéramos, pero en la unidad de tiempo nos daría valores de espacio mayores a 1.

Por lo tanto el límite o valor máximo de la pendiente lo encontraremos al llegar al doble de la velocidad media en un extremo, y al llegar a valor cero en el otro. La aceleración tendrá el mismo valor y signo de la pendiente en cada uno de los casos (0, 2, -2). El tiempo y espacio total serán siempre iguales a 1, pero la aceleración determinará como se recorre el trayecto.

Del mismo modo las velocidades iniciales y finales serán coeficientes relativos a una unidad de espacio en una unidad de tiempo de reloj. Si le dieramos a b (velocidad inicial) un valor de 0.5, la velocidad final tendría que ser (2 - 0.5 = 1.5), para poder mantener la velocidad media igual a 1.

Suponiendo que queremos animar un objeto con Vo = <10, 10, 0> km/h, que acelera en 5 segundos a <30, 15, 0> km/h, podríamos aplicar el modificador de reloj del siguiente modo:

 // framerate = 15 fps : 15 cuadros por segundo
  #declare Time = 5; // segundos
 // +kff 75 (framerate * time)  : Final Frame = 75

  global_settings{assumed_gamma 1.0}

  #macro MClock(f_vo, reloj)
   #local f_vf = <2, 2, 2> - f_vo;
   #local f_a = f_vf - f_vo; // (Vf-Vo)/1 o pendiente m
  // Ecuacion de espacio e = vi.t + ½ a.t²
   #local f_e = f_vo * reloj + (f_a * reloj * reloj/2);
   f_e
  #end

  #declare MiObjeto = sphere{0, 2 translate y * 1 pigment{rgb x}}

 // Posicion inicial, velocidad inicial, velocidad final
 // 1 unidad POV = 1 metro
  #declare Pos_i = <10, 0, 0>;      // m
  #declare Vo = <10, 10, 0>;        // km/h
  #declare Vf = <30, 10, 0>;        // km/h
 // Vm = (Vo+Vf)/2 
  #declare Vm = (Vo+Vf)/2; // km/h
  #declare fVo = Vo/Vm;    // Coeficiente de Vo = <0.5, 1, 0>

 // Convertimos de km/h a m/s (*1000/3600)
  #declare Vm = Vm / 3.6;

 // e = Vm * t 
  #declare deltaE = Vm * Time; 

 // Desplazamiento
  #declare Er = deltaE*MClock(fVo, clock); 

   object { MiObjeto translate Pos_i + Er }

 camera{ 
  location <25,13,-30>
  look_at  <25,13,0>
  }
 light_source{<500, 1000, -2500> rgb 1}
 plane{z,0 pigment{checker rgb 1 rgb 0.9} scale 5}

El ejemplo anterior es solo una opción, mas demostrativa que práctica, si tenemos que representar un movimiento uniforme, acelerado o no, desconociendo el punto de destino y utilizando una funcion de clock.
En la mayoría de los casos vamos a conocer el punto de partida y de destino de nuestro móvil. Puede lograrse lo mismo a partir de estos datos, si condensamos lo que hemos visto hasta ahora, en una macro general de movimientos uniformes.

 global_settings{assumed_gamma 1.0}

 #macro MPosicion(Pos_i,Pos_f,FVo,TimeSegment)
   #local Vm =(Pos_f-Pos_i)/(TimeSegment.y-TimeSegment.x);
   #local Vo = Vm * FVo;
   #local Vf = Vm * (2-FVo); 
   #local a = (Vf-Vo)/(TimeSegment.y-TimeSegment.x);
   #local Instante = (TimeSegment.y-TimeSegment.x)*MClock;
   // Ecuacion de espacio e = vi.t + ½ a.t²
   #local Posi = Pos_i + Vo * Instante + (a * Instante * Instante / 2);
   Posi  // La macro devuelve el valor en esta variable
 #end

  #declare MiObjeto = sphere{0, 2 translate y * 1 pigment{rgb x}}

 //#declare MClock = 0; #while (MClock <= 1) // (*)
 #declare MClock = clock; 
 object { MiObjeto translate 
          MPosicion(<10,0,0>,<37.77,13.88,0>,<0.5,0.8,0>,<0,5>) }
 //#declare MClock = MClock + 0.1; #end      // (*)

 // Luz, Cámara y Fondo
 camera{ 
  location <25,13,-30>
  look_at  <25,13,0>
  }
 light_source{<500, 1000, -2500> rgb 1}
 plane{z,0 pigment{checker rgb 1 rgb 0.9} scale 5}

Esta macro utiliza un coeficiente de Vo (FVo =1 es MU, FVo<1 es MUA, FVo entre 1 y 2 es MUD), el segmento de espacio a recorrer entre la posición inicial y la final, y el intervalo de tiempo (TimeSegment) expresado por razones de comodidad en la forma vectorial <x,y>, en donde "x" es el instante inicial e "y" el instante final. En este ejemplo utilizo como unidades, metros y segundos respectivamente. Las líneas 12 y 16, marcadas con un asterisco, permiten reemplazar la declaración "MClock = clock", para poder ver todo el movimiento desplegado en una sola imagen, mediante un bucle.



Copyright 2006 Rodolfo Nothstein
Created: Nov 15 2006 - Last Change: April 20 2007