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
A Câmera
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
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.
y
P
Raio de Projeção
P´
Plano de Projeção
x
z
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  x' 1 0
plano xy (ou z=0), a
 y ' 0 1
matriz em coordenadas    
 z '  0 0
homogêneas é
  
1

0
0
0
0
0
0
0  x 
0  y 
0  z 
 
1  1 
Se no lugar do plano z=0 for escolhido outro plano qualquer
z=Tz paralelo a ele, a matriz será
 x' 1 0 0 0   x 
 y ' 0 1 0 0   y 
 
 
 z '  0 0 0 Tz   z 
  
 
 1  0 0 0 1   1 
Modelo perspectivo ideal
p
y
x
o
Plano imagem
p1
f
P1
z
O
P
y
x
p1
o
Plano imagem O
f
p
P1
z
P
Matriz de Projeção Perspectiva
y
Plano de projeção
x
(x´,y´)

(x,y,z)
f
Centro de projeção
Por similaridade de triângulos temos
 x' 1
 y ' 0
 
 z '  0
  
 1  0
0
0
1
0
0
0
0 1/ f
0  x 
0  y 
0  z 
 
1  1 
x'
x

f
z f
y'
y

f
z f
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();
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 viewport
Por default os valores iniciais são (0,0,w,h) onde
w, 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
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.
Download

CG-transf-proj