Câmera Sintética Leandro Tonietto Computação Gráfica Desenvolvimento Jogos e Entretenimento Digital ltonietto@unisinos.br http://professor.unisinos.br/ltonietto/jed/pgr/camerasintetica.pdf 05-13 29-May-13 Leandro Tonietto
Sumário Introdução Câmera sintética Window-to-Viewport Exercício. 29-May-13 Leandro Tonietto!2
Introdução Para renderização de objetos reais 3D são necessárias duas etapas antes da rasterização: representação de objetos e projeção para 2D. Representação de objetos do mundo real. Objetos são descritos matematicamente, conforme o sistema de coordenadas do universo. Objetos estão presentes no espaço 3D Modelo de câmera sintética é baseado na idéia de capturar objetos do mundo real, assim como uma fotografia. Representação matemática é convertida para exibição em dispositivo gráfico 2D. Pipeline gráfico converte a representação dos objetos do mundo 3D para o mundo 2D. 29-May-13 Leandro Tonietto!3
Câmera Sintética Metáfora com fotografia. O processo de fotografar um objeto do mundo real é: Posicionamento da câmera: local e direção Arrumar os objetos da cena Qual objeto aparece aonde Qual é o ajuste de zoom: lentes Determinar o tamanho final da fotografia 29-May-13 Leandro Tonietto!4
Os objetos são capturados e representados no computador: Parte de um ponto de referência (local do observador ou localização da câmera ou ponto de visão) Dentro um plano de visão (área visível do mundo real). Chama-se de Window. As informações serão processadas a partir do sistema de referência da câmera (ponto de visão). A visualização é traçada a partir do ponto de visão, sobre o eixo Z até o plano de corte de fundo (em geral assume-se que o eixo Z é perpendicular ao plano de visão). Volume de visão é aquele formado por raios que partem do ponto de visão e passam pela janela do plano de visão (Window) até um limite. Near é o plano que define o início do volume e Far define o final (planos de corte). Objetos contidos neste volume serão os visualizados. Conversão de das informações do universo (Window) para o dispositivo gráfico: Assume-se uma porção lógica de janela (Viewport) do espaço disponível 2D. Faz-se a conversão do objeto do mundo real (Window) para o mundo 2D (Viewport) Figuras: 1 esquema de câmera sintética e 2- conversão window-to-viewport 29-May-13 Leandro Tonietto!5
Figura 1 Volume de visão 29-May-13 Leandro Tonietto!6
Representação de objetos do mundo 3D Transformação em coordenadas de câmara Corte conforme volume de visão Projeção do objeto sob o plano de visão Conversão para viewport Conversão para coordenadas do dispositivo físico 29-May-13 Leandro Tonietto!7
Transformação em coordenadas de câmera: A câmera possui as seguintes componentes: Ponto de visão p Direção (v) Direção para cima (w) ou apenas vetor cima Plano de visão com uma distância d da origem O ponto de referência passa a ser o ponto de visão ou de referência da câmera Requer uma transformação de um sistema para outro. Portanto, os objetos devem estar sendo movimentados para utilizarem a câmera como ponto de referência. Para isto basta transladar o objeto com a mesma distância da câmera para a origem. Neste caso, o mundo está descrito a partir da câmera. 29-May-13 Leandro Tonietto!8
A outra forma de fazer a visualização dos objetos é aplicar transformações sobre a câmera e deixar os objetos aonde estão. As matrizes de transformação são aplicadas então, sobre a câmera e não sobre os objetos. É mais eficiente para renderização com deslocamento de câmera (p. e. jogos em primeira ou terceira pessoa) A âncora não é a câmera, mas sim a origem (0,0,0). Desvantagem: Deve-se aplicar transformações na mão. gltranslate, glrotate e glscale são utilizados apenas para os objetos e não para a câmera. 29-May-13 Leandro Tonietto!9
O recorte de visualização 3D: Objetivo: não processar o que não está visível no frustum. Frustum culling: eliminação do processo de renderização de objetos que não estão dentro do volume de visualização ou estão encobertos por outros objetos. Algoritmos de colisão Clipping 3D: recortar partes visíveis de objetos que estão parcialmente dentro do volume de visualização. Algoritmo Cohen-Suterland 3D 29-May-13 Leandro Tonietto!10
Projeção 3D! 2D: Gerar uma visão 2D dos objetos a serem renderizados. Depois fica mais simples a conversão para sistema de coordenadas do dispositivo. Dois tipos de projeção possíveis: Ortogonal: Objetos do fundo são desenhados primeiro, ignorando a profundidade Perspectiva: Objetos são desenhados considerando-se a perspectiva, ou seja, quanto mais ao fundo, menores são os objetos. Objetos são escalados no tamanho correto em relação a distância da visão. Portanto, quanto maior o z do objeto menor será o tamanho na hora da projeção. 29-May-13 Leandro Tonietto!11
Window-to-viewport Retângulos para representação visual dos objetos. Window no sistema de coordenadas universo Viewport no sistema de coordenadas do dispositivo gráfico Fórmula:!!! Onde: x e y coordenada do ponto no universo (window): V a = x inicial da viewport V b = x final da viewport V c = y inicial da viewport W a = x inicial da window W c = y inicial da window V d = y final da viewport W b = x final da window W d = y final da window 29-May-13 Leandro Tonietto!12
Exercício: Considere uma window de (-10,10) e (-10,10) e uma viewport de (0,300) e (0,300). O objetivo deste exercício é plotar: a linha dos eixos, que passa pela origem a função: a + i (b - a)/n, 0 < i < n a e b os pontos inicial e final do cálculo na window i e n são solicitados ao usuário. E n é um potência de 10. Por exemplo: 1, 10, 100, 1000,... Execute a iteração n vezes. Teste com 10 e com 100. O que acontece com o desenho da função? Como poderíamos resolver o problema? 29-May-13 Leandro Tonietto!13
Com OpenGL: Aqui slides do João 29-May-13 Leandro Tonietto!14
Movimentação em primeira pessoa: A câmera em primeira pessoa, faz o seu deslocamento junto ao personagem Como se fosse os olhos do personagem Normalmente, o personagem não visto, pois ele é a câmera! Na verdade se mostra alguma parte dele, como os braços ou objetos que possa estar carregando/ utilizando Como implementar? Basta que a câmera navegue pelo cenário com translação e rotação. 29-May-13 Leandro Tonietto!15
Movimentação em primeira pessoa: Câmera Personagem Objetos O jogador é a câmera. São usados a direção e a posição da câmera 29-May-13 Leandro Tonietto!16
Movimentação em primeira pessoa. Exemplo: Rotação direita Toda a vez que a câmera é rotacionada ou transladada, devese redefinir a sua posição (glulookat) e quando a proporção de tela muda devemos alterar o frustum (gluperspective) Translação para trás 29-May-13 Leandro Tonietto!17
Movimentação em primeira pessoa. Implementação: Câmera: Ponto de visão (eye) Direção Up Ângulo da direção y - - up direction 270 eye z x Neste exemplo, qual é o ângulo inicial? + + 29-May-13 Leandro Tonietto!18
Movimentação em primeira pessoa. Implementação: y - - Apenas adiciona (sentido horário) ou subtrai (sentido anti-horário) um ângulo alfa do ângulo atual da câmera. Não esquecer de calibrar a câmera e o ângulo de direção conforme a direção inicial estabelecida rotação Neste exemplo, qual seria o ângulo para rotação? Sendo a taxa de rotação é de 45... + z x + funções seno e cosseno são utilizadas para calcular o vetor de direção ddx = cos(a); ddz = sin(a); // eye em qualquer posição: dx = ex + ddx; dz = ez + ddz; 29-May-13 Leandro Tonietto!19
Movimentação em primeira pessoa. Implementação: + y - - z translação x + Devemos considerar que a translação deve ocorrer na mesma direção do vetor direção O que devemos considerar neste caso para realizar a translação? ddx = cos(a) ddz = sin(a) ex += ddx * v; ez += ddz * v; dx = ex + ddx; dz = ez + ddz; Note que este exemplo é para uma translação positiva. No caso de andar para trás deve-se subtrair o ex e o ez por ddx e ddz. Outro detalhe é o quanto se desloca o eye, se multiplicarmos ddx e ddz por um valor (v), que é o tamanho do passo, conseguimos um movimento mais suave. 29-May-13 Leandro Tonietto!20
Resumo de comandos para projeção: sempre utilizar modo de matriz GL_PROJECTION glmatrixmode(gl_projection); fazer definição do volume de visualização: Após mudar o modo de matriz limpar matriz base com glloadidentity() gluperspective(...); glviewport(...); deve ser definido uma vez na inicialização e redefinido a cada vez que o usuário altera a proporção da tela. Na verdade colocar a definição do frustum sempre numa função de reshape : glutreshapefunc(reshape); 29-May-13 Leandro Tonietto!21
Resumo de comandos para movimentação da câmera: sempre utilizar modo de matriz GL_MODELVIEW glmatrixmode(gl_modelview); fazer a redefinição da câmera (posição, direção e up): Após mudar o modo de matriz limpar matriz base com glloadidentity() considere que eye e direction devem ser atualizados antes do comando glulookat glulookat(ex, ey, ez,...); deve ser definido toda vez que o personagem deve movimentado pelo cenário. Normalmente, após eventos de teclado ou mouse: glutspecialfunc(specialkey); glutmousefunc(mouse); 29-May-13 Leandro Tonietto!22
Movimentação em terceira pessoa. Câmera Personagem Objetos O jogador é outro objeto e a câmera acompanha este objeto de referência. 29-May-13 Leandro Tonietto!23
Referências bibliográficas Agoston, Max K. Computer Graphics and Geometric Modeling: Implementation and Algorithms. Springer. 2005. 29-May-13 Leandro Tonietto!24