Visualização - Aula 4 -
Pipeline de visualização 2D window recorte mapeamento viewport descrição geométrica rasterização
Visualização de objetos 2D y viewport 1 região (window) 1 região (window) 2 viewport 2 espaço universo x espaço de tela
Transformação de visualização Na prática, a viewport é uma região da janela gráfica associada ao programa de aplicação
Como especificar viewports? (0,0) da tela (xw,yw) glutinitwindowposition (xw,yw); glutwindowsize(m,n); glut CreateWindow ( Janela ); viewport viewport h w (xv,yv) viewport glviewport(xv,yv,h,w)... h e w são em pixels (0,0) da janela
Como especificar window no SRU? y A window é a região de interesse no espaço universo Retângulo delimitado por x=left, x=right left top right x y=top, y=bottom bottom y y top top left right left right x x bottom bottom
Região de interesse no caso de SRU 3D near far A imagem é uma projeção dos objetos 3D num plano A região de interesse pode ser determinada por um paralelepípedo cuja face frontal é esse plano de projeção glmatrixmode (GL_PROJECTION); glloadidentity(); // inicializa matriz de projeção com identidade glortho (left, right, bottom, top, near, far); ou gluortho2d (left, right, bottom, top); near = -1, far = 1... usado para o caso de SRU 2D
Como indicar região de interesse em qualquer posição espacial?
Mudando a posição do observador -zw yw xw Coordenadas Universo Modificado de M.M. Oliveira
Mudando a posição do observador -zw yw xw Coordenadas Universo Modificado de M.M. Oliveira
xc O problema da visualização 3D Mudança de sistemas de coordenadas! Camera Coordinate System (CCS) yc -zc yo -zo Object Coordinate System (OCS) xo -zw yw xw World Coordinate System (WCS)
Visualização 3D: aspectos envolvidos Posicionamento da câmera Observador Orientação da câmera Direção da projeção Definição do tipo de projeção Paralela ou Perspectiva Definição da região de interesse SRU Prisma ou tronco de pirâmide
Sistemas de Coordenadas 3D Y 2D Mão Direita Y (x,y,z) (x,y) Z X Y Z X Mão Esquerda X
Posicionamento e orientação da câmera yq Y Posição do observador vetor visão Q observador + vetor zq xq X plano de projeção Z
Sistema de referência da câmera (SRC) Y Yc Xc SRC SRU vetor visão = Zc Plano de projeção X Z IMPORTANTE: SRU é mão direita e o SRC é mão esquerda
Posição e orientação da câmera Os parâmetros da transformação são compostos na matriz ModelView glmatrixmode (GL_MODELVIEW); glloadidentity (); glulookat (px,py,pz, atx,aty,atz, vx,vy,vz); v = u x n y n O ax,ay,az u = n x up px,py,pz z SRU x
Transformação SRU SRC v u SRC j P w O SRU k O i P = O + x c u + y c v + z c w = (x, y, z) SRC P = O + x u i + y u j + z u k = (x, y, z) SRU
Posição e orientação da câmera Função da GLU indicação da posição do observador, do ponto-alvo e de um vetor que indica a vertical da câmera glulookat ( eyex, eyey, eyez, atx, aty, atz, upx, upy, upz ) AtPoint (alvo) Y Up Vector (y) Eye (posição) Z X
Visualização 3D z y câmera x // Para este exemplo // valores aproximados glmatrixmode (GL_MODELVIEW); glloadidentity(); // inicializa matriz de modelagem com identidade glulookat(0,0,0,0,0,-1,0,1,0); glmatrixmode (GL_PROJECTION); glloadidentity(); // inicializa matriz de projeção com identidade glortho (0, 100, 0, 80,1,100);
Visualização 3D y // Para este exemplo // valores aproximados câmera z x glmatrixmode (GL_MODELVIEW); glloadidentity(); // inicializa matriz de modelagem com identidade glulookat(0,0,0,0,0,-1,0,1,0); glmatrixmode (GL_PROJECTION); glloadidentity(); // inicializa matriz de projeção com identidade glortho (0, 100, 0, 80,-50,100);
Visualização 3D y // Para este exemplo // valores aproximados glmatrixmode (GL_MODELVIEW); glloadidentity(); // inicializa matriz de modelagem com identidade glulookat(50,0,0,-1,0,0,0,1,0); z x câmera glmatrixmode (GL_PROJECTION); glloadidentity(); // inicializa matriz de projeção com identidade glortho (-10, 100, 0, 80,10,80);
Mapeamento window viewport Objetos no plano num universo 2D ou objetos projetados no caso de 3D precisam ser exibidos na viewport y window viewport x
Mapeamento window viewport (xwmax, ywmax) (xu,yu) (xv,yv) (xvmax, yvmax) (xwmin, ywmin) (xvmin, yvmin) 1) Como calcular (xv,yv)? 2) É possível representar o mapeamento window-viewport através de transformações geométricas, tal que Pv = Pu.M Qual a matriz M que representa estas transformações?
Mapeamento window viewport (xwmax, ywmax) (xu,yu) (xv,yv) (xvmax, yvmax) (xwmin, ywmin) (xvmin, yvmin) xv = xvmin + (xu - xwmin) * xvmax - xvmin xwmax - xwmin yv = yvmin + (yu - ywmin) * yvmax - yvmin ywmax - ywmin
Visualização 2D: conseqüências Várias janelas na tela Visões de regiões diferentes do mesmo universo Visão de detalhe do universo Efeitos possíveis Ampliação/Redução (zoomin e zoom-out ) Panorâmica (panning) Compressão horizontal/vertical Como implementar comandos do tipo: View-All ou Fit? View 50%? View 200%?
Mapeamento window viewport (xwmax, ywmax) (xvmax, yvmax) (xu,yu) hw (xv,yv) hv (xwmin, ywmin) ww (xvmin, yvmin) wv Relação de aspecto = largura/altura Na window: ww/hw Na viewport: wv/hv
Exercício Como manter a relação de aspecto dos objetos quando as proporçõessãodiferentes? ww/hw = wv/hv Quando se tem controle sobre a transformação para coordenadas de tela, pode-se corrigir uma das coordenadas dos pontos para manter a relação Como manter a relação de aspecto quando a janela é redimensionada? Redefinindo a viewport ou a window
Callback Reshape: mudando a viewport No main glutreshapefunc(myreshape); void myreshape(glsizei w, GLsizei h) { /* w e h são os tamanhos da janela redimensionada suponha que ww e hw são os tamanhos da window no universo em unidades de SRU e que esta não deve ser alterada */ aspect = ww/hw; } if (w > h) glviewport (0,0,h*aspect, h); // janela usada parcialmente na horizontal else glviewport(0, 0, w, w/aspect); // janela usada parcialmente na vertical glmatrixmode(gl_projection); glortho2d (left, right, bottom, top); glmatrixmode (GL_MODELVIEW);
Callback Reshape: mudando a window No main glutreshapefunc(myreshape); void myreshape(glsizei w, GLsizei h) { /* w e h são os tamanhos da janela redimensionada suponha que ww e hw são os tamanhos da window no universo em unidades de SRU e que esta deve ser alterada de acordo com a janela */ aspect = w/h; glviewport(0, 0, w, h); // viewport é toda a janela glmatrixmode(gl_projection); // redefine window de acordo com a janela na tela if (w>h) hw = ww/aspect; else ww = hw * aspect; glortho2d (-ww/2, ww/2, -hw/2, hw/2); // window centrada no (0,0) glmatrixmode (GL_MODELVIEW); }
Visualização 3D y y z x câmera Projeção ortográfica x projeção perspectiva z x câmera
Definindo Projeções em OpenGL Y Y Z Z SRC X SRC X Paralela Perspectiva
Projeção paralela ortográfica Determina um paralelepípedo: glortho ( xmin, xmax, ymin, ymax, near, far) Y Z SRC ymax near ymin xmin far xmax X
Projeção paralela ortográfica Ortográfica glmatrixmode (GL_PROJECTION); glloadidentity(); glortho (left, right, bottom, top, near, far); glmatrixmode (GL_MODELVIEW); glloadidentity(); // near e far correspondem a planos em profundidade ao longo de z; são distâncias dadas relativamente ao observador
Visualização (2D) em OpenGL Utilizando a GLU gluortho2d (left, right, bottom, top); todos os parâmetros são double Esta função chama glortho (left, right, bottom, top, near, far); near = -1.0 e far = 1.0 especificando limites do volume, distâncias do observador no SRU Não se especifica posição do observador O observador está em (0,0,0) olhando para a direção do eixo z negativo
Projeção Perspectiva xmin,ymin xmax,ymax observador near far near e far são distâncias do observador
Projeção perspectiva Centro da projeção fixo: eye (posição da câmera) Duas possibilidades Determina um tronco de pirâmide: glfrustum Determina o ângulo de visão: gluperspective
Define volume de visualização glfrustrum(left, right, bottom, top, near, far) Frustrum não precisa ser simétrico ou gluperspective(fovy, aspect ratio, near, far) Simétrico Estes comandos definem outra matriz importante matriz de projeção (PROJECTION)
Projeção perspectiva Y Z (xmax, ymax) SRC (xmin, ymin) near far X glmatrixmode (GL_PROJECTION); glloadidentity(); glfrustum (xmin, xmax, ymin, ymax, near, far); glmatrixmode (GL_MODELVIEW); glloadidentity();
Projeção perspectiva Y Z SRC fovy w h near far gluperspective(fovy, aspect ratio, near, far) X fovy é o ângulo de visão em y aspect = w/h é a relação entre as dimensões da janela sobre o plano near
Projeção perspectiva Y Z SRC fovy near far X glmatrixmode (GL_PROJECTION); glloadidentity(); gluperspective (fovy, aspect, near, far); glmatrixmode (GL_MODELVIEW); glloadidentity();
Matrizes de transformação Projeção e Universo têm matrizes individuais glmatrixmode (GL_PROJECTION); // define tipo e parâmetros da projeção glmatrixmode (GL_MODELVIEW); // define câmera // define transformações geométricas e desenha // sistema default
Exemplo glmatrixmode(gl_modelview); glloadidentity(); glulookat( 0.0, 0.0, 10.0, // olho 0.0, 0.0, 0.0, // alvo 0.0, 1.0, 0.0); // up glmatrixmode(gl_projection); glloadidentity(); gluperspective( angle, (double)viewwidth/viewheight, near, far); glviewport( 0, 0, viewwidth, viewheight); desenha (); glutget(glut_window_width) glutget(glut_window_height)
Bibliografia Foley et.al. Computer Graphics Principles and Practice (1990). Cap. 6. Hearn & Baker Computer Graphics in C (1986). Cap. 12. F.S. Hill, Computer Graphics Using OpenGL. Cap. 7.