Computação Gráfica Transformações Geométrica no Plano e no Espaço Tomás Antônio C. Badan 1 Pontos e Vetores Ponto: Posição especificada por uma coordenada em um sistema de referência Depende do sistema de coordenadas Vetor (http://pessoal.sercomtel.com.br/matematica/geometria /vetor2d/vetor2d.htm): Classe de objetos matemáticos (segmentos) com a mesma direção, mesmo sentido e mesmo módulo (intensidade). Propriedades são independentes de quaisquer sistema de coordenadas 2 Pontos e Vetores (2) 3 Propriedades dos Vetores Vetor unitário → v = V/|V| ∣= Vx 2 Vy 2 Vz 2 ∣V Módulo do vetor → V(Vx, Vy) = [Vx Vy] = Vx.i + Vy.j Produto Escalar ou Interno V.W = Vx.Wx + Vy.Wy = |V||W|cosӨ Se (Vx, Vy), ortogonais: (Vy, Vx) ou (Vy, Vx) Representação: Vetor Linha : V =[Vx Vy Vz ] ou [] Vx Vetor Coluna : V = Vy Vz 4 Vetores e Matrizes Vetores → matriz de 1 coluna ou de 1 linha Matriz → tabela de m x n símbolos, representada sob a forma de um quadro com m linhas e n colunas 5 Definições Multiplicação de Matrizes → A.B possível se nA = mB Matriz Resultante → mA x nB Matriz Quadrada → m = n Matriz Identidade (I) → matriz quadrada, onde aij = 1 se i = j e aij = 0 se i j T Matriz Transposta (A ) → aij = aji 1 1 1 Matriz Inversa (A ) → A.A = A .A = I 6 Exemplos A matriz adjunta de uma matriz quadrada A é a transposta da matriz que se obtem substituindo cada termo Ai,j pelo determinante da matriz resultante de retirar a A a linha i e a coluna j (isso é, o determinante menor) multiplicado por ( − 1)i + j (isso é, alternando os sinais). 7 Observação sobre Vetores e Matrizes O produto vetorial entre dois vetores V e W produz um terceiro vetor que é ortogonal aos anteriores Magnitude = área do paralelogramo formado por V e W obedece a regra da mão direita entre V e W ∣ ∣ k i j =V xW = Vx Vy Vz = ∣∣W∣sen U u∣V ø Wx Wy Wz onde i , j e k , vetores unitários nos eixos x , y e z ,respectivamente 8 Observação sobre Vetores e Matrizes (2) Considere o seguinte sistema de equações : x ' =a.xb.y y ' =c.xd.y Pode ser descrito pela notação de vetor coluna : x ' = a b x P ' =C.P c d y y' ou pela notação de vetor linha : a c [ x ' y ' ]=[ x y ] P ' =P.C T b d [ ] [ ][ ] [ ] Note que trocar de uma notação pela outra , envolve alterar a ORDEM DA MULTIPLICAÇÃO e aplicar a TRANSPOSTA sobre a matriz de coeficientes. 9 Observações sobre a Notação O sistema vetor linha era usado pelos primeiros sistemas gráficos e por alguns autores Livro adotado usa essa representação Representação vetor coluna é a representação matemática padrão Utilizado pelo OpenGL, Java, PHIGS ... Será a utilizada durante o curso. 10 Sistemas de Coordenadas Coordenadas Cartesianas Coordenadas Polares 2D Coordenadas Cilíndricas 2D, 3D 3D Coordenadas Esféricas 3D 11 Coordenadas Cartesianas 12 Coordenadas Polares 13 Coordenadas Cilíndricas 14 Coordenada Esférica 15 Sistema de Referências Sistemas utilizados para finalidades específicas: Sistema de Referência do Universo (SRU) Sistema de Referência do Objeto (SRO) Sistema de Referência da Câmera (SRC) Sistema de Referência Normalizado (SRN) Sistema de Referência do Dispositivo (SRD) 16 Sistema de Referência do Universo (SRU) Coordenadas do universo ou do mundo Descreve os objetos em termos de coordenadas utilizadas pelo usuário Cada tipo de aplicação especifica o seu universo de trabalho Pode estar em metros, kilômetros, milímetros, etc → depende da aplicação Pode estar em qualquer sistema de coordenada Possui limites máximo e mínimo 17 Sistema de Referência do Objeto (SRO) Cada objeto é um miniuniverso individual Suas particularidades são descritas em função de seu sistema de referência Normalmente, o centro do sistema de coordenadas é o seu centro de gravidade, ou eixo de rotação Em sólidos, o centro é conhecido como pivô 18 Sistema de Referência da Câmera (SRC) Caso particular do SRO Coordenadas são normalmente especificadas em uvn 19 Sistema de Referência Normalizado (SRN) Trabalha com as coordenadas normalizadas: Alguns utilizam o intervalo entre 0 e 1 0 ≤ x ≤ 1; 0 ≤ y ≤ 1; 0≤ z ≤ 1 Alguns sistemas utilizam o intervalo 1 a 1 É um sistema de referência intermediária entre o SRU e o SRD Principal aplicação é tornar a geração de imagens independente do dispositivo de saída 20 Sistema de Referência do Dispositivo (SRD) Utiliza coordenadas que podem ser fonecidas diretamente para um dado dispositivo de saída Ex. se for vídeo, pode ser valor de pixels (640x480, 800x600, ...) Se for uma impressora, o tamanho do papel Geralmente, depende da resolução possível e da configuração do usuário, dentro de um conjunto possíveis de configurações 21 Transformações entre Sistemas de Coordenadas Conversões entre sistemas de coordenadas Ex. cartesiano para polar r = sqrt(x*x + y*y) Ө = arctan(y/x) Transformações entre sistemas de referências SRU e SRO SRC e SRU SRN e SRD etc 22 Exemplo 23 Transformações sobre Pontos e sobre Objetos Translação Escala Rotação Reflexão Cisalhamento Transformações entre sistemas de referências 24 Translação Movimentar o objeto Transladar todos os pontos que compõem um objeto Somente os pontos que o define completamente É uma alteração de corpo rígido Não deforma o objeto transladado [ ][ ][] Tx x ' =T x x x' x y ' =T y y temos que : y ' = T y y , ou seja , P ' =T P z' z Tz z '=T z z { } 25 Translação (2) 26 Escala Altera as dimensões do objeto Multiplica cada ponto do objeto por um fator de escala { Podem ser escalas diferentes em cada eixo cartesiano, por exemplo. Se não estiver na origem, causa translação x ' =Sx∗x y ' =Sy∗y z ' =Sz∗z } [ ][ ][ ] x' Sx 0 0 x em notação matricial : y ' = 0 Sy 0 y z' 0 0 Sz z portanto , P ' =S∗P 27 Escala (2) Não é uma alteração de corpo rígido Deforma o objeto transformado 28 Em openGL Translação: Escala: glTranslate[fd](X, Y, Z); glScale[fd](X, Y, Z); Matriz Identidade glLoadIdentity(); Permite inicializar o sistema de matrizes 29 Rotação 30 Rotação (2) x=r.cos ø y=r.sen ø x ' =r.cos ø ß=r.cos øcos ß −r.sen ø sen ß y ' =r.sen ø ß =r.sen ø cos ßr.cos ø sen ß x ' = x.cos ß − y.sen ß y ' =y.cos ß x.sen ß [ ][ ][ ] x ' = cos ß −sen ß x , ou seja , P ' =R.P sen ß cos ß y y' onde ß ângulo de rotação 31 Rotação (3) 32 Rotação (4) Se objeto não está na origem, rotação implica também em translação Para rotacionar um objeto em torno de um determinado ponto → transladar ponto P (objeto) para a origem, rotacionar, transladar de volta para o ponto P Princípio aplicado a todas as transformações que envolvem translação implícita Pode ser realizadas várias operações em cascata aplicando o mesmo princípio 33 Translação + Rotação + Translação Alteração de corpo rígido pode ser feita pela alteração inversa no sistema de coordenada Girar um objeto ø equivale a rotacionar o sistema de coordenada ø 34 Rotação em 3D Realizada individualmente sobre cada eixo, usando os ângulos de Euler Rotacionase o plano (2D) em torno do eixo que é normal a este plano Eixos ortogonais → eixos perpendiculares entre si Regra da mão direita → define um sistema de eixos positivos. Padrão Regra da mão esquerda → define um sistema de eixos negativos. Ex. monitores 35 Rotação em 3D (2) 36 Ângulos de Euler Rotações: no eixo X → ângulo no eixo Y → ângulo no eixo Z → ângulo 37 Rotação em 3D (3) Eixo Z Rotação plano XY Eixo X Rotação plano YZ Eixo Y Rotação plano ZX [ ][ [ ][ [ ][ ][ ] ][ ] ][ ] cosa −sena 0 x x' y ' = sen a cosa 0 y 0 0 1 z z' 1 0 0 x' x y ' = 0 cos ß −sen ß y 0 sen ß cos ß z z' cosd 0 sen d x x' 0 1 0 y' = y −sen d 0 cosd z z' 38 Rotação em 3D Observações Todas as matrizes anteriores são ortonormais Ortogonais e normalizadas Se uma das linhas, ou colunas, forem considerados vetores unitarios → teriam comprimento = 1 Produto escalar ou interno entre vetores seria igual a zero (ortogonais) Inversa = transposta (somente matrizes ortonormais) I = M.M1 = M.MT 39 Rotação em 3D – Observações (2) Rotação em 3D → combinação de rotações definidas pelo ângulo de Euler Dependente da ordem como é feita as rotações Operação conhecida como concatenação Executada pela multiplicação de matrizes Exemplo: Rotação no eixo X, depois no eixo Y e depois no eixo Z: P' = Rz(Ry(Rx.P)) ← Note a ordem das matrizes. A notação está em vetor coluna, se for em vetor linha → P' = ((P.Rx)Ry)Rz) P' = Rz.Ry.Rx.P ≠ Rx.Ry.Rz.P 40 Multiplicação de Matrizes no OpenGL Dada a matriz M = A.B.C.D, podemos obtê la de duas formas: Pré multiplicação M' = D → M'' = C.M' → M''' = B.M'' → M = A.M''' Pós multiplicação M' = A → M'' = M'.B → M''' = M''.C → M = M'''.D Política adotada no OpenGL 41 Multiplicação de Matrizes no OpenGL Exemplo Deseja−se fazer uma rotação ,um escalonamento e , por fim , uma translação sobre um ponto P , ou seja : P '=T.S.R.P em OpenGl : glLoadIdentity ; inicializa o sistema de matrizes glTranslatef Tx ,Ty ,Tz ; glScalef Sx , Sy , Sz ; glRotatef ø , Rx , Ry , Rz; Note que a primeira operação sobre o ponto é a última a ser especificada 42 Rotação em 3D – Método 2 Considere que: É dado um vetor A = (Ax, Ay, Az) Unitário → a = A/| A| É dado um vetor B = (Bx, By, Bz) Aproximadamente ortogonal a A 43 Método 2 (2) : temos que : vetor ortonormal a a e B a x B C= C c = =c x , c y , c z ∣C∣ vetor ortonormal na direção aproximada de B b ' : b '=c x a =b ' x , b ' y , b ' z Portanto , matriz de rotação : [ ax b ' x c x R= a y b ' y c y az b ' z cz ] 44 Método (2) Exemplo Rotação no eixo X de um ângulo ø a =1, 0, 0 =b=0, cosø , senø B logo , i j k c =a x b= 1 0 0 0 cosø sen ø c =0,−senø , cosø Portanto , matriz de rotação no eixo X : ∣ [ 1 0 0 R= 0 cosø −senø 0 senø cosø ∣ ] 45 Em openGL Rotação é definida em torno de um vetor V: glRotate[fd](ø, x, y, z); Onde ø é dado em graus (sentido contrário ao ponteiro do relógio) 46 Reflexão Espelhar o objeto em um dos eixos, ou em ambos Em 2D → reflexão horizontal (eixo X) ou vertical (eixo Y) Em 3D → reflexão sobre os planos (XY, YZ ou ZX) Reflex ão no plano ZX [ ][ 1 0 x' y ' = 0 −1 0 0 z' 0 0 1 ][ ] x y z Reflexão no plano ZX e YZ [ ][ ][ ] −1 0 0 x x' y ' = 0 −1 0 y 0 0 1 z z' 47 Reflexão (2) 48 Em OpenGL Basta utilizar o comando para escalonar um objeto, com parâmetros negativos Exemplo: glScalef(1, 1, 1) Reflexão no plano YZ Tomar cuidado com a orientação das faces, para que uma face externa não se torne uma face interna Ordem dos pontos na definição de triângulos ou quadriláteros 49 Cisalhamento Distorce o formato do objeto Deslocase uma coordenada, proporcional ao(s) valor(es) da(s) outra(s) coordenada(s) x ' = xSh.y y'=y z'=z [ ][ [ ][ ][ ] ][ ] 1 Sh 0 x x' y' = 0 1 0 y 0 0 1 z z' x '=x y ' =a.x yb.z z ' =z 1 0 0 x x' y' = a 1 b y 0 0 1 z z' 50 Cisalhamento (2) 51 Coordenadas Homogêneas Unifica as operações de cisalhamento, reflexão, rotação, escala e translação Um ponto é expresso por 4 valores Dois conjuntos representam o mesmo ponto se forem múltiplos PhT' = [ x' y' z' M] → PT = [x y z] = [x'/M y'/M z'/M] [2 3 4 6] = [4 6 8 12] Se M = 1 → No sistema homogêneo [x y 1] equivale à [x y] no sistema cartesiano O mesmo ocorre para matrizes 52 Coordenadas Homogêneas (2) Rotação no eixo Z Escala ][ ] [ ][ [ ] [ ][ ] [ ] [ ][ ] cosa −sen a x' y ' = sen a cosa 0 0 z' 0 0 1 Sx 0 0 0 x' y ' = 0 Sy 0 0 0 0 Sz 0 z' 1 0 0 0 1 Translação 1 0 x' y' = 0 1 0 0 z' 1 0 0 0 0 1 0 0 0 0 1 x y z 1 x y z 1 0 Tx x 0 Ty y 1 Tz z 0 1 1 53 Em OpenGL Para cisalhamento não existe um comando específico Deve especificar um buffer de 16 posições (matriz 4x4) ordenado pelas colunas da matriz [ m11 m21 m= m31 m41 m12 m22 m32 m42 m13 m23 m33 m43 ] m14 m24 , m34 m44 em C : GLdouble m [16]={m11 , m21 , m31 , m41 , m12 , m22 ,... , m24 , m34 , m44}; Não é a forma usual de se especificar uma matriz em C 54 Em OpenGL (2) Substitui a matrix atual pela matrix fornecida: glLoadMatrix[fd](m) Multiplica a matrix atual com a matrix especificada: glMultMatrix[fd](m) 55 Transformação entre Sistemas de Coordenadas 2D De SRO → SRU 56 Transformação entre Coordenadas 2D – Método 1 [ cosø −senø 0 Rotacionar por ø R X ' Y ' , XY = sen ø cosø 0 0 0 1 ] [ ] 1 0 Transladar por x 0 , y 0 T X ' Y ' , XY = 0 1 0 0 x0 y0 1 M X ' Y ' , XY =T X ' Y ' , XY . R X ' Y ' , XY 57 Transformação entre Coordenadas 2D – Método 2 1 °− Aplicando a Rotação : Conhecendo as coordenadas de V em XY : P1− P0 V =v x , v y v = = ∣ ∣P − P ∣ ∣V 1 0 vetor ortogonal a v u =v y ,−v x =u x , u y [ ] [ ][ ] [ ] [ ][ ] a b 0 x' x y = c d 0 y' 0 0 1 1 1 aplicando o vetor unitário 0,1 de X ' Y ' direção de v vx a b 0 0 b=v x vy = c d 0 1 d=v y 0 0 1 1 1 58 Transformação entre Coordenadas 2D – Método 2 (2) Aplicando o vetor unitário1,0de X ' Y ' direção de u [ ] [ ][ ] [ ] [ ][ ] [ ux a b 0 1 a=u x = c d 0 0 uy c=u y 0 0 1 1 1 ux vx 0 logo R X ' Y ' , XY = u y v y 0 0 0 1 1 0 M X ' Y ' , XY =T X ' Y ' , XY . R X ' Y ' , XY = 0 1 0 0 x0 ux vx 0 ux v x y0 . uy vy 0 = uy v y 1 0 0 1 0 0 x0 y0 1 ] 59 Transformação entre coordenadas 2D – SRU → SRO Processo inverso ao descrito anteriormente 60 SRO → SRU Sabemos que : −1 P=M X ' Y ' , XY . P ' M −1 . P=M X ' Y ' , XY X ' Y ' , XY . M X ' Y ' , XY . P ' logo : P '=M −1 X ' Y ' , XY . P=M XY , X ' Y ' . P M XY , X ' Y ' =R XY , X ' Y ' .T XY , X ' Y ' onde : [ ] [ ] ux uy 0 T R XY , X ' Y ' =R X ' Y ' , XY = v x v y 0 0 0 1 e 1 0 −x 0 T XY , X ' Y ' = 0 1 −y 0 0 0 1 61 Transformações entre Sistemas de Coordenadas 3D Generalizado e assumindo que os vetores u , v e w são conhecidos no sistema XYZ em x 0 , y 0 , z 0 , são ortonormais e dados por : u =u x ,u y , u z v =v x , v y , v z w =w x , w y , w z M XYZ , X ' Y ' Z ' =R.T onde : [ ux uy uz vx vy vz R= wx wy wz 0 0 0 0 0 0 1 ] [ ] e 1 0 T= 0 0 0 1 0 0 0 −x 0 0 −y 0 1 −z 0 0 1 62 Sistema de Matrizes no OpenGL Matrizes usadas: GL_MODELVIEW, GL_PROJECTION e GL_TEXTURE. Se extensão ARB_imaging é suportada, também é usada a GL_COLOR Para fazer a modelagem (rotação, escalonamento e translação) GL_MODELVIEW Especificada através do comando: glMatrixMode(modo); 63 Empilhamento de Matrizes Permite salvar a matriz atual para uso posterior: Operações realizada na contexto da placa de video Mais eficiente do que transferir da memória para a placa glPushMatrix(); → copia a matriz em uso na pilha glPopMatrix(); → restaura o conteúdo da pilha na matriz atual Descarta o valor que estava na pilha 64 Exemplo glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glTranslatef(posT[0][0], posT[0][1], posT[0][2]); glRotatef(posT[2][0], 1, 0, 0); glRotatef(posT[2][1], 0, 1, 0); glRotatef(posT[2][2], 0, 0, 1); glPushMatrix(); glTranslatef(0, -60*escala, 0); glScalef(escala, escala, escala); glCallList(prism); glPopMatrix(); // descarta o objeto atual glTranslatef(0, 60*escala, 0); glScalef(-escala, -escala, escala); glCallList(prism); glPopMatrix(); 65