Aula Prática: Introdução à OpenGL
Disciplina: Computação Gráfica
Professora: Isabel Harb Manssour
 

O objetivo desta aula aprender a utilizar a biblioteca OpenGL. Para isto, serão utilizadas as bibliotecas OpenGL, GLU e GLUT, de maneira que o programa fique portável e possa ser executado tanto no ambiente Windows como no ambiente Linux.

Nas aulas práticas será utilizado o compilador free Dev-C++. Em princípio, tanto este compilador como a biblioteca GLUT já estão instalados no laboratório. Portanto, será explicado somente como utilizá-los.

Para implementação de aplicações OpenGL na linguagem de programação C/C++ é necessário criar um projeto para linkar as bibliotecas. Clicando aqui, você pode obter o projeto, bem como o código fonte que será utilizado na aula de hoje. Para implementação de outras aplicações, é possível utilizar este mesmo projeto e remover o(s) programa(s) fonte(s) anterior(es) para incluir um novo programa fonte (veja a opção Add to project do menu Project). Para criar um novo projeto, basta selecionar a opção Novo-Projeto... do menu Arquivo. Na janela que é aberta é necessário selecionar a aba MultiMedia e o ícone da GLUT. Instruções de como criar um projeto em versões mais antigas do Dev-C++ estão disponíveis aqui.

Inicialmente, verifique o conteúdo do programa fonte fornecido para tentar entender o seu conteúdo. Depois, compile e execute o programa que abrirá uma janela com fundo branco e um triângulo, conforme mostra a próxima figura.

Observe atentamente o código para entender o seu funcionamento, considerando a estrutura básica de um programa OpenGL:

  • Função main, onde a comunicação com a OpenGL é estabelecida e são disparadas as inicializações necessárias, que inclui a definição das funções callback;
  • Função que contém as inicializações relativas à exibição (Inicializa);
  • Função callback (Desenha) responsável pelo desenho;
  • Função callback (Teclado) que é chamada sempre que uma tecla for pressionada.

Agora altere o código fonte conforme descrito a seguir e, a cada alteração, compile e execute novamente o programa para verificar os resultados obtidos. Em caso de dúvida, consulte a professora ou o tuturial de introdução à OpenGL disponível em http://www.inf.pucrs.br/~manssour/OpenGL/Tutorial.html.

  • Troque a cor de fundo da janela, modificando os argumentos da chamada da função glClearColor(0.0f, 0.0f, 0.0f, 1.0f), e as cores do desenho (glColor3f(1.0f, 0.0f, 0.0f);); Deixe a cor de fundo como preto;
  • Ao invés de passarmos três números float para especificar a cor do desenho, é possível passar três números inteiros entre 0 e 255. Para isso, altere a chamada da função glColor3f para glColor3ub e passe três números inteiros para especificar a cor do objeto;
  • Altere o nome e o tamanho da janela GLUT nas funções de inicialização chamadas na main;
  • Desenhe duas linhas que representem os eixos cartesianos do universo (use glBegin(GL_LINES) e glEnd(), acrescentando os quatro vértices necessários para o desenho dos eixos); Considere que as coordenadas mínimas e máximas são, respectivamente, -1.0 e 1.0. Importante: todas as rotinas de desenho devem ser chamadas na função Desenha;
  • Substitua a chamada à função glBegin(GL_TRIANGLES);....glEnd(); pelo desenho de um triângulo e de um quadrado, que devem ser definidos de maneira a formar uma casinha, como mostra a próxima figura. Os comandos para desenhar o "telhado" da casinha são apresentados a seguir. Tente desenhar o resto da casinha usando GL_LINE_LOOP. Observe que quando a cor é trocada de um vértice para o outro, OpenGL faz um degrade entre as cores.
    glLineWidth(3); // Determina a espessura da linha que será desenhada
    glBegin(GL_TRIANGLES);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex2f(-0.2,0.1);
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex2f(0.0,0.22);
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex2f(0.2,0.1);
    glEnd();
  • Aplique uma tranformação geométrica de tranlação na casinha para mudá-la de lugar (importante: a translação, bem como as transformações de escala e rotação, deve ser aplicada antes que a casinha seja desenhada);

Como fazer para interagir com o programa sem que seja necessário compilar o código cada vez que o objeto, por exemplo, é trocado de lugar? Neste caso, utiliza-se uma função callback para gerenciar eventos do teclado e/ou mouse. Assim como já é feito com a callback que gerencia eventos do teclado "padrão", vamos registrar uma unção callback para gerenciar eventos das teclas especiais acrestando a seguinte linha de código na função main, antes da chamada para a função Inicializa():
glutSpecialFunc(TeclasEspeciais);

Em seguida, declare as seguintes variáveis globais, logo após os includes, utilizando um tipo de dado OpenGL:
GLint tx, ty;

Inicialize estas variáveis na função Inicializa() com os seguintes valores:
tx = 0;
ty = 0;

Agora altere os parâmetros passados para a função glTranslatef que é chamada na função Desenha, para que sejam passadas estas variáveis, da seguinte maneira:
glTranslatef(tx, ty, 0);

Finalmente, para fazer o tratamento dos eventos, inclua e termine de implementar a função callback TeclasEspeciais descrita abaixo. Complete código desta função de maneira a permitir transladar o objeto para cima, para baixo, para a esquerda e para a direita sempre que o usuário pressionar cada uma das teclas de setas (incremente e decremente as variáveis tx e ty)

void TeclasEspeciais(int key, int x, int y)
{
    switch (key)
    {
  	case GLUT_KEY_UP:
                             break; 
    	case GLUT_KEY_DOWN:
                             break; 
    	case GLUT_KEY_LEFT: 
                             break; 
   	case GLUT_KEY_RIGHT:  
                             break; 
    }
    glutPostRedisplay();
}

Para outras informações sobre o tratamento de eventos, consulte o tutorial de OpenGL (http://www.inf.pucrs.br/~manssour/OpenGL/Eventos.html).

 ../../Imagens/emban15.png (1469 bytes)

../../Imagens/E-MAIL.JPG (3237 bytes) Comentários, dúvidas, sugestões, envie um mail para [email protected]

../../Imagens/emban15.png (1469 bytes)

[Homepage CG]  [Homepage CG-SI]

Última alteração em 08 de agosto de 2006.