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
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) No início do programa, acrescente as variáveis globais que aparecem abaixo. #include <gl/glut.h> 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.
Comentários, dúvidas, sugestões, envie um mail para pinho@inf.pucrs.br |