Computação Gráfica – Transformações Projetivas Profa. Mercedes Gonzales Márquez Tópicos Conceito de Projeção Projeção Paralela (Ortográfica) e Projeção Perspectiva Projeções em OpenGL A Câmera OpenGL O modelo de visualização em OpenGL, é similar a uma câmera fotográfica! – Tripé: visualização – Modelo: modelagem – Lente: projeção – Papel: viewport Analogia da Câmera (OpenGL) O processo de transformação para produzir a cena desejada para visualização é análogo a tirar uma foto com uma câmera. Os passos são: – 1. Orientar a câmera em direção da cena (transformação de visualização) – 2. Posicionar devidamente o(s) objeto(s), a serem fotografados, no cenário (transformações geométricas estudadas em aula, também chamadas transformações de modelagem). – 3. Escolher o lente da câmera ou ajustar o zoom (transformação de projeção). – 4. Determinar o tamanho desejado para a fotografia final (transformação de viewport). Transformações Projetivas – – A projeção permite a visualização bidimensional de objetos tridimensionais. Para gerar a imagem de um objeto 3D a partir de um ponto de vista dado, é necessário realizar a sua projeção, ou seja, converter as suas coordenadas 3D em coordenadas 2D. Elementos básicos da Projeção Plano de Projeção; Projetante, ou raio projetante; Centro de projeção. y P Raio de Projeção P´ Plano de Projeção x z Elementos básicos da Projeção Plano de Projeção: A superfície onde será projetado o objeto, ou seja, onde ele será representado em 2D; Projetante, ou raio projetante: Retas que passam pelos pontos do objeto e pelo centro de projeção. Centro de projeção: Ponto fixo de onde os raios projetantes partem. Tipos de Projeção Existem dois tipos de projeção: (a) Projeção Paralela, Ortogonal ou ortográfica (b)Projeção perspectiva Tipos de Projeção (a) Projeção perspectiva : É a mais realista, pois é análogo ao processo de formação de imagens em nossos olhos ou numa câmera fotográfica. Considera a profundidade como elemento de seu cálculo e apresenta um resultado mais familiar ao observador humano. Tipos de Projeção (b)Projeção Paralela ou ortográfica: É a projeção ortogonal de um ponto no plano de projeção. Pode ser vista como uma projeção perspectiva onde o centro de projeção está no infinito. Projeção Paralela As linhas que unem os pontos A e B às suas projeções A’ e B’ são paralelas, isto faz com que o segmento projetado tenha o mesmo tamanho para qualquer distância entre o plano de projeção e o objeto. Tipos de Projeção Matriz de Projeção Paralela Se quisermos a projeção ortográfica em relação ao x' 1 0 plano xy (ou z=0), a y ' 0 1 matriz em coordenadas z ' 0 0 homogêneas é 1 0 0 0 0 0 0 0 x 0 y 0 z 1 1 Se no lugar do plano z=0 for escolhido outro plano qualquer z=Tz paralelo a ele, a matriz será x' 1 0 0 0 x y ' 0 1 0 0 y z ' 0 0 0 Tz z 1 0 0 0 1 1 Modelo perspectivo ideal p y x o Plano imagem p1 f P1 z O P y x p1 o Plano imagem O f p P1 z P Matriz de Projeção Perspectiva y Plano de projeção x (x´,y´) (x,y,z) f Centro de projeção Por similaridade de triângulos temos x' 1 y ' 0 z ' 0 1 0 0 0 1 0 0 0 0 1/ f 0 x 0 y 0 z 1 1 x' x f z f y' y f z f Projeções em OpenGL A transformação de projeção em OpenGL descreve como especificar a forma e orientação do volume de visualização. O volume de visualização determina: como a cena será projetada na tela (com projeção paralela ou perspectiva) e quais objetos ou partes de objetos serão eliminados da cena. Projeção paralela ortográfica Projeção em perspectiva Centro de projeção fixo: eye (posição da câmera) Duas possibilidades: – – Determina um tronco de pirâmide: glFrustrum Determina o ângulo de visão gluPerspective Definição do volume de visualização glFrustrum(left, right, bottom, top, near, far); nao precisa ser simétrico gluPerspective(fovy, aspect ratio, near, far); simétrico Esses comandos definem a matriz de projeção (PROJECTION) glFrustrum glFrustrum gluPerspective gluPerspective Matrizes de transformação glMatrixMode(GL_PROJECTION); – Define tipo e parâmetros da projeção Exemplo – Cubo (Programa cube.c) Um cubo é escalado pela transformação de modelagem glScalef (1.0, 2.0, 1.0). A transformação de visualização gluLookAt(), posiciona e orienta a câmera em direção do cubo. As transformações de projeção e viewport são também especificadas. Exemplo – Cubo (Programa cube.c) Example 3-1 : Transformed Cube: cube.c #include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> void init(void){ glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } Exemplo – Cubo (Programa cube.c) void display(void){ glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); /* clear the matrix */ /* viewing transformation */ gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glScalef (1.0, 2.0, 1.0); /* modeling transformation */ glutWireCube (1.0); glFlush (); Exemplo – Cubo (Programa cube.c) void reshape (int w, int h){ glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode (GL_MODELVIEW); } Exemplo – Cubo (Programa cube.c) int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); Exercício (1)Modifique o programa cube.c de forma que (a) Projete o cubo ortogonalmente. (b) Projete o cubo em perspectiva porém com a função gluPerspective(). glViewPort glViewPort (x,y,width, height) Define um retângulo de pixels na janela no qual a imagem final será mapeada. (x,y) : o canto inferior esquerda da viewport e (width,height) largura e altura do retângulo da viewport Por default os valores iniciais são (0,0,w,h) onde w, h são os tamanhos pré-definidos da janela. glViewPort A razão da viewport deve ser igual à razão do volume de visualização. Se as duas razões forem diferentes, a imagem projetada será distorcida ao ser mapeada na viewport. Exercício O programa planet.c usa glRotate*() para rotacionar um planeta ao redor do sol e para rotacionar o planeta ao redor do seu próprio eixo. Modifique o programa para que acrescente mais dois planetas com seus respectivos satélites. Como se trata de objetos hierárquicos use glPushMatrix e glPopMatrix (vide Exercício Seguindo a orientação dada nos slides de transformações geométricas, faça um programa que desenhe um carro com cinco parafusos em cada uma das suas quatro rodas.