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