Aula Prática 4 (Visualização 3D em OpenGL)
Disciplina: Computação Gráfica
Professora: Isabel Harb Manssour
 

O objetivo desta aula é aprender como trabalhar com a visualização 3D em OpenGL. Para isto, é necessário compreender como são utilizadas as funções de projeção e manipulação da câmera em OpenGL. Inicialmente faça o download do programa que será usado nesta aula. Grave este arquivo no drive h e inclua-o no projeto para o ambiente Dev-Cpp já fornecido na primeira aula prática . Lembre de remover os programas fontes anteriores do projeto para incluir o programa fonte que será usado nesta aula.

Importante: caso você não consiga executar o exemplo no Dev-C++, elimine a linha de comando
glutWireTeapot(50.0f);
que desenha um teapot, e acrescente a linha de comando abaixo para que seja desenhado um torus.
glutWireTorus(30, 50, 20, 20);

Inicialmente, analise o código fonte para entender o que programa faz.

A função gluLookAt(0,80,200, 0,0,0, 0,1,0); define a câmera, isto é, através dos seus argumentos é possível indicar a posição da câmera e para onde ela está direcionada. Seu protótipo é: void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez, GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz );. Os parâmetros: eyex, eyey e eyez são usados para definir as coordenadas x, y e z, respectivamente, da posição da câmera (ou observador); centerx, centery e centerz são usados para definir as coordenadas x, y e z, respectivamente, da posição do alvo, isto é para onde o observador está olhando (normalmente, o centro da cena); upx, upy e upz são as coordenadas x, y e z, que estabelecem o vetor up (indica o "lado de cima" de uma cena 3D) [Wright 2000].

Agora altere o parâmetro upy para -1 e veja o que acontece com o teapot. Depois, atribua o valor 1 para upy novamente. Em seguida, altere o parâmetro eyez para 100, compile e visualize o resultado. Depois altere este mesmo parâmetro para 300, compile e visualize o resultado novamente. Na seqüência, passe o valor 200 para este parâmetro. Altere o parâmetro centerx para 20, compile e execute o programa. Agora altere este mesmo parâmentro para -20, compile e execute o programa.

Considerando as alterações feitas, e a teoria estudada em aula, pense em que consiste alterar os parâmetros eyex, eyey, eyez, centerx, centery e centerz.

Agora inclua a função abaixo no código fonte TeaPot3D.c.

// Callback para gerenciar eventos do teclado para teclas especiais (F1, PgDn, entre outras)
void SpecialKeys(int key, int x, int y)
{
switch (key) {
case GLUT_KEY_LEFT :
obsX -=10;
break;
case GLUT_KEY_RIGHT :
obsX +=10;
break;
case GLUT_KEY_UP :
obsY +=10;
break;
case GLUT_KEY_DOWN :
obsY -=10;
break;

case GLUT_KEY_HOME :
obsZ +=10;
break;
case GLUT_KEY_END :
obsZ -=10;
break;
}
glLoadIdentity();
gluLookAt(obsX,obsY,obsZ, 0,0,0, 0,1,0);
glutPostRedisplay();
}

No início do programa, acrescente as variáveis globais que aparecem abaixo.

#include <gl/glut.h>
GLdouble obsX=0, obsY=0, obsZ=200; //acrescente esta linha

Para que o zoom continue funcionando corretamente, na função PosicionaObservador troque a linha de código gluLookAt(0,80,200, 0,0,0, 0,1,0); para gluLookAt(obsX,obsY,obsZ, 0,0,0, 0,1,0);.

Na função main inclua a seguinte chamada de função glutSpecialFunc(SpecialKeys); antes da chamada para a função Inicializa();. Compile e execute o programa. Você verá que através destas alterações é possível alterar a posição do observador mantendo sempre o mesmo alvo.

A função gluPerspective(angle,fAspect,0.1,500); estabelece os parâmetros da Projeção Perspectiva, atualizando a matriz de projeção perpectiva. Seu protótipo é: void gluPerspective( GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar );. Descrição dos parâmetros: fovy é o ângulo, em graus, na direção y (usada para determinar a "altura" do volume de visualização); aspect é a razão de aspecto que determina a área de visualização na direção x, e seu valor é a razão em x (largura) e y (altura); zNear, que sempre tem que ter um valor positivo maior do que zero, é a distância do observador até o plano de corte mais próximo (em z); zFar, que também sempre tem que ter um valor positivo maior do que zero, é a distância do observador até o plano de corte mais afastado (em z). Esta função sempre deve ser definida ANTES da função gluLookAt, e no modo GL_PROJECTION [Wright 2000].

Altere o parâmetro zNear da função gluPerspective para 0.5 (as vezes pode haver um problema na iluminação se o valor for muito baixo, tal como 0.1). Agora coloque 2 no lugar de fAspect, compile e execute para ver o que acontece. Troque o valor 2 por 0.5, compile e execute novamente. Coloque novamente a variável fAspect no segundo parâmetro da gluPerspective. Com estes testes, foi possível verificar as conseqüências de alterar a razão de aspecto.

Agora altere o parâmetro zNear da função gluPerspective para 210, compile e execute para ver o que acontece. Coloque novamente o valor 0.5 para zNear e troque o valor de zFar para 200, compile e execute. Coloque novamente o valor 500 para zFar.

Exercício: altere a implementação para que seja desenhada uma pirâmide formada por uma lista de vértices e uma lista de arestas no lugar do teapot. Dica: Faça o desenho usando GL_LINES.

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

../../Imagens/E-MAIL.JPG (3237 bytes) Comentários, dúvidas, sugestões, envie um mail para pinho@inf.pucrs.br

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