|
No artigo anterior, vimos como representar transformações lineares através de matrizes. Com elas, poderíamos girar ou mudar a escala de nosso eixo cartesiano. Nesse artigo, veremos como representar também deslocamentos, e entenderemos o que são as transformações afins e o sistema de coordenadas homogêneo.
Representando deslocamentos
Além da rotação e da escala, uma terceira operação é muitíssimo comum na computação gráfica: o deslocamento, também conhecido como translação (translation). Não confunda com o movimento de translação aprendido nas aulas de astronomia, que representa girar um corpo celeste em torno de outro – a translação, na computação gráfica, representa o deslocamento de um objeto em relação a uma linha reta.
Entretanto, como representar translações através de transformações lineares? Vimos no artigo passado que elas distorcem os eixos, mas, sempre em torno de seu centro original. O que fazer quando precisamos deslocar o eixo cartesiano além desse centro?
A alternativa óbvia, seria criar duas variáveis deslocX e deslocY e soma-las sempre que desenharmos uma coordenada. Essas duas variáveis também poderiam ser criadas na forma de um vetor. Portanto, se quiséssemos representar nossa vaquinha rotacionada em 30º e afastada 50 pixels para direita e 100 para cima teríamos:
![]()
Embora aparentemente essa abordagem resolva nosso problema, ela introduz alguns inconvenientes:
a) No artigo anterior, vimos que era possível acumular matrizes multiplicando-as. Isso é, uma matriz de rotação multiplicada pela de escala, resultava numa matriz que fazia ao mesmo tempo a rotação e a escala. Essa multiplicação não é mais possível usando essa abordagem. E isso significa que, se tivermos várias transformações seguidas, teremos que guardar a lista de todos os vetores e matrizes usados no processo e aplica-la ponto-por-ponto em nossa imagem.
b) A translação, por ser uma operação independente, não respeita as transformações que já ocorreram antes dela. Poderíamos fazer respeitar se também aplicássemos as transformações ao vetor de translação antes de o somarmos.
c) Calcular uma operação inversa não se restringe mais a inverter a matriz. Teremos que negar também todos os vetores.
Sistema de coordenadas homogêneo ao resgate
Certamente, as desvantagens apresentadas anteriormente representam um transtorno. Por isso, passamos a usar um novo mecanismo matemático chamado sistema de coordenadas homogêneo para criar matrizes que representem ao mesmo tempo rotação, escala e translações.
No sistema homogêneo, utilizaremos uma dimensão extra em nossa matriz de transformação, ou seja, uma matriz 3x3 para representar transformações 2D, e uma matriz 4x4 para representar uma transformação 3D. Vemos como montar nossa matriz no sistema homogêneo para representar a mesma transformação proposta acima:
a) Comece com a matriz identidade

b) No canto superior esquerdo insira sua transformação linear de escala ou rotação.

c) No canto superior direito insira seu vetor de translação:

Pronto! Acabamos de criar o que chamaremos de transformação afim.
Se você é bom em matrizes, um alerta já deve ter disparado em sua cabeça. Como multiplicar agora os vetores que representam os pontos da figura se existe uma dimensão a mais na matriz de transformação? Afinal, não é possível multiplicar um vetor 1x2 por uma matriz 3x3.
Vetores no sistema homogêneo
Como vimos no artigo sobre vetores, podemos usá-los para representar duas entidades bastante diferentes:
- Pontos: Que são locais no espaço.
- Direções: Geralmente representadas por vetores unitários.
Um detalhe importante é que geralmente queremos aplicar as transformações de escala apenas sobre os pontos, não sobre as direções. Portanto, cada vetor terá uma representação diferente na coordenada homogênea, de acordo com o que estiver representando:

A terceira coordenada representa um fator inverso de escala do vetor, geralmente chamado de w. Ou seja, todas as outras coordenadas serão divididas por esse valor, antes do desenho ser realizado. Uma escala igual à zero indica que o vetor aponta para o infinito e, portanto, não nos interessa exatamente o local para onde aponta, apenas sua direção. Esse fator de escala também está em nossa matriz de transformação. É o elemento do canto inferior direito da matriz.
Como normalmente fornecemos dados em nossa própria escala, dificilmente teremos que fornecer um valor diferente de um ou zero. Vamos reescrever então nossa fórmula, usando o sistema homogêneo?

