COMPUTAÇÃO GRÁFICA E INTERFACES Visualização e Transformações Geométricas em 3D Curso de Engenharia Informática Ano lectivo 2004/2005 Escola Superior de Tecnologia e Gestão da Guarda Pipeline de visualização da OpenGL v e r t i c e Matriz de Modelização e Visualização objet o Matriz de Projeção olho Divisão Perspectiva recorte Transformação “viewport” normalizadas de dispositivo janela Estado inicial do pipeline Inicialmente: • As matrizes modelview e projection são matrizes-identidade; • Vértices não são transformados e a projecção é paralela sobre o plano x-y; • O mundo visível é restrito ao cubo -1 ≤ x,y,z ≤ 1; A transformação viewport mapeia o quadrado -1 ≤ x,y ≤ 1 (em coordenadas normalizadas de dispositivo) na superfície total da janela. Viewport A viewport é a área rectangular onde a imagem será visualizada. Em OpenGL a viewport é definida com a função: void glViewport( GLint x, GLint y, GLsizei width, GLsizei height ) glViewport(0,0, (GLint)width, (GLint)height); glViewport(-100,-100, (GLint)width, (GLint)height); Primitivas gráficas glBegin(TIPO_PRIMITIVA); glVertex3f(x, y, z); ... glEnd() Primitivas gráficas Propriedades de linhas e pontos Tamanho (default = 1): glPointSize( GLfloat size ) glLineWidth( GLfloat width ) Suavização (default = desligado): glEnable(GL_POINT_SMOOTH) glEnable(GL_LINE_SMOOTH) glDisable(GL_POINT_SMOOTH) glDisable(GL_LINE_SMOOTH) Primitivas gráficas Propriedades de polígonos A ordenação dos vértices define a face frontal; O default é o sentido anti-horário; É possível alterar a ordem: glFrontFace(GL_CW) Sentido horário glFrontFace(GL_CCW) Sentido anti-horário Primitivas gráficas Modos de renderização Wireframe: glPolygonMode(GL_FRONT, GL_LINE); Sólido: glPolygonMode(GL_FRONT, GL_FILL); Pontos: glPolygonMode(GL_FRONT, GL_POINT); Backface Culling: glEnable(GL_CULL_FACE); Z-Buffer: glEnable(GL_DEPTH_TEST); Primitivas gráficas Objectos sólidos da biblioteca GLUT glutSolidTeapot(GLdouble size); glutSolidCube(GLdouble size); glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); glutSolidCone(GLdouble radius, GLdouble height, GLint slices, GLint stacks); glutSolidTorus(GLdouble innerRadius, GLdouble outerRadious, GLint nsides, GLint rings); glutSolidIcosahedron(void); glutSolidOctahedron(void); glutSolidTetrahedron(void); glutSolidDodecahedron(GLdouble radious); Todas estas funções também podem ser usadas para desenhar objectos em wire-frame Para isto, basta substituir a substring Solid por Wire no nome da função. Transformações geométricas 3D Translação 1 0 T 0 0 y 0 1 0 0 0 tx 0 t y I 3 t 1 tz 0 1 0 1 x z 1 0 P' T P 0 0 0 1 0 0 0 t x Px Px t x 0 t y Py Py t y Pt 1 tz Pz Pz t z 0 1 1 1 Transformações geométricas 3D Rotação em torno do eixo Z • Sabemos que y Px r cos Py r sin x y • Então z Px r cos cos r sin sin Py r cos sin r sin cos P’ r r Px r cos( ) Py r sin( ) • Ou, finalmente, P Px Px cos Py sin x Py Px sin Py cos Transformações geométricas 3D Matrizes de rotação • Rotação em torno de Z • Rotação em torno de X • Rotação em torno de Y cos sin 0 0 cos 0 sin 0 sin cos 0 0 0 0 1 0 0 0 0 1 0 sin 1 0 0 cos 0 0 0 0 0 1 0 1 0 cos 0 sin 0 0 0 sin cos 0 0 0 0 1 Transformações geométricas 3D Variação de escala y y Tescala x z x z S x 0 0 0 0 Sy 0 0 0 0 Sz 0 0 0 0 1 Transformações geométricas 3D Transformações geométricas 3D em OpenGL As trnasformações geométricas são aplicadas nas matrizes modelview e projection do pipeline : A matriz é escolhida através da função glMatrixMode(GL_MODELVIEW); ou glMatrixMode(GL_PROJECTION); As transformações geométricas Translação, Rotação e Variação de escala são implementadas respectivamente pelas funções: glTranslated( GLdouble x, GLdouble y, GLdouble z ); glTranslatef( GLfloat x, GLfloat y, GLfloat z ); glRotated( GLdouble angle, GLdouble x, GLdouble y, GLdouble z ); glRotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z ); glScaled( GLdouble x, GLdouble y, GLdouble z ); glScalef( GLfloat x, GLfloat y, GLfloat z ); Existem outras funções para manipular as matrizes das transformações: glLoadIdentity() glMultMatrix () glLoadMatrix() glPushMatrix () glPopMatrix() Projecções Geométricas As projecções permitem a visualização planar de objectos tridimensionais. Para gerar a imagem de um objecto 3D, precisamos converter as coordenadas 3D em coordenadas 2D que correspondem a uma visão específica do objecto. Esse processo é chamado de projecção. Projecções Geométricas Elementos básicos das projecções Sendo a projecção de um objecto a sua representação gráfica num plano, e tendo os objectos três dimensões, para a sua representação num plano bidimensional devem ser considerados os seguintes elementos básicos da projecção: •Plano de Projecção; •Projectante, ou raio de projecção; •Centro de projecção. A projectante é a recta que passa pelos pontos do objecto na direcção do centro de projecção e intercepta o plano de projecção. Ela pode ser oblíqua ou ortogonal ao plano de projecção, definindo assim o tipo de projecção. Plano de Projeção Centro de Projeção Projectante ou Raio de projecção Projecções Geométricas Tipos de projecções geométricas Existem dois tipos de projecção: a perspectiva e a ortográfica (paralela). Na projecção perspectiva as projectantes convergem para o centro de projecção fazendo com que a projecção resultante tenha em conta a distância a que se encontra o objecto, do plano de projecção. A projecção perspectiva é aquela que acontece no processo de formação de imagens nos nossos olhos ou numa câmara fotográfica, por isso é a que gera imagens mais realistas e mais familiares ao observador humano. Projecções Geométricas Tipos de projecções geométricas Na projecção ortográfica ou paralela, o centro de projecção está no infinito e as projectantes são paralelas entre si. Na projecção paralela, as linhas que unem os pontos A e B às suas projecções A’ e B’ são paralelas, isto faz com que o segmento projectado tenha o mesmo tamanho para qualquer distância entre o plano de projecção e o objecto. Este tipo de projecção é utilizada em projectos de arquitectura e engenharia onde não há preocupação com a distância aparente dos objectos e o que realmente interessa é que a escala e os ângulos dos objectos seja preservada Projecções Geométricas As projecções geométricas são classificadas conforme o organograma seguinte. Esta classificação depende das relações entre o centro de projecção, o plano de projecção e as projectantes. Projecções Geométricas Projecções paralelas ortográficas Usadas em desenhos técnicos – Engenharias Civil e Mecânica – Arquitectura Vantagens – Medidas precisas; – Todas as vistas na mesma escala; Limitações – Não é possível “visualizar” objectos 3D; – Múltiplas vistas para definir peça; Projecções Geométricas Projecções paralelas axonométricas Mesmo método das vistas ortogonais • Isométricas: – ângulos de 120º entre eixos (1 escala) • Dimétricas: – dois ângulos iguais (2 escalas) • Trimétrica: – três ângulos diferentes (3 escalas) Projecções Geométricas Projecções paralelas obliquas Raios projectores formam ângulo oblíquo com o plano de projecção. Plano de projecção normal a um dos eixos principais. Vantagens – Mostra forma exacta de uma face; – Comparação de dimensões possível; – Ideia da aparência 3D de um objecto; Desvantagens – aparência distorcida dependendo do plano de projecção; – falta de “realismo”; Projecções Geométricas Projecções paralelas obliquas (dois casos especiais) Cavaleira – Ângulo entre projectores e normal = 45º; – Faces perpendiculares à escala. Gabinete – Ângulo entre projectores e normal arctg(2) = 63.4º; – Faces perpendiculares à escala de 50%. Projecções Geométricas Projecções perspectivas Usadas mais em publicidade e artes gráficas mas também em arquitectura, desenho industrial, engenharia. Garantem maior “realismo” mas alteram a geometria dos objectos As linhas paralelas dos objectos (não ao plano de projecção), convergem em pontos de fuga. As linhas paralelas aos eixos definem pontos de fuga axiais (máximo de 3). Não mantém proporcionalidade entre distâncias. O tamanho dos objectos diminui com a distância. Só mantém a amplitude dos ângulos em faces paralelas ao plano de projecção. Projecções Geométricas Projecções perspectivas Projecções Geométricas Definição matemática da projecção genérica Qualquer projecção pode ser definida matematicamente por uma matriz 4 x 4. Considere-se a projecção de um ponto P ilustrada na figura ao lado. O plano de projecção é perpendicular ao eixo z na distância zp da origem. O centro de projecção está a uma distância D do ponto (0, 0, zp). O vector normalizado (dx, dy, dz) dá a direcção de projecção e é a direcção de (0, 0, zp) para o centro de projecção. Projecções Geométricas Definição matemática da projecção genérica Para construir a matriz geral de projecção, a qual chamaremos de Mgeral, basta sabermos apenas os valores de zp, (dx, dy, dz) e D. A partir desta matriz geral é possível definir qualquer tipo de projecção. Deve-se apenas ter em conta as características gerais das projecções paralelas e perspectivas, e as características específicas dos casos especiais dessas projecções. A direcção do vector unitário (dx, dy, dz) e o valor de D (distância do ponto (0, 0, zp) ao centro de projecção) pode ser calculada da seguinte forma: Projecções Geométricas Matriz geral de projecção em OpenGL void __fastcall Form1::FormResize() { GLfloat mprojecao[16]; glViewport(0,0,width,height); glMatrixMode( GL_PROJECTION ); glLoadIdentity(); mprojecao [0]=1; mprojecao [1]= 0; mprojecao [2]= 0; mprojecao [3]= 0; mprojecao [4]= 0; mprojecao [5]= 1; mprojecao [6]= 0; mprojecao [7]= 0; mprojecao [8]= 0; mprojecao [9]= 0; mprojecao [10]= 0; mprojecao [11]= 1/7; mprojecao [12]= 0; mprojecao [13]= 0; mprojecao [14]= 0; mprojecao [15]= 1; glLoadMatrixf (mprojecao); glClearColor(0.0f,0.0f,0.0f,0.0f); glClear( GL_COLOR_BUFFER_BIT ); glClear(GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); } glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); Formato da matriz em OpenGL Projecções Geométricas Definição da matriz de projecção perspectiva – 1º exemplo Para simplificar, considere-se a projecção perspectiva representada na figura ao lado com o centro de projecção em (0, 0, 0) e direcção de projecção ortogonal. Os parâmetros para definir a matriz de projecção perspectiva Mper para este exemplo, são respectivamente: Substituindo estes valores na matriz de projecção geral, obtemos a seguinte matriz de projecção perspectiva: Notar que neste exemplo basta conhecer a distância D para que a matriz de projecção possa ser definida. Projecções Geométricas Definição da matriz de projecção perspectiva – 2º exemplo Considere-se uma nova projecção perspectiva ortogonal representada na figura ao lado, agora com o plano de projecção em zp = 0 e o centro de projecção em (0, 0, -D). Os parâmetros para definir a matriz de projecção perspectiva M’per, são respectivamente: Substituindo estes valores na matriz de projecção geral, obtemos a seguinte matriz de projecção perspectiva: Notar que mais uma vez, basta conhecer a distância D para que a matriz de projecção possa ser definida. Projecções Geométricas Projecção perspectiva em OpenGL Em OpenGL existe uma matriz de projecção perspectiva default com direcção ortogonal. Para configuração de uma projecção perspectiva em OpenGL (utilizando a matriz default), é apenas necessário definir o volume visível representado na figura ao lado. O volume visível é definido pelo tronco de uma pirâmide. São especificados os valores de X máximo e mínimo assim como os valores de Y máximo e mínimo. O valor de Near é igual a -Z min e o valor de Far é igual a -Z max. Somente será visualizado o que estiver dentro deste volume visível. A projecção é definida pelos seguintes comandos: glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glFrustum(Xmin, Xmax, Ymin, Ymax, Near, Far); Projecções Geométricas Projecção perspectiva em OpenGL Existe outra função da biblioteca GLU (utilitária da OpenGL), que fornece uma outra maneira de se configurar uma projecção perspectiva em OpenGL. Ela permite que seja especificado o ângulo de visão (ou field of vision), da projecção: gluPerspective (fovy, aspecto, near, far); Onde: fovy -> é o ângulo de visão aspect -> Largura (w na figura) / Altura (h na figura) da janela de visualização. near e far -> idênticos aos parâmetros do comando Frustum. Projecções Geométricas Definição da matriz de projecção perspectiva – 3º exemplo Considere-se agora a projecção perspectiva da figura ao lado em que a direcção de projecção não é ortogonal ao plano de projecção. Os parâmetros para definir uma matriz de projecção perspectiva M1, são respectivamente: Substituindo estes valores na matriz de projecção geral, obtemos a seguinte matriz de projecção perspectiva: Projecções Geométricas Definição da matriz de projecção ortográfica – Exemplo 1 Considere-se a projecção ortográfica da figura ao lado com direcção de projecção ortogonal. Como a projecção paralela pode ser vista como uma projecção perspectiva onde o centro de projecção está no infinito, o valor de D (distância do centro de projecção ao ponto (0,0, zp), neste caso zp = 0) será infinito. Os parâmetros para definir uma matriz de projecção perspectiva Mpar, são respectivamente: Substituindo estes valores na matriz de projecção geral, obtemos a seguinte matriz de projecção paralela: Notar que neste caso especial de projecção paralela não é necessário conhecer qualquer parâmetro da projecção e a matriz da mesma é constante. Projecções Geométricas Projecção ortográfica em OpenGL Em OpenGL já vem definida também uma matriz de projecção com direcção ortogonal default para a projecção ortográfica. Como na projecção perspectiva, para realizar uma projecção deste tipo em OpenGL (utilizando esta matriz default), é necessário definir-se apenas o volume visível ilustrado na figura ao lado. O volume visível é definido por um paralelepípedo. São especificados os valores de X máximo e mínimo assim como os valores de Y máximo e mínimo. O valor de Near é igual a -Z min e o valor de Far é igual a - Z max. Como na projecção perspectiva, somente será visualizado o que estiver dentro deste volume visível. A projecção é definida pelos seguintes comandos: glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(Xmin, Xmax, Ymin, Ymax, Near, Far); Projecções Geométricas Definição da matriz de projecção ortográfica – Exemplo 2 A projecção isométrica é uma projecção onde o plano de projecção (e consequentemente a direcção de projecção) faz o mesmo ângulo com cada eixo principal (x, y, e z). Existem apenas oito direcções (uma em cada octante), que satisfazem esta condição. Por exemplo: (1, 1, 1), (1, -1, -1) e (-1, -1, -1). Essa projecção é muito útil, pois as medidas junto aos eixos são feitas na mesma escala (iso: igual, metric: medida). A matriz Miso de uma projecção isométrica com direcção de projecção igual a (-1, -1, -1) é definida pelos parâmetros: Substituindo estes valores na matriz de projecção geral, obtemos a seguinte matriz de projecção paralela: Projecções Geométricas Definição da matriz de projecção ortográfica – Exemplo 3 As projecções cabinet e cavaleira são muito utilizadas em arquitectura e engenharia. Para a projecção cavaleira, a direcção de projecção faz um ângulo de 45º com o plano de projecção. Já a projecção cabinet, tem uma direcção de projecção fazendo um ângulo de arctan(2) = 63,4º com o plano de projecção. Para estas projecções, considerando t o ângulo entre o eixo z e o eixo x (tipicamente 30º ou 45º), teremos como parâmetros das matrizes Mcav (cavaleira) e Mcab (cabinet) os valores mostrados na figura 4.5.11. Substituindo estes valores na matriz de projecção geral, obtemos a seguinte matriz resultantes das projecções cavaleira e cabinet para t = 45º. : Modelo de câmara sintética A OpenGL utiliza uma analogia comparando a visualização 3D com tirar fotografias com uma câmara. volume visível câmara tripé modelo Modelo de câmara sintética Interpretação do modelo da câmara Duas interpretações possíveis: Levam a câmara até a cena que se quer visualizar; Levam os objectos da cena até uma câmara estacionária; up y Em OpenGL a câmara pode ser posicionada com a função: gluLookAt(eyex, eyey, eyez,aimx, aimy, aimz, upx, upy, upz); eye = ponto onde a câmara será posicionada aim = ponto para onde a câmara será apontada up = vector que dá a direcção “para cima” da câmara aim eye x z Modelo de câmara sintética Interpretação do modelo da câmara Modelação: Mover /deformar os objectos up y Visualização: Mover e orientar a câmara aim eye x Projecção: Ajuste da lente / objectiva da câmara Viewport: Aumentar ou reduzir a fotografia z