Projeções Clássicas
e
Matrizes de Projeção do OpenGL
Projeções Planas Cônicas
A
Ap
B
Bp
 realista
 não preserva escala
 não preserva ângulos
Projeções Planas Paralelas
A
Ap
B
Bp
 pouco realista
 preserva paralelismo
 possui escala conhecida
Classificação das projeções planas
 Paralelas
» ortográficas
– plantas
– elevações
– iso-métrica
» oblíquas
– cavaleiras
– cabinet
 Cônicas
» 1 pto de fuga
» 2 ptos de fuga
» 3 ptos de fuga
dp // n
dp não é paralela a n
Projeções de um cubo
• Paralelas
1
1
1
1/2
1
1
a
a
planta ou
elevação
iso-métrica
Cabinete
(a=45 ou 90)
Cavaleira
(a=45 ou 90)
• Cônicas
1 pto de fuga
2 ptos de fuga
Projeção plana é uma
transformação linear?
Ou seja:
T(P+Q) = T(P)+T(Q) e
T(aP) = aT(P) ?
2V
2V
V
(2V)p2(Vp)
Vp
plano de
projeção
2Vp
V
O
O
Vp
cp
cp
Projeções cônicas não são TL,
paralelas podem ser.
Projeção plana paralela é uma
transformação linear?
T(P+Q) = T(P)+T(Q) ?
P+Q
retas paralelas
projetam em paralelas
P
Pp
O
Pp+ Qp
Q
Pp
Qp
Qp
T( 0 ) = 0 ?
Projeção paralela em plano que passa
pela origem é uma transformação linear
Matrizes de projeções Cavaleiras
e Cabinetes
y
y
M
1
k
(1,1,1)
a
1
x
z
3
2
T(1,0,0) = (1,0)
T(0,1,0) = (0,1)
T(0,0,1) = ( -k cos a, -k sin a )
x
1
0
-k.cos(a)
0
1
-k.sin(a)
M =
Matrizes de projeções pseudoisométricas
y
y
M
j
1 jp
(1,1,1)
i
x
k
z
x
ip
kp
3
2
T(1,0,0) = (cos 30 ,-sin 30)
T(0,1,0) = (0,1)
T(0,0,1) = (-cos 30, -sin 30)
cos30
0
-cos30
-sin30
1
-sin30
M =
Projeção cônica simples
 xe 
 
P   ye 
z 
 e
ye
P
 xp 


Pp   y p 
 d 


Pp
ze
xe
zp = -d
xp
d
=
xe
-ze
xe
yp
xp
xp = d xe
-ze
yp
d
=
ye
-ze
ye
yp = d ye
-ze
-ze
d
d=n
ze
xe
ye
ze
Projeção cônica simples
xp = d xe
-ze
ye
P
yp = d ye
-ze
Pp
ze
xe
zp = -d
xp
d 0 0 0
xe
d xe
(d/-ze) xe
yp
0 d 0 0
ye
d ye
(d/-ze) ye
0 0 d 0
ze
0 0 -1 0
1
zp
1
=
=
d ze
=
-ze
w
-d
1
w
Simplificação da projeção cônica
Projeção cônica
Projeção ortográfica
eye
plano de projeção
direção de projeção
plano de projeção
Distorce o frustum de
visão para o espaço da tela
ze = -f
ye
ze
xe
ze = -n
[P]=
d=n
n
0
0
0
0
n
0
0
0
0
a

0
0
-1
0
ye
ze
xe
ze = -n
ze = -f
Uma equação para profundidade
ze  a 

n a 
Ptos no near (z=-n):
z
 f a 
Ptos no far (z=-f):
a  f  n

  f  n
[P]=
n
0
0
0
0
n
0
0
0
0
n+f
nf
0
0
-1
0

n

