6. Animação
Neste exercício veremos como animar objetos 3D e câmeras em OpenGL.
1. Vai-e-vem do Cubo
Animar um objeto consiste em mudar algumas de suas propriedade ao longo do tempo.
Fig. 1 - Animação de um cubo
rebatendo entre duas paredes.
Primeiro, precisamos definir quais parâmetros iremo variar. Para o cubo da figura 1 iremos variar a coordenada x.
Para isso, criamos uma variável global X e uma variação delta:
float X = -20; |
Agora, temos que associar X ao tempo. Com a GLUT, usaremos a função glutTimerFunc:
void glutTimerFunc(unsigned int msecs, void (*func)(int
value), value); |
Ela tem que ser chamada uma vez na init() para estabelecer qual função timer será usada, como por exemplo:
void init() |
TimerFunction é uma
função chamada automaticamente que definiremos depois.
Ela é a função que vai fazer a variável X
variar ao longo do tempo.
void TimerFunction( int value ){ |
Neste exemplo usamos a seguinte função de display. Perceba que a variável X é usada para transladar o cubo.
void display(void) |
2 ) Double-buffering
Se a imagem estiver piscando durante a animação, tem que usar bufferização dupla, que consiste em renderizar para um buffer intermediário e depois rapidamente substituir a imagem atual da viewport por aquela do buffer.
Neste caso:
1. Mudar glutInitDisplayMode para ativar o double buffering:
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); |
2. No final da display(), substituir glFlush() por glutSwapBuffers :
//glFlush(); |
3) Pêndulo
Neste outro exemplo, usaremos uma função que descreve o movimento do pêndulo (ver figura 2). Neste caso, o parâmetro que modificamos é o ângulo de rotação que dá a orientação do pêndulo.
Fig. 2- Animação de um
pêndulo.
Primeiro definimos as variáveis globais :
float angle = 0; // roataion angle |
A função timer agora é um pouco diferente...
void TimerFunctionPendulum( int value ) { |
... e aqui está a nova display():
void display(void) |
4 ) Animando a câmera
Vejamos agora como animar a câmera ao
invés dos objetos.
Primeiro declaramos algumas variáveis e constantes globais:
|
Depois a função que altera os parâmetros da câmera:
void TimerCamera( int value ){ |
Sem esquecer de chamá-la na init() com valor 0:
glutTimerFunc(33, TimerCamera, 0 ); |
5 ) Todos juntos
Para terminar, colocamos todos os exemplos anteriores em uma única cena (cubo, pêndulo e movimento da câmera) como na figura 3.
Fig. 3 - Cubo, pêndulo e movimento da câmera em uma
única cena.