Projeções e Transformações em 3D Computação Gráfica DCC065 Prof. Rodrigo Luis de Souza da Silva, D.Sc.
Sumário O que são projeções Conversão 3D-2D Tipos de Projeção Projeções Paralelas Projeções Isométricas Projeções Perspectivas Transformações em 3D Como transformações funcionam em 3D? Coordenadas homogêneas 3D e transformações baseadas em matrizes Câmera Virtual Projeções no OpenGL 2
Sistema de coordenadas 3D Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Lembre-se do que significa trabalharmos em um sistema de coordenadas 3D y y P z x z x Sistema baseado na regra da mão direita 3
O que são projeções? Nossas cenas 3D são integralmente especificadas em coordenadas 3D de mundo Para representarmos essas cenas precisamos gerar uma imagem 2D onde estes objetos serão projetados Plano de Projeção Objetos no mundo Observador Mas como esses objetos podem ser projetados? 4
Conversão 3D 2D A projeção é apenas uma das partes do processo de convertermos objetos em coordenada de mundo para imagens em coordenadas de tela Primitivas 3D em coordenadas de mundo Recorte contra volume de visualização Projeção no plano de projeção Conversão em coordenadas 2D Coordenadas 2D do dispositivo de saída 5
Tipos de Projeção Há duas classes de projeção: Paralela: Tipicamente usada em desenhos na engenharia e arquitetura Perspectiva: Aparência realista, usada em Computação Gráfica Projeção Paralela Projeção Perspectiva 6
Tipos de Projeção Dentro dessas duas classes há várias subclasses. 7
Projeções paralelas Alguns exemplos de projeção paralela Projeções ortogonais Projeção Isométrica 8
Projeções ortogonais Vários softwares profissionais de modelagem usam projeções ortogonais geralmente associadas a uma viewport em perspectiva 3D Studio Max 9
Projeções Isométricas Este tipo de projeção foi ( e ainda é ) bastante usada em jogos de computador Q*Bert Sim City Virtual Magic Kingdom 10
Projeções Perspectivas Projeções perspectivas são muito mais realistas que projeções paralelas 11
Projeções Perspectivas Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Há vários tipos de projeções perspectivas Os dois tipos mais comuns são projeções perspectivas com um ou dois pontos de fuga Ponto de fuga Ponto de fuga no eixo z Ponto de fuga no eixo x Um ponto de fuga Dois pontos de fuga 12
Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Projeções Perspectivas Lembrando do objetivo principal de trabalharmos com projeção perspectiva 13
Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Estabelecendo uma Projeção Perspectiva A projeção perspectiva pode ser estabelecida através da especificação da posição e tamanho do plano de visão e a posição do ponto de referência Mas como fazer isso? 14
Estabelecendo uma Projeção Perspectiva Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Estabelecer o ângulo do campo de visão pode ser mais intuitivo para especificar uma projeção perspectiva Esta operação é análoga a especificar a lente de uma câmera Field of view 15
Estabelecendo uma Projeção Perspectiva Aumentar o ângulo do campo de visão aumenta também a altura do plano de projeção. 16
Estabelecendo uma Projeção Perspectiva A mudança de ângulo pode modificar consideravelmente a forma como os objetos serão apresentados 17
Estabelecendo uma Projeção Perspectiva Usar apenas o ângulo de visão para especificar uma projeção perspectiva é insuficiente Adicionaremos a essa especificação a razão de aspecto, que nos dá a relação entre a largura e a altura do plano de corte frontal 18
Projeções - Resumo Projeção Perspectiva Vantagem Aparência realista da projeção. Desvantagem Não preserva distâncias. 19
Projeções - Resumo Projeção Ortogonal Vantagem A projeção pode preservar ângulos e distâncias. Essa característica só se mostra válida para as partes do objeto (faces) paralelas ao plano de projeção. Desvantagem As projeções dos objetos não sofrem alterações quando se movem segundo a direção de observação. Ou seja, dois objetos de mesma dimensão, porém a distâncias diferentes do plano de projeção (segundo a direção de projeção) terão projeções idênticas. 20
Transformações geométricas em 3D Vimos em aulas anteriores como computar as transformações geométricas em 2D As transformações em 3D seguem o mesmo princípio como veremos a seguir 21
Translações em 3D Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Para transladar um ponto em três dimensões por dx, dy e dz, simplesmente calcule a nova posição da seguinte forma: x = x + dx y = y + dy z = z + dz (x, y, z) (x, y, z ) Posição original Posição transladada 22
Escala em 3D Escala em três dimensões também é trivial, bastando multiplicar cada ponto pelos fatores sx, sy e sz da seguinte forma: x = sx*x (x, y, z) Posição original y = sy*y z = sz*z (x, y, z ) Posição Scaled Position transladada 23
Rotações em 3D Quando realizamos rotação em duas dimensões, temos a opção de rotacionar somente em relação ao eixo z Em três dimensões nós temos três opções Rotação em x pitch Rotação em y yaw Rotação em z - roll 24
Rotações em 3D Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) As equações para as rotações em 3D são as seguintes: x = x cosθ - y sinθ y = x sinθ + y cosθ z = z x = x y = y cosθ - z sinθ z = y sinθ + z cosθ x = z sinθ + x cosθ y = y z = z cosθ - x sinθ 25
Coordenadas Homogêneas em 3D De forma análoga ao que fizemos em 2D, nós podemos usar coordenadas homogêneas para realizar as transformações geométricas y em 3D Todas as transformações y podem ser representadas por matrizes P z P(x, y, z) = x z x 26
Matrizes de transformação em 3D Translação Escala
Matrizes de transformação em 3D Rotação em relação ao eixo X Rotação em relação ao eixo Y Rotação em relação ao eixo Z
Visualiazação em 3D Imagens de Hearn & Baker, Computer Graphics with OpenGL (2004) Muitos sistemas 3D trabalham com a ideia de uma câmera virtual 29
Imagens de "OpenGL Programming Guide Seventh Edition" (2009) Analogia Com a câmera real No computador 30
Câmera Virtual O OpenGL fornece recursos para facilitar as transformações de visualização através da definição de uma câmera virtual Essa câmera é definida no mundo através do comando glulookat Este comando especifica a posição da câmera (olho) para onde ela está apontada (foco) e um vetor de orientação (up) que especifica a rotação da câmera em relação ao eixo formado entre o olho e o foco. 31
Câmera Virtual (upx, upy, upz) (olhox, olhoy, olhoz) (focox, focoy, focoz) glulookat(olhox, olhoy, olhoz, focox, focoy, focoz, upx, upy, upz, ) 32
Projeções em OpenGL Vale lembrar que todos os comandos de projeção devem ser aplicados às matrizes corretas. Portanto, antes de utilizá-los, faça uso dos seguintes comandos: glmatrixmode(gl_projection); glloadidentity(); Desta forma, os comandos afetarão apenas a matriz de projeção. 33
Projeções em OpenGL O OpenGL nos fornece comandos para especificar projeções perspectivas e ortogonais. Os comandos disponíveis são os seguintes: glortho glfrustum gluperspective 34
Imagens de "OpenGL Programming Guide Seventh Edition" (2009) Projeção ortogonal em OpenGL void glortho(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); 35
Imagens de "OpenGL Programming Guide Seventh Edition" (2009) Projeção perspectiva em OpenGL void glfrustum(gldouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); 36
Imagens de "OpenGL Programming Guide Seventh Edition" (2009) Projeção perspectiva em OpenGL void gluperspective(gldouble fovy, GLdouble aspect, GLdouble near, GLdouble far); 37
Saiba mais! Computer Graphics, C Version Capítulo 9, 11 e 12 Contém um explicação sucinta sobres os modos de projeção no capítulo 9 e uma descrição mais completa no capítulo 12 (seção 12-3). O capítulo 11 trata das transformações 3D numa abordagem mais teórica, incluindo representação de rotações por quaternions e outras transformações geométricas. 38
Saiba mais! Computação Gráfica - Teoria e Prática. Capítulo 2 e 3 Páginas 52 a 59 No capítulo 2 há um breve texto explicando o funcionamento dos tipos de projeção vistos nesta aula. 39
Saiba mais! OpenGL Programming Guide Seventh Edition Capítulo 3 Detalhamento das funções que gerenciam as projeções em OpenGL Na página 148 deste livro há detalhes a respeito da utilização do comando glulookat. As transformações em 3D também são exploradas neste capítulo. 40
Prática Execute o projeto Projection do tutorial do Nate Robins e analise o comportamento dos comandos gluperspective, glortho e glfrustum. 41
Prática - Projeções Baixe o código 10_projection.cpp. Neste código, com o botão esquerdo do mouse você moverá a câmera em torno dos objetos. Com o botão direito do mouse, você alternará entre a projeção perspectiva e a projeção ortogonal. 42
Prática Rotação da câmera Baixe o código camerarotation.cpp. Este exemplo demonstra como fazer a rotação da câmera ao redor de um conjunto de objetos estáticos. As operações de pitch e yaw são computadas e realizadas diretamente sobre o comando glulookat 43
Exercícios 1 Baixe o código 09_3D_View.cpp O exercício consiste na criação de um grid 2D 5 x 5 e de um cubo de lado 1 que será movimentado sobre esse grid através de translações. Crie o grid interativamente (utilize estruturas de repetição). Utilize as setas direcionais do teclado para mover o cubo sobre as unidades do grid. O programa a ser executado ficará parecido com a ilustração abaixo: 44
Exercícios 2 Altere o exercício anterior para que a movimentação do objeto seja suave ao passar de uma unidade para outra do grid. Dica, utilize a função idle. ( exemplo de uso no código 05_triangle_anim.cpp) 45