Visualização do OpenGL
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
Problema do clipping
ye
P2
P1
ze
xe
n
0
0
0
0 0
0
n 0
0
0 n+f nf
0 -1 0
1
n
1
n
-n = -n2 =
1
n
1
1
-n
1
n 0 0
0
1
n
-1
0 n 0
0
1
n
-1
0 0 n+f nf
0 0 -1
0
n = n2+2nf = -n-2f
1
-n
1
w
ye
P’1
P’2
ze
xe
Clipping em coordenadas
homogêneas
top
yd
1
1
1
-1
-1
-1
zd
xd
bottom
left
far
x [left, right]
y [bottom, top]
z [near, far]
near
right
-1 x  1
-1 y 1
-1 z 1
-1  xh/w  1
-1 yh/w  1
-1  zh/w  1
Clipping em coordenadas
homogêneas
x [left, right]
y
x
-1
-1  xh/w  1
xh  w , se w>0
1
xh/w  1
xh  w , se w<0
OpenGL Spec
Clipping em coordenadas
homogêneas
x [left, right]
y
x
-1
-1  xh/w  1
1
x
1
xh -w = 0
0
0
-1
xh  w
xh -w
não serve!
w<0
(ze>0)
xh  w
w
-1
0
0
-1
xh  -w
-xh -w = 0
Equação de um plano
N.P = Ax + By + Cz
N.P = N.(P0 + DP) = N.P0 = d
(N.DP = 0)
d = Ax + By + Cz
N=(A,B,C)
z
Ax + By + Cz +D = 0
P0
d
O
x
DP
P=(x,y,z)
y
(A, B, C) = N
e
D = -d = N.(-P0 )
Distância de um ponto a um plano
N.P = Ax + By + Cz
N=(A,B,C)
N.P =N.(Pp +DP )
DP
P=(x,y,z)
N.P = d + N.DP
z
N.DP = Ax + By + Cz+D
Pp
O
x
y
Interseção de reta com plano
P1
d1 = | Ax1 + By1 + Cz1+D |
d1
d2 = | Ax2 + By2 + Cz2+D |
P
z
d2
P2
P=
y
x
d1 P2 + d2 P1
d 1 + 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
void glViewport(GLint x0, GLint y0,
GLsizei width, GLsizei height );
xw = x0 + w*(xd -(-1)) / 2
yw = y0 +h*(yd -(-1)) / 2
zw = zd / 2 + 1/2
yw
yd
1
1
1
zd
xd
h
-1
-1
-1
w
0
zw[0..1]
xw
Transformações de um vértice
OpenGL Spec
Modelo do Pintor
z
Problemas na ordenação de faces
(b)
(a)
+
za
+
zb
BSP trees: Binary Space Partion Trees
5a
5b
3
frente
2
atrás
1
2
5a
3
1
4
4
5b
3
5a
5b
frente
2
2
frente
3
1
atrás
atrás
4
5b
1
5a
4
3
5a
5b
2
2
4
3
5a
1
4
1
5b
Exibição de uma BSP
void bspDisplay(bspTree *tree)
{
if (arvore não é vazia) {
if (observador está a frente da raiz)
{
bspDisplay(treebackChild);
DisplayPolygon(treeroot);
bspDisplay(treefrontChild);
}
else
{
bspDisplay(treefrontChild);
DisplayPolygon(treeroot);
bspDisplay(treebackChild);
}
}
}
Mostra a árvore de
trás, a raiz e a árvore
da frente.
Mostra a árvore da
frente, a raiz e a árvore
de atrás.
BSP trees: Dois exemplos de exibição
3
5a
5b
2
2
4
3
1
5a
1
5b
4
5a, 2, 1, 3, 5b, 4
3
5a
5b
2
2
4
3
5a
1
1
5b
4
4, 5b, 3, 5a, 2, 1
ZBuffer: idéia básica
z
MATRIZ DE
PROFUNDIDADES
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);
}
}
}
void glEnable( GL_DEPTH_TEST );
} /* Zbuffer */
Interpolação de cores
void glShadeModel (GL_SMOOTH);
void glShadeModel (GL_FLAT);
Suavização da tonalização
Gouraud
c1
Phong
c4
N1
c12
c
N4
c43
N
N12
N43
c
c2
c3
N2
N3
Download

0 - rodrigodetoledo