Março - 28 Modelo de Câmera do OpeGL por Marcelo Gattass Departameto de Iformática PUC-Rio (adaptado por Luiz Ferado Martha para a disciplia CIV282 Sistemas Gráficos para Egeharia) Projeção Paralela (Ortho) top bottom A left ear right far ( left, bottom ear) A =, ( right, top far) B =, Obs.: ear e far são distâcias (> ) void glortho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble ear_, GLdouble far_ ); Defie volume de visão para projeção ortográfica o sistema de coordeadas da câmera (olho). void gluortho2d( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top ); Modelo de Câmera do OpeGL
Março - 28 Matriz Ortho do OpeGL (r+l)/2 [ T ] = (t+b)/2 +(f+)/2 2/(r l) 2/(t b) [ S ] = 2/(f ) OpeGL Spec [ S ] [ T ] = Matriz Ortho do OpeGL: [T] traslada o paralelepípedo de visão para origem t b l r Obs.: ear e far são distâcias (> ) e o paralelepípedo está o lado egativo do eixo z. [ T ] = (r+l)/2 (t+b)/2 +(f+)/2 (t b)/2 (t b)/2 (r l)/2 (r l)/2 (f )/2 (f )/2 Modelo de Câmera do OpeGL 2
Março - 28 Matriz Ortho do OpeGL: [S] escala o paralelepípedo de visão o cubo [-,]x[-,]x[-,] (t b)/2 ear (t b)/2 far (r l)/2 (r l)/2 (f )/2 (f )/2 Iverte a direção de z, de tal forma que o plao ear tem o meor valor de z (meor profudidade). 2/(r l) 2/(t b) [ S ] = 2/(f ) far z d y d x d ear Projeção Côica (Frustum) void glfrustum( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble ear_, GLdouble far_ ); Defie volume de visão para projeção côica o sistema de coordeadas da câmera. view frustum camera (eye) Obs.: ear e far são distâcias (> ) Plao de projeção left right top bottom far ear ze Modelo de Câmera do OpeGL 3
Março - 28 Projeção Côica (Perspective) void glperspective( GLdouble fovy, GLdouble aspect, GLdouble ear_, GLdouble far_ ); Alterativa para defiir volume de visão para projeção côica. w aspect = w/h h ear far fovy Matriz Frustum do OpeGL [ P ] = +f x f [ T ] = (r+l)/2 (t+b)/2 +(f+)/2 [ S ] [ T ] [ P ] = 2 r + l r l r l 2 t + b t b t b ( f + ) 2 f f f 2/(r l) 2/(t b) [ S ] = 2/(f ) OpeGL Spec Modelo de Câmera do OpeGL 4
Março - 28 Matriz Frustum do OpeGL: [P] distorce o frustum de visão para um paralelepípedo = -f Matém a altura do frustum de visão a distorção. Isto faz o problema da projeção côica recair o problema padrão de projeção ortográfica. = - Plao de projeção é o plao ear: d = [ P ] = +f x f = - = -f Glu LookAt void glulookat(gldouble eyex, GLdouble eyey, GLdouble eyez, GLdouble refx, GLdouble refy, GLdouble refz, GLdouble vupx, GLdouble vupy, GLdouble vupz); Dados: eye, ref, vup (defiem o sistema de coordeadas do olho) Determia a matriz que leva do sistema de coordeadas do objeto (modelo) para o sistema de coordeadas do olho z o vup (direção vertical da câmera) eye ref (poto de referêcia) y o x o Sistema de coordeadas do objeto (modelo) Sistema de coordeadas do olho Modelo de Câmera do OpeGL 5
Março - 28 Matriz LookAt do OpeGL [ T c ] = -eye x -eye y -eye z view = eye ref = view / view = (vup x ) / vup x = x [ R ] = x y z x y z x y z Matriz LookAt do OpeGL: [ C ] = [ R ] [ T c ] Cocateação das trasformações [ T c ] y eye x z ceter [ R ] [ P ] eye [ T ] y ceter [ S ] z x far z d y d x d ear - - - Modelo de Câmera do OpeGL 6
Março - 28 Problema do clippig (cerceameto cotra volume de visão) P 2 P +f x f = 2 = +f x f = 2 +2f = 2f w P P 2 Clippig em coordeadas homogêeas z d y d x d - - - top bottom far ear right left x [left, right] y [bottom, top] z [ear, far] x y z x h /w y h /w z h /w Modelo de Câmera do OpeGL 7
Março - 28 Clippig em coordeadas homogêeas y x [left, right] - x x h /w x h w, se w > x h /w x h w, se w < OpeGL Spec Clippig em coordeadas homogêeas y x [left, right] - x x h /w x x h w = - x h w x h w ão serve! w < ( > ) w x h w - - x h w = x h w Modelo de Câmera do OpeGL 8
Março - 28 Equação de um plao N.P = Ax + By + Cz N.P = N.(P + P) = N.P = d d = Ax + By + Cz z N=(A,B,C) Ax + By + Cz + D = O d P P P=(x,y,z) y (A, B, C) = N e D = d = N.( P ) x Distâcia de um poto a um plao P=(x,y,z) z N=(A,B,C) P N.P = Ax + By + Cz N.P =N.(P p + P ) N.P = d + N. P P p N. P = Ax + By + Cz + D O y x Modelo de Câmera do OpeGL 9
Março - 28 Iterseção de reta com plao P d = Ax + By + Cz +D z d P d 2 = Ax 2 + By 2 + Cz 2 +D d 2 P 2 y P = d P 2 + d 2 P d + d 2 x Cálculo das distâcias /* ===================== Distace ====================== ** ** This fuctio computes ad returs the distace betwee a ** poit ad a plae. Normal poits toward out. */ double Distace( double x, double y, double z, double w, it plae ) { switch( plae ) { case : retur( w x ); case : retur( w + x ); case 2: retur( w y ); case 3: retur( w + y ); case 4: retur( w z ); case 5: retur( w + z ); } retur(. ); } Modelo de Câmera do OpeGL
Março - 28 Trasformação para o Viewport void glviewport(glit x, GLit y, GLsizei width, GLsizei height ); x w = x + w.(x d ( )) / 2 y w = y + h.(y d ( )) / 2 z w = z d / 2 + / 2 z d y d x d - - - y w h w z w [..] x w Trasformações de um vértice OpeGL Spec Modelo de Câmera do OpeGL
Março - 28 Modelo do Pitor z Problemas a ordeação de faces (a) + + (b) z a z b Modelo de Câmera do OpeGL 2
Março - 28 ZBuffer: idéia básica z MATRIZ DE PROFUNDIDADES Rasterização de Polígoos e Lihas Modelo de Câmera do OpeGL 3
Março - 28 ZBuffer - pseudo-código void ZBuffer( void) { it x,y; for (x=; x<w; x++) { for (y=;y<h; y++) { WritePixel(x,y, bck_color); WriteZ(x,y,); } } for (each primitive) { for (each pixel i the projected primitive) { double pz = z coordiate of the (x,y) pixel; if (pz <= ReadZ(x,y)) { WritePixel(x,y, color); WriteZ(x,y,pz); } } } void gleable( GL_DEPTH_TEST ); } /* Zbuffer */ Suavização da toalização Gouraud c c 4 c 2 c c 43 c 2 c 3 Phog N N 4 N N 2 N 43 c N 2 N 3 Modelo de Câmera do OpeGL 4
Março - 28 Iterpolação de cores void glshademodel (GL_SMOOTH); void glshademodel (GL_FLAT); Modelo de Câmera do OpeGL 5