Visualização Tridimensional Quando se trabalha em três dimensões, o SRU (Sistema de Referência do Universo) passa a ser composto por três eixos ortogonais entre si (x,y e z) e pela origem (0.0,0.0,0.0). Uma coordenada é agora formada pelos valores de x, y e z, que correspondem às posições ao longo dos respectivos eixos O processo de visualização 3D é mais complexo do que o 2D, pois compreende um numero maior de etapas. Esta complexidade existe porque quase todos os dispositivos de saída, tais como monitores e impressoras, são somente 2D. Assim é preciso definir como a cena 3D e projetada em uma imagem 2D. Visualização 3D: câmera sintética * Corresponde ao pipeline clássico de visualização de objetos 3D; * Câmera é localizada e orientada no SRU; * Coordenadas dos objetos são transformadas para o SRC; * Coordenadas são projetadas no plano de projeção; * Coordenadas são mapeadas para a viewport. Câmera Sintética (Observador) A primeira etapa do processo de visualização 3D é a definição da cena 3D. Nesta etapa cada um dos objetos que farão parte do mundo 3D é incluído e posicionado no SRU (escala, translação e rotação). O próximo passo consiste na especificação do observador virtual, um componente fundamental do processo de visualização 3D. Este observador define de que local deseja-se que a cena 3D seja exibida, por exemplo, de cima, do lado direito ou do esquerdo. Portanto, a especificação do observador inclui a sua posição e orientação, ou seja, onde o observador está e para onde ele está olhando dentro do universo. A necessidade da existência do observador deve-se ao fato de que um mesmo conjunto de objetos 3D, visto de diferentes lugares, tem diferentes coordenadas para cada posição. Câmera Fotográfica Como a imagem gerada a partir da posição e orientação do observador é estática, faz-se analogia com uma foto. Pode-se dizer que se obtém uma fotografia quando a câmera está em uma determinada posição direcionada para o objeto. A posição da câmera é dada por um ponto (x,y,z) e sua orientação é dada por um ponto alvo (x,y,z) e um vetor chamado up. Projeções Paralela Ortográfica – As projetantes são paralelas entre si, passam pelos pontos que definem os objetos e interseccionam o plano com um ângulo de 90 graus. Perspectiva – As projetantes emanam de um único ponto que está a uma distância finita do plano de projeção e passam pelos pontos que definem os objetos. Transformações de Visualização Duas interpretações: Up Levam a câmera até a cena que se quer visualizar Levam os objetos da cena até uma câmera estacionária gluLookAt(Obsx,Obsy,O bsz,alvox,alvoy,alvoz ,upx, upy, upz); Obs = ponto onde a câmera será posicionada Alvo = ponto para onde a câmera será apontada up = vetor que dá a direção “para cima” da câmera. y alvo Obs x z Funções OpenGL As funções descritas abaixo são utilizadas para configurar a câmera sintética e a projeção perspectiva quando se está trabalhando com OpenGL gluLookAt; define a transformação de visualização. Seu protótipo é: void gluLookAt( GLdouble obsx, GLdouble obsy, GLdouble obsz, GLdouble alvox, GLdouble alvoy, GLdouble alvoz, GLdouble upx, GLdouble upy, GLdouble upz );. Descrição dos parâmetros: obsx, obsy e obsz são usados para definir as coordenadas x, y e z, respectivamente, da posição da câmera (ou observador); alvox, alvoy e alvoz são usados para definir as coordenadas x, y e z, respectivamente, da posição do alvo, isto é, para onde o observador está olhando; upx, upy e upz são as coordenadas x, y e z, que estabelecem o vetor up. gluPerspective; Esta função estabelece os parâmetros da Projeção Perspectiva, atualizando a matriz de projeção perspectiva. 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 deve 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 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. Exemplo 1 O código fonte “Exemplo3D.cpp desenha um cubo com projeção perspectiva. O cubo é um dos objetos predefinidos da biblioteca GLUT. As funções gluPerspective e gluLookAt são utilizadas como segue: gluPerspective(60, fAspect, 0.5, 500); gluLookAt(40, 60, 100, 0, 0, 0, 0, 1, 0); Projeção Ortográfica Para trabalhar com projeção ortográfica, basta configurá-la através da chamada para a seguinte função: Void glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) Os valores left e right especificam os limites min e max no eixo X; analogamente, bottom e top especificam os limites min e max no eixo Y, enquanto near e far especificam os limites min e max no eixo Z, geralmente com os valores negativos para o lado oposto da posição do observador. Exercício 1 Aplicar no codigo fonte Exemplo3D.cpp uma projeção ortográfica utilizando a função glOrtho: glOrtho(-65.0, 65.0, -65.0, 65.0, -400.0, 400.0);