E N D
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).
Para localizar a câmara é necessário especificar a sua posiçã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.
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: • 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,Obsz,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. Up 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.
GLvoid glFrustum ( GLdouble esquerda, GLdouble direita, GLdouble baixo, GLdouble cima, GLdouble proximo, GLdouble afastado)
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);
Defina a variável global: GLfloat fAspect; Em seguida crie uma rotina com o nome EspecificaParametrosVisualizacao, como segue:
// Função usada para especificar o volume de visualização void EspecificaParametrosVisualizacao(void) { // Especifica sistema de coordenadas de projeção glMatrixMode(GL_PROJECTION); // Inicializa sistema de coordenadas de projeção glLoadIdentity(); //Especifica a projeção perspectiva(angulo,aspecto,zMin,zMax) gluPerspective(60,fAspect,0.5,500);
// Especifica sistema de coordenadas do modelo glMatrixMode(GL_MODELVIEW); // Inicializa sistema de coordenadas do modelo glLoadIdentity(); // Especifica posição do observador e do alvo gluLookAt(40,60,100, 0,0,0, 0,1,0); }
Na função desenha, acrescente o cubo como definido abaixo, antes de glflush. // Função da GLUT para fazer o desenho de um cubo // com a cor corrente glutWireCube(50);
Em seguida em: void AlteraTamanhoJanela(GLsizei w, GLsizei h) Acrescente a variável global declarada anteriormente como: // Calcula a correção de aspecto fAspect = (GLfloat)w/(GLfloat)h; logo depois de glViewport. E por último acrescente a rotina criada anteriormente também: EspecificaParametrosVisualizacao();
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);