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 nf 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 nf 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 + DP) = N.P0 = d (N.DP = 0) d = Ax + By + Cz N=(A,B,C) z Ax + By + Cz +D = 0 P0 d O x DP 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 +DP ) DP P=(x,y,z) N.P = d + N.DP z N.DP = 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(treebackChild); DisplayPolygon(treeroot); bspDisplay(treefrontChild); } else { bspDisplay(treefrontChild); DisplayPolygon(treeroot); bspDisplay(treebackChild); } } } 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