Programação Gráfica 3D
Prof. Rogério Celestino dos Santos
Visualização 3D
Quando se trabalha com três dimensões, o SRU
t t ê i
passa a ser composto por três eixos
X,Y,Z
ortogonais entre si pela origem (0 0 0 0 0 0) ortogonais entre si pela origem (0.0,0.0,0.0)
Uma coordenada agora é formada pelos alores
Uma coordenada agora é formada pelos valores x,y,z
P id tifi f il t i é
Para identificar facilmente como o eixo z é
posicionado em relação à x e y, normalmente se usa a regra da “mão direita” ou regra da “mão esquerda” a regra da mão direita ou regra da mão esquerda
No caso de OpenGL o padrão é a “mão direita”
Visualização 3D
Indicador aponta para o positivo de y
Polegar aponta para o positivo de x
Visualização 3D
O processo de visualização 3D é mais complexo do
2D i d ú i d
que o 2D, pois compreende um número maior de etapas.
Está complexidade existe porque quase todos os
dispositivos de saída (monitores e impressoras) são dispositivos de saída (monitores e impressoras) são somente 2D.
Assim, é preciso definir como a sena 3D será
Visualização 3D
A primeira etapa do processo de visualização 3D é a
d fi i ã d 3D
definição da cena 3D.
N t t t d bj t f ã t d d
Nesta etapa todos objetos que farão parte do mundo
3D é incluído e posicionado na SRU por meio de escala rotação e translação
escala, rotação e translação.
O próximo passo consiste na especificação de um
O próximo passo consiste na especificação de um
observador virtual.
Esse observador define de que local deseja-se que a
cena 3D seja exibida. cena 3D seja exibida.
Câmera Sintética
A especificação do observador inclui a sua posição e a
orientação, ou seja, onde o observador está e para onde ele está ç j p olhando
A analogia câmera normal em nosso ni erso
A analogia: câmera normal em nosso universo
Podemos mover a câmera para qualquer posição e orientaçãoPodemos mover a câmera para qualquer posição e orientação no espaço
A câmera pode tirar fotos simples ou tornar-se uma filmadora, que mostra nosso universo de diferentes orientações
Nossa câmera sintética é um programa de computador que
produz, a partir de uma descrição dos objetos, a imagem na tela do computador
Câmera Sintética
A localização e orientação da câmara processa-se no
d bj t li
espaço dos objetos e, para o realizar, empregam-se as coordenadas e métrica do mundo dos objetos.
Em termos de OpenGL diz-se que tal se realiza em
modo de vista de modelo (GL MODELVIEW) e que modo de vista de modelo (GL_MODELVIEW) e que, portanto, esta localização é afectada pela matriz de
transformação corrente neste modo.ç
Câmera Sintética
Para localizar a câmara é necessário
especificar a sua posição (através do respectivo especificar a sua posição (através do respectivo
vetor) e a sua orientação.
Orientar uma câmara significa dirigi-la numa dada direção (view vector) por meio do vector (at vector) especificando o ponto para o qual a (at vector) especificando o ponto para o qual a câmara é apontada e definir também a direção para cima da própria câmara (up vector).
Câmera Sintética
void gluLookAt( GLdouble eyex, GLdouble eyey, GLdouble eyez,
GLdouble centerx, GLdouble centery, GLdouble centerz, GLdouble upx, GLdouble upy, GLdouble upz );
Os parâmetros:
eyex, eyey e eyez são usados para definir as coordenadas x, y e z,
respectivamente, da posição da câmera (ou observador);
centerx, centery e centerz são usados para definir as coordenadas x, y e z,
respectivamente, da posição do alvo, isto é para onde o observador está olhando (normalmente o centro da cena);
(normalmente, o centro da cena);
upx, upy e upz são as coordenadas x, y e z, que estabelecem o vetor up (indica o
"lado de cima" de uma cena 3D)
O comando gluLookAt() deve ser chamado antes das operações de transformações dos
O comando gluLookAt() deve ser chamado antes das operações de transformações dos
Exercícios
1. Agora altere o parâmetro upy para -1 e veja o que acontece com o cubo
com o cubo.
2. Depois, atribua o valor 1 para upy novamente.
3. Em seguida, altere o parâmetro eyez para 100, compile e
3. Em seguida, altere o parâmetro eyez para 100, compile e visualize o resultado.
4. Depois altere este mesmo parâmetro para 300, compile e
i li lt d t
visualize o resultado novamente.
5. Na seqüência, passe o valor 200 para este parâmetro.
6 Altere o parâmetro centerx para 20 compile e execute o
6. Altere o parâmetro centerx para 20, compile e execute o programa.
7. Agora altere este mesmo parâmetro para -20, compile e execute o programa.
Projeção
Quando se está trabalhando com a representação de objetos no espaço 3D existe uma etapa obrigatória: objetos no espaço 3D existe uma etapa obrigatória: mapear suas representações 3D para imagens 2D.
Está operação de obter representações 2D de objetos 3D é chamada projeção.
Objetos 3D, em geral são representados por uma coleção d t ( é ti )
de pontos (vértices)
A projeção desses objetos é definida por raios de projeção
A projeção desses objetos é definida por raios de projeção (segmentos de retas) chamados de projetantes, que passa através de cada vértice do objeto e interseccionam um
Projeção
As projeções são usualmente divididas em dois tipos
i i i
principais:
Projeção Paralela Ortográfica:
As projetantes são paralelas entre si passam pelos
As projetantes são paralelas entre si, passam pelos pontos que definem os objetos e interseccionam o plano com o ânulo de 90°
Projeção Paralela Ortográfica
Neste tipo de projeção simplesmente descartamos uma
d di õ
das dimensões.
Por exemplo, um ponto (x,y,z) será mapeado para simplesmente (x y)
simplesmente (x,y).
Este tipo de projeção é bastante utilizada em projetos arquitetônicos e de peças mecânicas, pois os desenhos q p ç , p 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 visualizado do mesmo tamanho, diferentemente da projeção perspectiva.
Projeção Paralela Ortográfica
Em OpenGL a chamada que especifica uma projeção ortográfica no espaço 2D já conhecida é a:
no espaço 2D já conhecida é a:
gluOrtho2D( double left, double right, double bottom, double top ); No espaço 3D a chamada é:p ç
glOrtho(double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);
Esta chamada define no espaço 3D um paralelepípedo
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
glMatrixMode( GL_PROJECTION); glPushMatrix(); glLoadIdentity(); glOrtho( -5.0, 5.0, 0.0, 7.5, -100.0, glOrtho( 5.0, 5.0, 0.0, 7.5, 100.0, 100.0); glPopMatrix();
Projeção Perspectiva
As projetantes emanam de um único ponto que está
di tâ i fi it d l j ã
uma distância finita do plano e projeção e passam pelos pontos que definem os objetos
Projeção Perspectiva
Este é o tipo de projeção que o nosso cérebro
" l l " ó
"calcula" para nós
N t ti d j ã f ô d
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 longes do observador irão aparecer menores na imagem.
Há várias maneiras de especificarmos uma projeçãoHá várias maneiras de especificarmos uma projeção perspectiva em OpenGL. A principal delas é:
Projeção Perspectiva
gluPerspectiva( double fovy, double aspect, double near, double far);
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
glMatrixMode( GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluPerspective( 10.0, 1.33, 5.0, 10.0); glPopMatrix(); glPopMatrix();
Exercícios
1. Altere sua aplicação para utilizar projeção perspectiva gluPerspective(60 fAspect 0 5 500);
gluPerspective(60,fAspect,0.5,500);
2. Agora inclua a função abaixo no código fonte para que através destas alterações é possível alterar a posição do observador mantendo sempre o mesmo alvo
o mesmo alvo.
// Callback para gerenciar eventos do teclado para teclas especiais (F1, PgDn, entre outras) void SpecialKeys(int key, int x, int y) {
switch (key) {
case GLUT KEY LEFT : obsX -=10; break;
No início do programa, acrescente as variáveis globais que aparecem abaixo.
GLdouble obsX=0, obsY=0, obsZ=200;
Troque a linha de código gluLookAt(40 60 100 0 0 0 0 1 0); case GLUT_KEY_LEFT : obsX -=10; break;
case GLUT_KEY_RIGHT: obsX +=10; break; case GLUT_KEY_UP : obsY +=10;break; case GLUT_KEY_DOWN : obsY -=10;break; case GLUT_KEY_HOME : obsZ +=10;break; case GLUT_KEY_END : obsZ -=10;break; }
glLoadIdentity();
Troque a linha de código gluLookAt(40,60,100, 0,0,0, 0,1,0); para gluLookAt(obsX,obsY,obsZ, 0,0,0, 0,1,0);.
Na função main inclua a seguinte chamada de função
glutSpecialFunc(SpecialKeys); antes da chamada para a
função Inicializa();
3. Coloque 2 no lugar de fAspect, compile e execute para ver o que acontece.
glLoadIdentity();
gluLookAt(obsX,obsY,obsZ, 0,0,0, 0,1,0); glutPostRedisplay();
}
4. Troque o valor 2 por 0.5, compile e execute novamente.
5. Coloque novamente a variável fAspect no segundo parâmetro da gluPerspective.
Com estes testes, foi possível verificar as conseqüências de alterar a razão de aspecto.
Exercício (5 ptos) 10/10
1. Altere a implementação para que seja desenhada uma pirâmide.
1 Utilize os comando de desenho de primitivas (GL TRIANGLES)
1. Utilize os comando de desenho de primitivas (GL_TRIANGLES)
2. Para desenhar somente as linhas utilize os comandos
1. glPolygonMode(GL_FRONT, GL_LINE); //Parte da frente em formato de linhas
2. glPolygonMode(GL_BACK, GL_LINE); //Parte de trás em formato de linhas
3 Necessário 4 triângulos
3. Necessário 4 triângulos.
4. Utilização do comando glVertex3f ou glVertex3d. 3 Dimensões