Visualização do OpenGL
Simplificação da projeção cônica
plano de projeçãoeye
Projeção cônica
plano de projeção
direção de projeção
Projeção ortográfica
Problema do clipping
xe
ye
ze
P1P2
1
1
-n
1
n
n
-n2
n
1
1
-n
1
n
0
0
0
0
n
0
0
0
0
n+f
-1
0
0
nŸf
0
= =
n
0
0
0
0
n
0
0
0
0
n+f
-1
0
0
nŸf
0
1
1
n
1
=
n
n
n2+2nf
-n
-1
-1
-n-2f
1
=
xe
ye
ze
P’1
P’2
w
Clipping em coordenadas homogêneas
-1 xh/w 1 -1 yh/w 1 -1 zh/w 1
-1 x 1 -1 y 1 -1 z 1
x[left, right] y[bottom, top]z[near, far]
xd
yd
zd
111
-1-1-1
nearfarright
left
bottom
top
Clipping em coordenadas homogêneas
x[left, right]y
-1 xh/w 1
-1 1
x
xh/w 1
xh w , se w>0 xh w , se w>0
xh w , se w<0 xh w , se w<0
OpenGL Spec
Clipping em coordenadas homogêneas
x[left, right]y
-1 xh/w 1
-1 1
x
x
w
xh w
xh -w
xh w
xh -w
não serve!w < 0(ze>0)
1
0
0
-1
-1
0
0
-1
-xh -w = 0 -xh -w = 0
xh -w = 0 xh -w = 0
O
Equação de um plano
N=(A,B,C)
P=(x,y,z)
x
y
z
P0
N.P = N.(P0 + P) = N.P0 = d N.P = N.(P0 + P) = N.P0 = d
P
d = Ax + By + Cz d = Ax + By + Cz
d
N.P = Ax + By + Cz N.P = Ax + By + Cz
Ax + By + Cz +D = 0Ax + By + Cz +D = 0
(A, B, C) = NeD = -d = N.(-P0 )
(A, B, C) = NeD = -d = N.(-P0 )
(N.P = 0)
O
Distância de um ponto a um plano
N=(A,B,C)
P=(x,y,z)
Pp
x
y
z
P
N.P = Ax + By + Cz N.P = Ax + By + Cz
N.P = Ax + By + Cz+D N.P = Ax + By + Cz+D
N.P =N.(Pp +P ) N.P =N.(Pp +P )
N.P = d + N.P N.P = d + N.P
Interseção de reta com plano
P1
P2
x
y
z
d1 = | Ax1 + By1 + Cz1+D |
d1
d2
d2 = | Ax2 + By2 + Cz2+D | P
P =d1 P2 + d2 P1
d1 + d2
Cálculo das distâncias
/* ===================== Distance ======================**** This function computes and returns the distance between a** point and a plane. Normal points toward out.*/double Distance(double x, double y, double z, double w, int plane ){ switch( plane ) { case 0: return( -w - x ); case 1: return( -w + x ); case 2: return( -w - y ); case 3: return( -w + y ); case 4: return( -w - z ); case 5: return( -w + z ); } return( 0.0 );}
Transformação para o Viewport
xd
yd
zd
111
-1-1-1
xw
yw
w
h
xw = x0 + w*(xd -(-1)) / 2yw = y0 +h*(yd -(-1)) / 2
zw = zd / 2 + 1/2
xw = x0 + w*(xd -(-1)) / 2yw = y0 +h*(yd -(-1)) / 2
zw = zd / 2 + 1/2
0
void glViewport(GLint x0, GLint y0, GLsizei width, GLsizei height );
zw[0..1]
Transformações de um vértice
OpenGL Spec
Modelo do Pintor
prof
undidad
e
z
Problemas na ordenação de faces
+ +
zazb
(a)
(b)
BSP trees: Binary Space Partion Trees
1
23
4
5a5b
3
12
5a
45b
atrásfrente
1
23
4
5a5b
3
45b
atrásfrente
2frente atrás
5a 1
1
23
4
5a5b
3
2
5a 1
4
5b
Exibição de uma BSP
void bspDisplay(bspTree *tree){ if (arvore não é vazia) { if (observador está a frente da raiz) { bspDisplay(treebackChild); DisplayPolygon(treeroot); bspDisplay(treefrontChild); } else { bspDisplay(treefrontChild); DisplayPolygon(treeroot); bspDisplay(treebackChild); } }}
Mostra a árvore detrás, a raiz e a árvoreda frente.
Mostra a árvore dafrente, a raiz e a árvorede atrás.
BSP trees: Dois exemplos de exibição
1
23
4
5a5b
3
2
5a 1
4
5b
5a, 2, 1, 3, 5b, 45a, 2, 1, 3, 5b, 4
1
23
4
5a5b
3
2
5a 1
4
5b
4, 5b, 3, 5a, 2, 14, 5b, 3, 5a, 2, 1
ZBuffer: idéia básica
z
MATRIZ DEPROFUNDIDADES
Rasterização de Polígonos e Linhas
ZBuffer - pseudo-código
void ZBuffer( void){ int x,y;
for (x=0; x<w; x++) { for (y=0;y<h; y++) { WritePixel(x,y, bck_color); WriteZ(x,y,0); } }
for (each primitive) { for (each pixel in the projected primitive) { double pz = z coordinate of the (x,y) pixel; if (pz <= ReadZ(x,y)) { WritePixel(x,y, color); WriteZ(x,y,pz); } } }
} /* Zbuffer */void glEnable( GL_DEPTH_TEST );void glEnable( GL_DEPTH_TEST );
Interpolação de cores
void glShadeModel (GL_SMOOTH);void glShadeModel (GL_SMOOTH);
void glShadeModel (GL_FLAT);void glShadeModel (GL_FLAT);
Suavização da tonalização
c1 c4
c2
c3
c12 c43c
N1 N4
N2
N3
N12 N43
c
GouraudPhong
N