Problema resolvido? Sim. Porém, não podemos deixar passar em branco um detalhe importante. A operação de translação não é comutativa, isto é, durante uma multiplicação, a ordem em que ela feita importa.
Comutatividade das transformações
Quando multiplicamos transformações, devemos sempre nos lembrar que não estamos mexendo em pontos de objetos, e sim, em eixos coordenados. Uma operação de translação afasta um eixo numa linha reta traçada sobre eixo atual. Uma operação de rotação gira esse eixo em alguns graus. E uma operação de escala, aumenta a distância entre os pontos do eixo.
É fácil perceber que a operação de translação não é comutativa. Vejamos um exemplo: abaixo, a vaquinha está desenhada sobre o centro de seu eixo coordenado. Esse eixo será transformado. Deixamos uma sombra, mostrando a posição original da vaca e traçamos uma linha a cada 50 pixels em nosso monitor. Considere uma rotação de 45o seguida de uma translação de 100 pixels em x.
E veja o que acontece quando fazemos o contrário, uma translação de 100 pixels, seguida de uma rotação de 45º.
Perceba que no primeiro caso, a rotação deixou o eixo da vaquinha inclinado em 45º e, quando a translação foi feita, o deslocamento ocorreu sobre essa inclinação. Já no segundo, a translação ocorreu primeiro num eixo não inclinado.
O mesmo ocorreria caso a uma operação de escala fosse feita antes de uma translação. A translação sobre um eixo escalado seguiria as distâncias desse novo eixo. Então, um eixo que tenha 2x o tamanho original irá deslocar 200 pixels a vaca, numa operação de translação de 100 unidades em x.
Embora possa parecer estranho, essa propriedade é extremamente desejável. Ela permite que um grupo de transformações usado para desenhar uma imagem possa ser redimensionado ou transladado de uma só vez, mantendo sua proporção e distâncias originais. Veremos mais detalhes sobre isso no artigo sobre grafos de cena.
Uma última observação: o sistema coordenado que estamos usando é o da mão direita (matrizes coluna). Nele, imaginamos quais transformações iremos fazer e então multiplicamos as matrizes na ordem inversa. Se você veio parar nesse artigo por causa dos tutoriais de shaders em xna, lembre-se que lá o sistema de coordenadas é o da mão direita, portanto, as matrizes são escritas de maneira transposta (cada coluna vira uma linha), e as transformações são processadas em sua ordem normal (você pode ver mais detalhes sobre isso aqui e aqui, em inglês).
Finalizando
Nesse artigo, vimos como criar transformações afins, capazes de representar as três operações básicas de transformações: rotação, translação e escala.
No próximo artigo, falaremos um pouco mais sobre outros tipos de transformação bidimensionais e tridimensionais.
Finalmente, terminaremos a série explicando sobre como organizar o desenho num grafo de cena. Até lá!
-
08/06/2011 12:58:21 |189.59.222.xxx| Marcos Vasconcelos - Parabéns

Muito legal, interessante saber sobre o sistema de coordenadas homogeneos, assim ainda é possivel manter a otimização de utilizar apenas um vetor de transformação para toda a cena.
-
24/11/2011 23:47:47 |187.5.57.xxx| Juliano - Matriz Transformação escala e translação

Muito bom! Tenho uma dúvida bem básica tenho uma matriz de escala e translacão
2 0 30
0 2 20
0 0 1ela me retorna um vetor com 3 valores certo? o primeiro e o segundo são as novas dimensoes de largura e altura e o terceiro seria o deslocamento? mas esse deslocamento eh dado como? ele me retorna um unico ponto?
Obrigado pelo artigo, tem me ajudado bastante em GA na faculdade!
-
25/11/2011 10:34:44 | Vinícius Godoy de Mendonça

Olá.
A matriz sozinha não retorna nada. Ela é usada para transformar vetores: para isso, você vai multiplicar essa matriz com um vetor.
Seu vetor pode ser, por exemplo, uma posição.
Vamos supor que seja a posição [10,20]. Portanto, como é uma posição, sua conversão para o sistema homogêneo seria [10,20,1].
Essa matriz que vc colocou desloca o vetor em [30,20], conforme podemos observar na última coluna. Ou seja, ele vai para [10,20] + [30,20] = [40,40].
E em seguida, sua diagonal principal indica que o vetor dobra seu tamanho. Como resultado, você termina com o vetor [40,40] x 2 = [80,80].
Se você fizer a multiplicação com as matrizes, vai ver que a última coordenada não muda. O resultado será o vetor [80,80,1].
É importante perceber que ele só fez as operações que você pediu: alterou o tamanho e deslocou o vetor posição.
-
25/11/2011 10:38:23 | Bruno Crivelari Sanches

Vini, eu costumo usar muito para 3d e acho que se aplica para 2d.
Se usarmos apenas a matriz para representar o objeto ou nos cálculos, podemos extrair dela:
- duas primeiras linhas da ultima coluna: posição do objeto
- primeira coluna (menos ultima linha): vetor com a direção para andar para frente
- segunda coluna (menos ultima linha): vetor com a direção para andar de lado (strafe)Os dois últimos itens posso ter invertido
.
-
25/11/2011 11:15:46 | Vinícius Godoy de Mendonça

Legal. Mas creio que só funcione em matrizes sem escala.
-
25/11/2011 11:31:20 | Bruno Crivelari Sanches

Para as direções, acredito que se normalizar os vetores vai funcionar.
-
25/04/2012 11:07:50 |201.95.49.xxx| Iraci H. Redivo - Programa para demosntrar

Ola Vinicius!
Gostei muito do seu artigo e estou pensando em trabalhar esses topicos com meus alunos do Ensino Médio na sala de informática, você teria alguma recomendação sobre o programa que pode ser usado?
Por exemplo, Geogebra, Regua e Compasso. É possivel fazer essas demonstrações com o Excel?
Obrigada











Parabéns pelo artigo, para mim, ler seu post hoje é a prova de que a Matemática para computação gráfica, que estou estudando pra caramba e terei prova amanhã, vale de alguma coisa!!!
As imagens ajudaram muito a esclarecer a teoria, parabéns!!!
[]s