Processamento Gráfico - UFPE - Prof. Marcelo Walter

Noções sobre Projeções e Câmera Sintética em OpenGL

Esta nota objetiva explicar como utilizar o mecanismo de projeções em OpenGL. Matematicamente uma projeção é uma redução de dimensionalidade, por exemplo, de 4 dimensões (se você consegue imaginar isto) para 3 ou 2 dimensões. No nosso contexto específico de computação gráfica e câmera sintética, nós precisamos visualizar uma cena com objetos definidos no espaço euclidiano tridimensional, numa tela de computador, que é bidimensional. Em outras palavras precisamos "nos livrar" de uma dimensão. Note que o sistema visual humano é bidimensional (a retina é uma superfície) e portanto também efetuamos "naturalmente" uma projeção.


Existem dois tipos básicos de projeções possíveis em OpenGL: ortográfica e perspectiva. Veremos cada uma delas com maiores detalhes.


Projeção Ortográfica

Neste tipo de projeção simplesmente descartamos uma das dimensões. Por exemplo, um ponto (x,y,z) será mapeado para simplesmente (x,y). Este tipo de projeção é bastante utilizada em projetos arquitetônicos e de peças mecânicas, pois os desenhos assim obtidos podem ser utilizados para medirmos as dimensões dos objetos representados. Na projeção ortográfica, não importa a distância entre o objeto e o observador, o objeto vai sempre ser visualizado do mesmo tamanho, diferentemente da projeção perspectiva, como veremos abaixo.


Em OpenGL a chamada que especifica uma projeção ortográfica no espaço 2D é:


gluOrtho2D( double left, double right, double bottom, double top );


No espaço 3D a chamada é:


glOrtho(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);


Esta chamada define no espaço 3D um paralelepípedo. Somente serão visualizados os objetos que estiverem dentro deste paralelepípedo, denominado o Volume de Visualização (veja ilustração abaixo).


Projeção Perspectiva

Este é o tipo de projeção que o nosso cérebro "calcula" para nós. Neste tipo de projeção ocorre o fenômeno de foreshortening em Inglês, ou seja, objetos mais longes do observador irão aparecer menores na imagem. Olhe para a rua agora e confirme que isto é verdade. Há várias maneiras de especificarmos uma projeção perspectiva em OpenGL. A principal delas é:


gluPerspectiva( double fovy, double aspect, double near, double far);


O que especificam os parâmetros? Veja no desenho abaixo.



    * fovy especifica o ângulo do field-of-view, ou seja, do campo de visão da câmera sintética

    * aspect especifica a razão entre a largura w e a altura h da janela

    * near especifica a distância do plano de recorte próximo à câmera

    * far especifica a distância do plano de recorte longe da câmera


As outras possibilidades para especificar uma projeção perspectiva são:


    * glFrustum(double left, double right, double bottom, double top, double near, double far);

    * gluLookAt(double eyex, double eyey, double eyez,

                double centerx, double centery, double centerz,

                double upx, upy, upz );


Para maiores esclarecimentos sobre todas estas rotinas, você pode consultar as informações na página de recursos sobre OpenGL a seção referente a GLU (OpenGL Utility routines) e o livro "vermelho" de OpenGL.