f
Translada o paralelepípedo de
visão para origem
t
ye
b
ze
xe
l
[T]=
r
1
0
0
-(r+l)/2
0
1
0
-(t+b)/2
0
0
1 +(f+n)/2
0
0
0
1
ye
(t-b)/2
-(t-b)/2
ze
-(r-l)/2
(r-l)/2
xe
(f-n)/2
-(f-n)/2
Escala o paralelepípedo de visão no cubo [-1,1]x[-1,1]x[-1,1]
ye
(t-b)/2
-(t-b)/2
ze
xe
-(r-l)/2
(r-l)/2
(f-n)/2
near
-(f-n)/2
far
2/(r-l)
0
0
0
0
2/(t-b)
0
0
0
0
0
0
[S] =
yd
1
1
1
zd
far
xd
-2/(f-n) 0
1
0
near
-1
-1
-1
Matriz Frustum do OpenGL
[P]=
[T]=
n
0
0
0
0
n
0
0
0
0 n+f n  f
0
0
-1
0
1
0
0
-(r+l)/2
0
1
0
-(t+b)/2
0
0
1 +(f+n)/2
0
0
0
[S T P ] =
1
 2n
r  l

 0

 0

 0

OpenGL Spec
[S] =
2/(r-l)
0
0
0
0
2/(t-b)
0
0
0
0
0
0
-2/(f-n) 0
0
1
0
2n
t b
0
0
r l
r l
t b
t b
 ( f  n)
f n
1

0 

0 

 2 fn 
f n
0 
Projeção Cônica (Frustum)
void glFrustum( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near_, GLdouble far_ );
view frustum
ye
ze
xe
camera (eye)
Obs.: near e far são
distâncias( > 0)
top
xe
ye
bottom
right
left
Plano de projeção
far
near
ze
ze
Projeção Cônica (Perspective)
void glPerspective( GLdouble fovy, GLdouble aspect,
GLdouble near_, GLdouble far_ );
w
ye
ze
aspect = w/h
h
xe
near
far
fovy
ze
xe
Matriz Ortho do OpenGL
[T]=
[S] =
1
0
0
-(r+l)/2
0
1
0
-(t+b)/2
0
0
1 +(f+n)/2
0
0
0
1
OpenGL Spec
2/(r-l)
0
0
0
0
2/(t-b)
0
0
0
0
0
0
-2/(f-n) 0
0
1
Projeção Paralela
(Ortho)
near
top
ye
far
B  right top  far)
bottom
ze
xe
A
left
right
A  left bottom  near)
void glOrtho( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top,
GLdouble near_, GLdouble far_ );
void gluOrtho2D( GLdouble left, GLdouble right,
GLdouble bottom, GLdouble top );
Glu Look At
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez,
GLdouble centerx, GLdouble centery, GLdouble centerz,
GLdouble upx, GLdouble upy, GLdouble upz);
Dados:
eye, ref, up (definem o sistema de coordenadas do olho)
Determine a matriz que leva do sistema de Coordenadas dos Objetos
para o sistema de Coordenadas do Olho
up
eye
center
Coordenadas dos
Objetos
Coordenadas do
Olho
Calcula o sistema - xe ye ze
vup
eye
dados:
eye, center, up
view
y0
view = center - eye
center
vup
ze
x0
eye
z0
view
y0
center
x0
z0
ze = – view / ||view||
Calcula o sistema - xe ye ze
vup
ze
xe
eye
xe = (vup x ze) / ||vup x ze||
view
y0
center
ye
vup
x0
xe
ze
eye
z0
view
y0
ye
center
vup
ze
xe
x0
eye
view
z0
ye = ze x xe
Translada o eye para origem
ye
ze
xe
eye
1 0 0 -eyex
0 1 0 -eyey
[T]=
0 0 1 -eyez
000 1
y0
center
y0
ye
x0
z0
ze
xe
eye
z0
center
x0
Roda xe ye ze para xo yo zo
xex xey xez 0
y y y 0
[ R ] = ex ey ez
zex zey zez 0
0 0 0 1
y0
ye
ze
xe
eye
z0
center
ye , yo
x0
ze , zo
xe , xo
Matriz Look At do OpenGL
1 0 0 -eyex
0 1 0 -eyey
[T]=
0 0 1 -eyez
000 1
ze = – view / ||view||
xe = (vup x ze) / ||vup x ze||
ye = ze x xe
xex xey xez 0
y y y 0
[ R ] = ex ey ez
zex zey zez 0
0 0 0 1
[ R T ] =?
Concatenação das transformações
y0 ye
eye
[T]
[R]
ze
xe
z0
x0
ye
ze
xe
center
[P]
ye
ye
ze
xe
ze
eye
xe
[ T2 ]
ye
y0
ze
center
xe
[S]
x0
z0
ye
1
1
1
ze
far
xe
near
-1
-1
-1
Download

z - rodrigodetoledo