Sei sulla pagina 1di 6

Prctica 6

Animacin. Interpolacin
6.1. Introduccin
En esta primera prctica sobre animacin, se aborda el movimiento de los objetos.
Tenemos la intencin de, dados un punto de partida P
inicial
y de llegada P
f inal
, mover
el objeto desde el punto de partida hasta el de llegada, en una trayectoria lineal, con la
orientacin denida por el vector

O = P
f inal
P
inicial
, y con un movimiento que bien puede
ser lineal o senoidal.
El posicionamiento y orientacin de los objetos se ha visto en las anteriores prcticas.
Solamente hay que indicar que cada objeto ledo de un chero .ply tiene su propia orien-
tacin (lo que es hacia adelante). Esto debe ser tenido en cuenta cuando se calculan y
aplican los ngulos pues sino afectar a la correcta visualizacin. Por ejemplo, la hormiga
tiene una orientacin hacia adelante (0, 0, 1), mientras que la del coche es (1, 0, 0)
Veamos en que consisten las dos formas de movimiento. Teniendo en cuenta que la tra-
yectoria es lineal (vase que para ir de un punto a otro se pueden escoger innitas trayecto-
rias), el movimiento nos dice cmo, en relacin al tiempo, se va a recorrer dicha trayectoria.
Por ejemplo, dado un camino o trayectoria, una coche puede recorrerla avanzando el mismo
espacio en cada periodo de tiempo. En este caso hablaramos de un movimiento uniforme,
que se describe con una funcin lineal (Figura 6.1, a). Si, en cambio, el coche comienza
con una velocidad pequea, la cual va aumentado, hata que se estabiliza, y a continuacin
invierte el proceso, decreciendo la velocidad al aproximarse al destino, hablaramos de un
movimiento con aceleracin y desaceleracin, que se puede describir con una funcin se-
noidal (Figura 6.1, b).
6.2. Objetivos
Se incluir en la prctica anterior el cdigo que permita generar una escena con un
objeto .ply (p.e. la hormiga). El mismo se mover con trayectoria lineal, con la orientacin
de dicha trayectoria, y con el movimiento controlado por funciones lineales o senoidales.
Se podr cambiar a movimiento lineal pulsando la tecla l, y a movimiento senoidal con la
tecla k. Para activar la animacin se apretar la tecla F12.
Domingo Martn Perandrs c
66 Animacin. Interpolacin
(a) (b)
Figura 6.1: (a) Movimiento lineal. (b) Movimiento senoidal
6.3. Desarrollo
Dado que esta prctica es la base de la siguiente, es conveniente realizar el desarrollo
de la misma teniendolo en cuenta. En la prxima prctica ser necesario crear un conjunto
de particulas, entidades con atributos. En esta prctica vamos a facilitar su desarrollo
mediante la creacin de una prticula.
En la anterior prctica se han podido visulizar varias instancias del objeto leido. Aunque
el resultado visual es similar, la codicacin propuesta hasta ahora no es la ms ptima para
la aplicacin que se pretende realizar: no existe el concepto de entidad con atributos. Como
se ha hecho anteriormente, la solucion consiste en crear una clase que permita encapsular
los atributos y la funcionalidad. Por ejemplo, se tendran variables para indicar la posicin,
la orientacin el color, etc., y funcionalidad para dibujarse, calcular las posiciones, etc. Ya
que el objeto se tiene que visualizar, y su aspecto dependera del chero ply leido, se debe
incluir en el objeto una referencia (puntero) al objeto leido. Esto es, slo se lee un objeto,
pero se puede visualizar varias veces.
La otra idea importante se reere a la pregunta cmo puedo simular el paso del tiempo
en una aplicacin controlada por eventos?; cada vez que el objeto cambia debe ser dibujado
donde (en que funcin) se cambia el objeto?. La solucin est en dos tipos de eventos: el
evento reloj (Timers) y el evento desocupado (Chore).
Mediante el evento reloj puedo indicar a la aplicacin una funcin que ser llamada
cuando el contador que se ha denido llegue a 0. Este reloj-contador es controlado por el
bucle de eventos. Su uso sera el siguiente: cada vez que se produce un evento de reloj,
se cambia la posicin del objeto y se indica que se debe dibujar. Aunque es una posible
solucin tiene el problema de establecer un intervalo de tiempo jo. Esto supone saber
cunto tiempo se va a consumir en hacer todos los procesos necesarios, sin que los mismos
sean interrumpidos. Esto no suele ser eciente.
La solucin se encuentra en el evento desocupado. Como su propio nombre indica, este
evento ocurre cuando todos los dems han sido atendidos. Por tanto, es independiente de lo
que duren el resto de procesos, y se garantiza su llamada de forma cclica. Al igual que con
los otros eventos, se debe asignar una funcin a este evento.
Para Fox, los pasos a realizar son los siguientes:
Domingo Martn Perandrs c
6.4 Evaluacin 67
1. Se dene el identicador del evecto. Por ejemplo, ID_CHORE
2. Se dene la funcin que tratar el evento. Por ejemplo:
long on_chore(FXObject
*
sender,FXSelector message,void
*
ptr);
3. Se establece la relacin entre el mensaje y su funcin. Por ejemplo:
FXMAPFUNC(SEL_CHORE,_gl_window::ID_CHORE,_gl_window::on_chore)
4. Se activa el funcionamiento del evento con:
getApp()->addChore(this,ID_CHORE);
Una caracterstica importante a tener en cuenta es que una vez que el evento ha sido
tratado por la funcin el mismo es deshabilitado. Esto supone que si queremos volver a
usarlo (como es en este caso), hay que volver a activarlo.
Dado que queremos que el objeto se mueva desde una posicin a otra a partir de que
se active la animacin, tendremos que indicar una posicin inicial (la original del modelo)
y una posicin nal, y en la funcin que trata el evento desocupado, controlar cuando el
objeto llega a la posicin nal. Cuando esto ocurre, la que era posicin inicial toma los
valores de la posicin nal, y se calcula una nueva posicin nal (entindase que cuando se
habla de posicin, no solo se reere a la misma si no tambin la orientacin).
Veamos cmo se implementa el movimiento desde una posicin inicial a otra nal.
Uno de los parmetros que se debe denir para el objeto es la velocidad, dada como la
cantidad de espacio recorrido por unidad de tiempo, o tick. Hay que tener claro que para
nuestro ejemplo la unidad de tiempo o tick es cada vez que ocurre el evento desocupado;
es un tiempo discreto. Con este parmetro, podemos calcular el nmero de ticks que son
necesarios para ir de una posicin a otra. Por ltimo, debemos aadir un contador de ticks,
que se inicializa a cero cuando se calcula un nuevo punto nal, y que cada vez que se obtiene
una nueva posicin se incrementa en 1, hasta llegar al nmero de ticks necesarios. Estas dos
variables se usan en una funcin paramtrica. Veamos el caso del movimiento lineal.
t=(float) Contador_ticks++/(float) Numero_ticks;
Posicion_actual=Posicion_inicial
*
(1-t)+Posicion_final
*
t;
De esta manera tan simple se implementa el movimiento lineal. Vase lo fcil que es de-
tectar si el objeto ha llegado a la posicin nal. Para el caso del movimiento con aceleracin
y desaceleracin, utilizaremos una funcin coseno. Se debe buscar la zona de la funcin en
la que se cumpla que comienza con un cambio pequeo, pero que se va acelerando, para
llegar de nuevo a un cambio lento en la desaceleracin.
Por ltimo, se debe poder controlar la velocidad mediante las teclas +, para aumentarla,
y -, para reducirla.
6.4. Evaluacin
Se evaluarn los siguientes puntos:
Creacin de una clase para el objeto animado. Al objeto se le podr asignar cualquier
objeto geomtrico de tipo .ply, cargado al comenzar el programa.
El objeto se mover desde una posicin inicial a otra nal, con la orientacin de la
trayectoria. La animacin se activar con la tecla F12.
Domingo Martn Perandrs c
68 Animacin. Interpolacin
Figura 6.2: Uso de la hormiga como modelo y diferente fotogramas del movimiento.
Se podr cambiar el tipo de movimiento a lineal (l) o senoidal (k)
Se podr controlar la velocidad (teclas + y -)
6.5. Temporizacin: 4h
6.6. Mejoras
6.7. Bibliografa
Mark Segal y Kurt Akeley;The OpenGL Graphics System: A Specication (version
1.5); http://www.opengl.org/
Edward Angel;Interactive Computer Graphics. A top-down approach with OpenGl;
Addison-Wesley, 2000
J. Foley, A. van Dam, S. Feiner y J. F. Hughes; Computer Graphics: Principles And
Practice, 2 Edition; Addison-Wesley,1992
Domingo Martn Perandrs c
6.7 Bibliografa 69
A. Watt y M. Watt; Advanced Animation And Rendering Techniques. Theory And
Practice; Addison-Wesley, 1992
Domingo Martn Perandrs c
70 Animacin. Interpolacin
Domingo Martn Perandrs c

Potrebbero piacerti anche