Computação Gráfica – Transformações Projetivas Profa. Mercedes Gonzales Márquez
Computação Gráfica – Transformações Projetivas
Profa. Mercedes Gonzales Márquez
Tópicos
Conceito de Projeção Projeção Paralela (Ortográfica) e Projeção
Perspectiva Projeções em OpenGL
O modelo de visualização em OpenGL, é similar a uma câmera fotográfica!– Tripé: visualização– Modelo: modelagem– Lente: projeção– Papel: viewport
A Câmera OpenGL
Analogia da Câmera (OpenGL)
O processo de transformação para produzir a cena desejada para visualização é análogo a tirar uma foto com uma câmera. Os passos são:– 1. Orientar a câmera em direção da cena (transformação
de visualização) – 2. Posicionar devidamente o(s) objeto(s), a serem
fotografados, no cenário (transformações geométricas estudadas em aula, também chamadas transformações de modelagem).
– 3. Escolher o lente da câmera ou ajustar o zoom (transformação de projeção).
– 4. Determinar o tamanho desejado para a fotografia final (transformação de viewport).
Transformações Projetivas
– A projeção permite a visualização bidimensional de objetos tridimensionais.
– Para gerar a imagem de um objeto 3D a partir de um ponto de vista dado, é necessário realizar a sua projeção, ou seja, converter as suas coordenadas 3D em coordenadas 2D.
Elementos básicos da Projeção
Plano de Projeção; Projetante, ou raio projetante; Centro de projeção.
P
P´ Plano de Projeção
Raio de Projeção
xz
y
Centro de Projeção
Elementos básicos da Projeção
Plano de Projeção: A superfície onde será projetado o objeto, ou seja, onde ele será representado em 2D;
Projetante, ou raio projetante: Retas que passam pelos pontos do objeto e pelo centro de projeção.
Centro de projeção: Ponto fixo de onde os raios projetantes partem.
Tipos de Projeção
Existem dois tipos de projeção: (a)Projeção Paralela, Ortogonal ou ortográfica(b)Projeção perspectiva
Tipos de Projeção
(a) Projeção perspectiva : É a mais realista, pois é análogo ao processo de formação de imagens em nossos olhos ou numa câmera fotográfica. Considera a profundidade como elemento de seu cálculo e apresenta um resultado mais familiar ao observador humano.
Tipos de Projeção
(b)Projeção Paralela ou ortográfica: É a projeção ortogonal de um ponto no plano de projeção. Pode ser vista como uma projeção perspectiva onde o centro de projeção está no infinito.
Projeção Paralela
As linhas que unem os pontos A e B às suas projeções A’ e B’ são paralelas, isto faz com que o segmento projetado tenha o mesmo tamanho para qualquer distância entre o plano de projeção e o objeto.
Tipos de Projeção
Matriz de Projeção Paralela
Se quisermos a projeção ortográfica em relação ao plano xy (ou z=0), a matriz em coordenadas homogêneas é
11000
0000
0010
0001
1
'
'
'
z
y
x
z
y
x
Se no lugar do plano z=0 for escolhido outro plano qualquer z=Tz paralelo a ele, a matriz será
11000
000
0010
0001
1
'
'
'
z
y
x
Tzz
y
x
Modelo perspectivo ideal
P
p
O
P
O o P1p
p1
y x
z
yx
z
Plano imagem
Plano imagem f
f
oP1p1
Matriz de Projeção Perspectiva
11/100
0000
0010
0001
1
'
'
'
z
y
x
f
z
y
x
Por similaridade de triângulos temos
Centro de projeção
Plano de projeção
(x,y,z)
(x´,y´)
f
fz
y
f
y
fz
x
f
x
'
'
x
y
Projeções em OpenGL
A transformação de projeção em OpenGL descreve como especificar a forma e orientação do volume de visualização. O volume de visualização determina:como a cena será projetada na tela (com projeção paralela ou perspectiva) e
quais objetos ou partes de objetos serão eliminados da cena.
Projeção paralela ortográfica
Projeção em perspectiva
Centro de projeção fixo: eye (posição da câmera)
Duas possibilidades:– Determina um tronco de pirâmide:
glFrustrum– Determina o ângulo de visão
gluPerspective
Definição do volume de visualização
glFrustrum(left, right, bottom, top, near, far);nao precisa ser simétrico
gluPerspective(fovy, aspect ratio, near, far);simétrico
Esses comandos definem a matriz de projeção (PROJECTION)
glFrustrum
glFrustrum
gluPerspective
gluPerspective
Matrizes de transformação
glMatrixMode(GL_PROJECTION);– Define tipo e parâmetros da projeção
Exemplo – Cubo (Programa cube.c)
Um cubo é escalado pela transformação de modelagem glScalef (1.0, 2.0, 1.0). A transformação de visualização gluLookAt(), posiciona e orienta a câmera em direção do cubo. As transformações de projeção e viewport são também especificadas.
Exemplo – Cubo (Programa cube.c)
Example 3-1 : Transformed Cube: cube.c
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
void init(void){
glClearColor (0.0, 0.0, 0.0, 0.0);
glShadeModel (GL_FLAT);
}
Exemplo – Cubo (Programa cube.c)
void display(void){
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glLoadIdentity (); /* clear the matrix */
/* viewing transformation */
gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glScalef (1.0, 2.0, 1.0); /* modeling transformation */
glutWireCube (1.0);
glFlush ();
}
Exemplo – Cubo (Programa cube.c)
void reshape (int w, int h){
glViewport (0, 0, (GLsizei) w, (GLsizei) h);
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glFrustum (-1.0, 1.0, -1.0, 1.0, 1.5, 20.0);
glMatrixMode (GL_MODELVIEW);
}
Exemplo – Cubo (Programa cube.c)
int main(int argc, char** argv){
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
Exercício
(1)Modifique o programa cube.c de forma que(a) Projete o cubo ortogonalmente. (b) Projete o cubo em perspectiva porém com a função gluPerspective().
glViewPort
glViewPort (x,y,width, height)Define um retângulo de pixels na janela no qual a imagem final será mapeada.
(x,y) : o canto inferior esquerda da viewport e (width,height) largura e altura do retângulo da viewportPor default os valores iniciais são (0,0,w,h) ondew, h são os tamanhos pré-definidos da janela.
glViewPort
A razão da viewport deve ser igual à razão do volume de visualização. Se as duas razões forem diferentes, a imagem projetada será distorcida ao ser mapeada na viewport.
Exercício
O programa planet.c usa glRotate*() para rotacionar um planeta ao redor do sol e para rotacionar o planeta ao redor do seu próprio eixo.
Modifique o programa para que acrescente mais dois planetas com seus respectivos satélites. Como se trata de objetos hierárquicos use glPushMatrix e glPopMatrix (vide aula).
Exercício
Seguindo a orientação dada nos slides de transformações geométricas, faça um programa que desenhe um carro com cinco parafusos em cada uma das suas quatro rodas.