Ponto V!

Home Matemática e Física Matrizes e Transformações – Parte 2
Vinícius Godoy de Mendonça
Matrizes e Transformações – Parte 2Imprimir
Escrito por Vinícius Godoy de Mendonça

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:

image

Transformação com matriz e vetor

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

Matriz identidade 3x3

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

Transformação linear 2D

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

Transformação linear 2D com 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:

Vetores no sistema homogêneo

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?

Transformação giro de 30º e translação para (50,100)

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.

Rotação seguida de translação

E veja o que acontece quando fazemos o contrário, uma translação de 100 pixels, seguida de uma rotação de 45º.

Translação seguida de rotação

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á!


Comentários (18)
  • Aline Bossi  - Vou ter prova sobre isso!!!! =)
    avatar

    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

  • Vinícius Godoy de Mendonça
    avatar

    Obrigado! :)
    E boa sorte na prova!

  • Marcos Vasconcelos  - Parabéns
    avatar

    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.

  • Juliano  - Matriz Transformação escala e translação
    avatar

    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 1

    ela 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!

  • Vinícius Godoy de Mendonça
    avatar

    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.

  • Bruno Crivelari Sanches
    avatar

    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 :).

  • Vinícius Godoy de Mendonça
    avatar

    Legal. Mas creio que só funcione em matrizes sem escala.

  • Bruno Crivelari Sanches
    avatar

    Para as direções, acredito que se normalizar os vetores vai funcionar.

  • Iraci H. Redivo  - Programa para demosntrar
    avatar

    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

  • Anônimo  - barbara
    avatar

    eu tbm achoo que isso tbm pode funciona em matrizes em multiplicaçoes em divisoes :cheer:

  • Robson Renato
    avatar

    Muiiiiiiiiito bom kara!!!!!!! Estava perdido com tantos x,y e z pela frente e sem ter uma visualização do movimento.
    Muito bom mesmo waleu!!!!!!!

  • jose lucas  - exemplo pratico
    avatar

    ola vinicios, estou começando agora em java e nao entendi muito bem como aplicar esse codigo, vc poderia postar um exemplo pratico desses metodos .

  • ???????????????  - ola
    avatar

    :cheer: adorei cara

  • Anônimo
    avatar

    É impressionante como você dificilmente aprende isso na escola mas quando tem algo pra realmente aplicar tudo começa a fazer sentido em apenas um dia.

    Talvez se as aulas de matemática e física focassem ditadas com muito mais exemplos práticos do que abstratos talvez o medo e a base matemática das pessoas de hoje em dia não seria tão ruim (se assustam com qualquer coisa além de adição e subtração).

  • Fabio  - Duvida Transformacoes
    avatar

    Alguem que posso ajudar a responder a esta pergunta?

    View image

  • Leandro Costa  - Parabéns
    avatar

    Faço Matemática na faculdade e estou impressionado pela tamanha clareza na sua explanação sobre matrizes. O assunto geralmente é enfadonho mas, sua explanação ficou muito interessante!

    Parabéns

  • Anônimo
    avatar

    Muito bom!

  • JOSE ROBERTO MARCAL  - valeu mesmo!!!
    avatar

    cara muito obrigado, me ajudou a esclarecer muita coisa este artigo, principalmente pra prova de robótica...

Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter