Post on 20-Oct-2015
Todos nós estudamos matrizes no segundo grau. Entretanto, a maioria de nós faz isso se perguntando
qual é a sua utilidade, e o porquê de tantos cálculos. O que muitos não sabem é que são justamente as
matrizes as grandes responsáveis por todos os gráficos 3D dos jogos atuais. Que tal ler esse artigo e
descobrir o como?
Coordenadas cartesianas
Você deve estar lembrado que sempre que desenhamos coisas usamos para isso um sistema
coordenado, chamado de coordenadas cartesianas. Ele foi inventado por Renatus Cartesius, mais
conhecido no Brasil como René Descartes. Nesse sistema, cada ponto é representado em 2D por um par
de valores, indicando sua linha e sua coluna:
Você pode imaginar que embaixo desse sistema de coordenadas hipotético, está uma folha de papel, ou
mesmo o monitor do seu computador. Tanto faz. O importante é sabermos que, as coordenadas exatas
dos pontos são apenas uma referência, uma convenção.
Por exemplo. Digamos que giraremos a folha de papel em 20o no sentido horário, e então iremos colocá-
la por cima da folha anterior, e redesenhar o carro, exatamente no mesmo local, por cima de sua
“sombra”. Obteríamos a seguinte imagem:
Sem dúvida, não houve qualquer modificação no desenho do carro, ele está exatamente no mesmo local.
Entretanto, no novo sistema de coordenadas, ao ajeitarmos a folha, esse carro pareceria ter girado 20o no
sentido anti-horário, veja:
O que fizemos no final, ajeitar a folha, é um processo chamado de transformação de coordenadas.
Simplesmente pegamos as coordenadas que estavam num sistema (o da folha girada) e as
transformamos elas num outro sistema (o da folha normal).
E o que matrizes têm a ver com tudo isso? Tudo.
Representação matemática do sistema de coordenadas
Considere um sistema de coordenadas qualquer, ainda com duas dimensões, e que sobre ele utilizemos
vários pontos pra traçar uma figura.
Sabemos que o ponto superior direito dessa figura deve ter uma coordenada positiva de grande valor,
como (100,120) ou (10,12) e o seu valor exato não nos importa agora.
A figura por ter sido construída aí, segue uma regra: ela é proporcional a esse sistema. Ou seja, se a
figura tem 5cm de largura e 6cm de altura, e a unidade desse sistema for o milímetro, então, o canto
superior direito dessa figura será (50,60)mm.
Agora, imaginemos os eixos coordenados dessa figura como dois vetores, chamados vetores de base e,
como seu tamanho, atribuiremos o valor um. Novamente, o tamanho os pontos da figura não importam, e
sim o fato deles serem equivalentes de 1:1 com esse nosso eixo:
Vamos escrever cada um desses valores em uma tabelinha?
Ordenadas (x) Abscissas (y)
X 1 0
Y 0 1
Note como os valores, destacados com cores, foram transportados para as colunas da tabelinha. Se
retirarmos os títulos, acabaremos com uma matriz que representa esse nosso sistema de coordenadas.
Se você lembrar-se das suas aulas do segundo grau, se lembrará que esta é a matriz identidade. Ela tem
uma propriedade interessante: qualquer matriz multiplicada pela identidade, não altera seu valor. Ou seja,
é como se essa matriz representasse o número um numa multiplicação. Como sabemos, qualquer coisa
multiplicada por um não altera seu valor.
Procure se lembrar dessa informação. Ela será importante em breve.
Vetores e matrizes
Você deve se lembrar que vetores podem representar pontos. Não se lembra? Então confira rapidamente
nosso artigo sobre vetores.
Por exemplo, o ponto do canto superior direito daquela figura que no exemplo calculamos ser (50,60),
poderia ser representado pelo seguinte vetor:
O que muitos não sabem, é que esse vetor pode ser representado como uma matriz de uma linha, e duas
colunas, como essa aqui:
Ou mesmo como uma matriz de uma única coluna e duas linhas, como essa: Como a notação de
coluna é difícil ocupa muito espaço escrita, podemos usar a notação de linha, através da matriz
transposta: [50 60]T.
Você deve estar se perguntando. E daí? Se você ainda não reparou, uma vez que um vetor é
representado por uma matriz, isso também significa que ele pode ser multiplicado por uma matriz. E essa
multiplicação permite-nos transformar um vetor que está num sistema de coordenadas qualquer, em um
vetor em outro sistema.
Usar linhas ou colunas tem uma implicação importante: Matrizes linhas representam o sistema de
coordenadas da mão esquerda. Nele, as funções de rotação funcionam no sentido horário, e as
transformações ocorrerão na ordem em que são multiplicadas. Na matriz coluna, as rotações ocorrem
em sentido anti-horário, e as transformações ocorrem em ordem inversa da multiplicação. Utilizaremos
nessa série de artigos as matrizes colunas, pois são padrão em muitas APIs e livros de computação
gráfica, por serem adotadas na OpenGL.
Já as matrizes linha são comumente usadas no DirectX, não é à toa que estão presentes em nossos
artigos de XNA e shaders.
Multiplicação de matrizes
Antes de continuarmos, vamos lembrar como se dá a multiplicação de matrizes. Ao multiplicar duas
matrizes A e B, calculamos cada elemento Cij (onde i é a linha e j a coluna) usando de um processo
simples:
Na matriz A, pegamos os elementos da linha i, que queremos calcular;
Na matriz B, pegamos os elementos da coluna j, que queremos calcular;
Então, multiplicamos esses elementos entre si, e somamos os seus produtos. Note que para que essa
multiplicação seja possível, o número de colunas de A, deve ser exatamente igual ao número de linhas de
B.
Ainda perdido? Veja abaixo como calculamos o elemento c24:
Se você como eu sempre se perde nesses cálculos. Eis uma forma mais gráfica de representar: desenhe
a matriz C, e sobre ela a matriz B e a sua esquerda a matriz A. Os elementos usados para calcular um
valor em C estarão na mesma linha em A, e na mesma coluna em B, observe:
Agora que revisamos, vamos voltar ao tema.
Transformações lineares
Escala
Podemos usar matrizes para representar outros eixos coordenados, diferentes do eixo de base. Basta,
para isso, imaginarmos como esse eixo seria.
Por exemplo, vamos supor que queiramos ampliar uma imagem em duas vezes. Isso significa que
queremos que seu eixo de base seja duas vezes maior que nosso próprio eixo, certo?
Portanto, usando as proporções do segundo eixo como uma matriz, teríamos:
Com essa matriz, podemos transformar qualquer ponto do sistema de base, num ponto do sistema
escalado. Para isso, a matriz de escala e multiplicar pelo vetor que queremos ampliar. Tomemos como
exemplo o nosso vetor [50 60], citado anteriormente:
Não surpreendentemente, os pontos dobraram de valor. Para ampliar uma figura inteira, multiplicaríamos
o vetor que representa cada um de seus pontos. Se você está achando que é muito trabalho para pouco
resultado, continue lendo o artigo.
Rotação
Alterar o tamanho não é a única coisa que podemos fazer com transformações lineares. O que
aconteceria se no lugar da matriz usássemos a matriz ?
Veja um eixo sobre o outro:
Note que agora não só alteramos o tamanho da imagem, como também alteramos a inclinação dos eixos.
Como conseqüência, a transformação final também será inclinada (nesse caso, em 26o).
Se lembrarmos da formula sobre como criar um vetor baseado num ângulo, poderemos facilmente chegar
a uma matriz, que faz uma rotação qualquer. Se você não se lembra, criamos um vetor de tamanho t,
baseado num ângulo α com a função:
?
1
2
3
4
5
6
Vector2D Vector2D::bySizeAndAngle(float size, float angle)
{
return Vector2D(
cos(angle) * size,
sin(angle) * size);
}
Ou seja, equivalente à formula:
Se na hora de montar nosso novo sistema coordenado esse for o vetor de um dos eixos, então, seu vetor
perpendicular a ele, será o vetor do outro eixo. Há uma regra simples para achar um vetor perpendicular.
Basta inverter a posição dos dois valores, e o sinal do de um deles. Por exemplo, se o vetor em questão é
(x,y) seu perpendicular será (-y, x).
Dessa forma, como queremos alterar apenas o ângulo, teremos t = 1, e formamos seguinte sistema em
azul, sobre nosso sistema base, em cinza:
E com isso, podemos deduzir a matriz de rotação genérica, que é:
Repare bem que a primeira linha dessa matriz é exatamente a fórmula do método
Vector2D::bySizeAndAngle. E note que a segunda, nada mais é que seu vetor perpendicular.
Assim, se tivermos um vetor (x,y) qualquer, sua rotação será definida por:
A fórmula acima te causa arrepios? Dê uma olhada no método rotate da classe Vector2D. Reconhece
essa fórmula?
?
1
2
3
4
5
6
7
8
9
10
11
12
13
Vector2D& Vector2D::rotate(float angle)
{
float s = sin(angle);
float c = cos(angle);
float newX = x * c - y * s;
float newY = x * s + y * c;
x = newX;
y = newY;
return *this;
}
Transformações combinadas
Um detalhe interessante. Você pode ter notado que ambas as matrizes de transformação podem ser
multiplicadas umas pelas outras. Porém, essa operação faria sentido? O que ocorreria se
multiplicássemos uma matriz por outra?
A resposta é que obteríamos uma terceira matriz que realiza as duas operações ao mesmo tempo.
Se isso não parece muito interessante, vamos calcular um pouco. Suponha que você tenha uma figura
formada por 2000 pontos. Se você aplicar individualmente a rotação e a escala, terá feito 4000 operações
(2000 rotações e 2000 escalas). Porém, se você primeiro multiplicar as matrizes, fará ao final apenas
2001 operações: a primeira será a multiplicação da matriz de rotação R, pela matriz de escala E, obtendo
a matriz composta C. E em seguida, 2000 multiplicações dos vetores dos pontos por C.
Ou seja, você pode ter dezenas de transformações, que elas impactarão muito pouco no tempo total de
cálculo.
Um detalhe importante: Lembre-se que a multiplicação de matrizes não é comutativa. Portanto, a ordem
que a multiplicação dessas matrizes ocorre afeta o resultado. Veremos exemplos disso no próximo artigo.
Concluindo
Nesse artigo, vimos que matrizes representam um papel importante na computação gráfica. Elas são
usadas para transformar coordenadas de um sistema qualquer em outro. No artigo, vimos às
transformações lineares, que são capazes de fazer rotação e escala em qualquer eixo.
Vimos também que matrizes graficamente podem representar um sistema de coordenadas, proporcional
a outro sistema qualquer, chamado de sistema base. E, principalmente, vimos como entender essas
matrizes de maneira gráfica.
No próximo artigo, abordaremos também as transformações afins (AffineTransforms), que acrescentam a
operação de afastamento (translação).
Matriz de rotação
Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Rotação e pseudorrotação de um vetor no espaço bidimensional. A rotação preserva a norma
(comprimento) do vetor, a pseudorrotação não. A rotação é representada por uma matriz
unitária, a matriz de rotação. Uma pseudorrotação é representada por uma matriz não
unitária.
Interpretação da matriz de rotação como determinante de uma mudança de referencial. Na
figura o vetor (preto, ao centro) tem coordenadas distintas no sistema XY (vermelho) e no
sistema X'Y' (preto) - que diverge do sistema inicial por um ângulo . Conhecido , a
matriz (ver texto) permite o cálculo de .
Uma matriz de rotação é uma matriz quadrada que, quando aplicada sobre a
representação matemática de vetor - a matriz coluna - tem o efeito de mudar a direção
do vetor por ela representado mas não a sua magnitude; fazendo-o assim fisicamente
revolver em torno de um eixo de rotação definido pelos elementos da matriz; por um
valor angular também por eles especificado. O resultado da operação é uma segunda
matriz coluna que encerra as coordenadas do vetor resultante da rotação Ref. 1 .
Matrizes de rotação são unitárias e não alteram a norma do vetor. Se uma matriz não
estiver contudo normalizada, essa pode, além de rotacionar o vetor, também afetar seu
módulo. Embora essa matrizes também impliquem rotações (ou melhor,
pseudorrotações), o uso de matrizes não normalizadas a fim de representar rotações
puras é contudo coibido ao exigir-se a unitariedade da matriz de rotação.
A rotação de um vetor implica na modificação de suas projeções sobre os eixos
coordenados, e conforme apresentada dá-se em um sistema de coordenadas específico e
único (figura à esquerda). A situação física associada pode contudo ser igualmente
compreendida não dessa forma; mas sim como uma mudança de referencial estabelecida
entre dois sistemas de coordenadas com origens comuns, mas que tenham seus eixos
coordenados não coincidentes; via diferenças providas por uma rotação em torno do
mesmo eixo de rotação, e pelo mesmo valor angular, antes associados à rotação do
vetor. A rotação do eixos coordenados é feita contudo em sentido contrário ao sentido
de rotação do vetor na primeira interpretação. Nesse segundo cenário (figura acima, à
direita) o vetor permanece imóvel no espaço, e o sistema de coordenadas é que gira Ref. 1
.
Frente à ultima interpretação, a matriz de rotação é entendida como uma matriz de
mudança de referencial entre dois referenciais ortonormais que, embora não transladem
entre si, giram um em relação ao outro.
O uso de uma ou outra interpretação é facultativo, sendo para todos os efeitos
equivalentes.
Índice
[esconder]
1 Considerações iniciais 2 Propriedades 3 Duas dimensões 4 Três dimensões 5 Ver também 6 Notas 7 Referências 8 Ligações externas
Considerações iniciais[editar]
Imagem de um crânio em rotação (clique sobre a figura). Em vermelho, a mandíbula. Imagens
como essas são produzidas em programas que implementam matrizes de rotação em seus
algoritmos.
As matrizes de rotação buscam em princípio representar, em linguagem matemática,
operações físicas reais associadas às rotações de objetos, geralmente extensos e sólidos,
em um dado espaço dimensional, geralmente o espaço tridimensional.
Assumindo-se, em uma visão ativa, um objeto tridimensional em rotação conforme
observado a partir de um referencial fixo, inercial, com origem e sistema de
coordenados definidos segundo um sistema cartesiano dextrogiro ortonormal, todas as
possíveis rotações pelo corpo fisicamente implementáveis integram o que se designa
normalmente por rotações próprias. Qualquer rotação própria é factualmente
implementável pelo objeto em questão.
Matematicamente é possível, contudo, implementar-se uma "visão especular" de tais
rotações, propriamente falando uma inversão; o que fisicamente consistiria em algo
parecido a, partindo-se do objeto real, implementar-se uma operação de rotação própria,
impondo-se agora contudo que o observador visualize a configuração final do objeto
não diretamente mas sim através de um espelho, fazendo-o de forma a situar os reais
pontos em observação sempre às suas costas. Todas as coordenadas de um dado ponto
em observação aparecem, assim, invertidas (com sinais negativos justapostos) na
situação final; sendo qualquer ponto visualizado 180o aquém de sua real posição em
relação a origem.
Uma operação de rotação seguida de inversão não é fisicamente implementável pelo
objeto em virtude da quebra de quiralidade diretamente envolvida na transformação de
inversão. A mão direita nunca pode ser na prática rotacionada - seja qual for a rotação
fisicamente implementável pensada - de forma a sobrepor-se precisamente à mão
esquerda, pois essa corresponde à sua reflexão especular.
Rotações seguidas de inversão são conhecidas como rotações impróprias; e não são
fisicamente implementáveis mediante rotações do objeto apenas. Matrizes que
representam rotações impróprias são facilmente identificáveis pois implicam, no sistema
de coordenadas dextrogiro previamente estabelecido, matrizes com determinantes cujos
sinais são sempre o negativo (-1) das matrizes que representam as rotações próprias
(+1).
Rotações impróprias são também descritas por matrizes que, por muitos autores, são
também chamadas matrizes de rotação. Contudo a expressão "matriz de rotação"
implica, para a maioria dos autores, apenas as matrizes que representam rotações
próprias; e nesses termos é que se define, aparte exceções explícitas, uma matriz de
rotacão nesse artigo.
Matrizes de rotação encontram enorme aplicação na Física, fazendo-se sempre presentes
na descrição da dinâmica de corpos extensos, da matéria e mesmo da energia; em
engenharia; em química, e em qualquer área onde a representação de algum objeto
físico se faça necessária. Desempenha importante papel também na área de informática,
sobretudo na elaboracão de programas conhecidos genericamente pelas siglas CADs,
CNCs, e outros. Particularmente na área de multimédia o uso das matrizes de rotação
faz-se de extrema importância, sendo nesse caso também muito úteis as matrizes que
representam rotação impróprias. Certamente os que possuem em seu computador uma
placa de tv já viram, entre as opções de configuração do programa de controle, a opção
"espelhar imagem"; que permite, com um clicar de botão, a inversão da imagem gerada
na tela do monitor.
Propriedades[editar]
Projeção no espaço tridimensional de uma rotação simples de um objeto no espaço
quadridimensional. A dimensionalidade de uma matriz de rotação não precisa,
matematicamente, ater-se às três dimensões espaciais conhecidas.
Em se tratando de rotações próprias no espaço tridimensional, verifica-se que:
é uma matriz de rotação se e somente se for ortonormal.
é ortonormal se o conjunto de seus vetores-coluna (e por tal o conjunto de seus
autovetores) formar uma base ortonormal de ; ou seja, se os produtos escalares
entre os vetores-coluna da matriz, tomados dois a dois, resultarem todos em zero
(ortogonalidade); e o produto escalar de qualquer dos vetores-coluna com ele mesmo for
unitário (normalização).
Como se trabalha no espaço dos reais, os elementos da matriz de rotação são também reais.
A matriz que representa uma sequência de rotações iguala-se ao produto das matrizes que representam as sucessivas etapas, na ordem adequada; e é também uma matriz de rotação (Teorema de Euler). Uma rotação "A" posteriormente seguida por uma rotação "B" implica:
Rotações finitas não são comutativas, e assim também não o é o produto de matrizes de rotação:
A inversa da matriz de rotação é sua transposta:
; onde é a matriz identidade Ref. 1 .
O traço de uma matriz de rotação é função do ângulo de rotação a ela associado, e iguala-se à soma de seus autovalores.
No espaço tridimensional:
Ref. 1
No espaço bidimensional:
O determinante de uma matriz de rotação é igual à unidade:
As operacões representadas pelas matrizes de rotação permitem associá-las a um grupo de simetrias, o grupo de simetrias SO(n), n correspondendo à dimensão; SO(3) no caso tridimensional. Admitida a inclusão das matrizes que representam rotações impróprias (determinante = -1), tal grupo de matrizes formam uma representação do grupo de simetrias O(3). O "S" no primeiro grupo, SO(n), representa pois uma parte especial (do inglês "special") - um "subgrupo" - do grupo O(n).
Duas dimensões[editar]
Em duas dimensões, a rotação pode ser definida por um único ângulo, . Por
convenção, ângulos positivos representam rotação dos vetores no sentido horário, ou
dos eixos coordenados no sentido anti-horário Ref. 2 Ref. 1 Nota 1 . O eixo de rotação nesse
caso (o eixo Z) reside fora do espaço em consideração.
A matriz para rotacionar um vetor coluna em coordenadas cartesianas
sobre a origem a fim de se obter (ver figura) é:
Ref. 2 Ref. 1
de forma que:
Três dimensões[editar]
As matrizes de rotação são importantes no estudo da dinâmica de corpos rígidos extensos.
Em três dimensões, uma rotação pode ser univocamente definida por três ângulos,
sendo geralmente utilizados os três ângulos de Euler, . De forma alternativa e
equivalente, em acordo com o Teorema de Euler, uma rotação pode também ser
definida por um único ângulo de rotação em torno de um eixo de rotação especificado
por um vetor unitário, , vetor que, além do eixo, também especifica, mediante a
regra da mão direita e a convencão de sinais para os ângulos aqui adotada, o sentido da
rotação dos eixos coordenados Nota 1 .
Se a representação der-se mediante os ângulos de Euler na convenção X - que implica
três rotações sucessivas; a primeira em torno do eixo Z do sistema de corrdendas inicial
(ângulo ); a segunda em torno do eixo X' do sistema resultante da rotação anterior
(ângulo ) - eixo esse que define a chamada linha de nodo; e a terceira em torno do
eixo Z'" do sistema definido após a segunda rotação (ângulo ) - a matriz que permite
determinar o vetor coluna resultante, em coordenadas cartesianas, escreve-se como o
produto das três matrizes individuais que representam, cada qual, uma das rotações
citadas. Em termos matemáticos, , onde:
; ;
.
A matriz completa, resultante da multiplicação das anteriores na ordem apresentada Nota
2 , é Ref. 1 :
Em termos do vetor unitário que define o eixo de rotação no sistema
de coordenadas inicial, a matriz que expressa uma rotação do sistema de coordenadas
em torno desse vetor em sentido condizente com a regra da mão direita (ou do vetor em
sentido contrário), escreve-se como:
[carece de fontes?]
Na matriz acima, a fim de garantir-se as unitariedades do vetor e da matriz
, deve-se sempre ter, obrigatoriamente:
Comparando-se as duas representações anteriores, pode mostrar-se que as três rotações
sucessivas implicadas pelos ângulos de Euler correspondem, ao fim, a uma única
rotação por um ângulo em torno de um único e adequado eixo de rotação tal
que:
Ref. 1
ou, de forma mais explicita:
devendo-se nesse caso escolher o arco entre as possíveis soluções adequado à situação
física em consideração.