Computação Gráfica I

Trabalho Prático

Exercícios


2. Interação e controle da câmera virtual

Objetivo: aprender como usar a GLUT para entrada com mouse e teclado para interagir com objetos 3D e câmeras.

1. Entrada pelo teclado com a GLUT

Vocês provavelmente notaram que nos exemplos dados até agora existe uma função "void key(unsigned char k, int x, int y)". Esta é a callback da GLUT que é chamada toda vez que uma tecla é pressionada. Na verdade, vocês podem usar qualquer nome no lugar de "key". Se olharem de novo nos exemplos, encontrarão uma chamada para "glutKeyboardFunc(key)" na função main(). É ela quem atribui a "key" o papel de ser a sua função callback de teclado.

Se quiserem usar teclas não-ASCII, como:

GLUT_KEY_LEFT
tecla direcional esquerda.
GLUT_KEY_UP
tecla direcional acima.
GLUT_KEY_RIGHT
tecla direcional direita.
GLUT_KEY_DOWN
tecla direcional abaixo.


devem definir outra função callback usando "glutSpecialFunc". Vejam exemplos abaixo. Para mais detalhes e possibilidades, olhem o capítulo 7 da referância da GLUT: http://www.opengl.org/resources/libraries/glut/spec3/spec3.html.

// Chamada quando uma tecla eh pressionada
void key(unsigned char k, int x, int y) {
   
    if( k == 'q' ) exit(0);
}

// Chamada quando uma tecla especial eh pressionada

void specialKey(int key, int x, int y) {
 
    if(glutGetModifiers() & GLUT_ACTIVE_SHIFT) { // testing SHIFT status
    switch(key) {
        case GLUT_KEY_LEFT:
          // do whatever you want
          break;
        case GLUT_KEY_RIGHT:
          // do whatever you want

          break;
        case GLUT_KEY_UP:
          // do whatever you want

          break;
        case GLUT_KEY_DOWN:
          // do whatever you want

          break;
        }
    }
}

/// At initialization time (in the main function, for example)
glutKeyboardFunc(key);
glutSpecialFunc(specialKey);

2. Interceptando eventos do mouse com a GLUT

Da mesma forma que com o teclado, deve-se definir uma função callback para ler informação do mouse. Chamem "glutMouseFunc(myMouseFunction)" na inicialização para definir sua função callback de mouse. Consultem o exemplo abaixo e para mais possibilidades olhem de novo o capítulo 7 da referência da GLUT: http://www.opengl.org/resources/libraries/glut/spec3/spec3.html.

void mouseFunc( int button, int state, int x, int y ) {

   
    if( button == GLUT_LEFT_BUTTON && state == GLUT_DOWN )
    {
        doSomethingWithMousePosition( x, y );
    }
}

// this line must be included at initialization time
glutMouseFunc( mouseFunc );

3. Gerenciamento de menus com a GLUT

Para criar menus com a GLUT, existem 3 funções principais usadas respectivamente para inicializar um menu, adicionar itens a ele e adicionar submenus a ele. Então, uma vez que o menu esteja registrado, o sistema de callback irá chamá-lo com as informações que dizem respeito à entrada selecionada.

Chamem glutAttachMenu para inicializar o sistema de menu.:

glutAttachMenu(): Define o que inicia o menu, por exemplo, clique com o botão direito

glutChangeToMenuEntry(): Muda a aparência de uma entrada no menu usando o menu atual como referência. POde ser usada para marcar qual entrada está ativa, por exemplo.

Outras funções que devem ser usadas:

glutCreateMenu(): seta a funcao callback para um menu e retorna um handle (identificador) que pode ser usado para registrar este menu como um submenu.

glutAddMenuEntry(): Adiciona uma entrada no final menu; também seta o texto do menu.

glutAddSubMenu(): Registra um submenu usando o identificador de um menu já existente e seta o seu texto.

Vejam o exemplo (menu.c)

 

Fig. 1 - Exemplo de um menu da GLUT

Fazer:

1. Olhar o exemplo pra descobrir onde e como as funções do menu devem ser chamadas.
2. Implementar um sistema de menu para o seu prórpio programa (o das casas por exemplo) para escolher entre visualização em wireframe ("fios de arame") ou preenchida ("sólido") e cores.

4. Controle de câmera

Uma maneira de implementar o controle de câmera em OpenGL e GLUT é usando a função gluLookAt. Esta função permite especificar a posição da câmera no espaço 3D e o ponto para onde a câmera está olhando. O vetor vertical da câmera também deve ser dado. Chamem gluLookAt na sua função display, logo antes de desenhar objetos.

void gluLookAt(GLdouble eyex,
GLdouble eyey,
GLdouble eyez,
GLdouble centerx,
GLdouble centery,
GLdouble centerz,
GLdouble upx,
GLdouble upy,
GLdouble upz)

Há uma aplicação disponível aqui (ver figura 2), que vocês podem usar para testar interativamente o efeito dos parâmetros dados à gluLookAt e à gluPerspective; esta última é chamada na função "reshape" em exercícios anteriores. A aplicação é um tutorial que deve ajudá-los a entender o papel de cada parâmetro.

Fig. 2 - Programa tutorial sobre projeção.
(c) Nate Robins (fonte: http://www.xmission.com/~nate/tutors.html)


Sua vez de jogar: Agora, usem as funções de teclado e mouse para mudar os parâmetros da sua câmera.