Rotação em 2D

Par chegar mais perto da meta de escrever um sistema de animação de ossos em duas dimensões, vai ser necessário rotacionar partes do corpo ao redor de um ponto.

A rotação em 2D é muito mais simples que em 3D. A redução da complexidade torna fácil explicar o processo, e por isso vou deixar para outra oportunidade as explicações de como fazer o mesmo em um ambiente de três dimensões.

Se você não sabe como funcionam matrizes, provavelmente não chegou ainda ao terceiro ano do ensino médio. Eu recomendo que dê uma olhada nos livros que tratem desse assunto para entender o significado do que escrevo nas próximas linhas.

A matriz de rotação em duas dimensões é

\(Rot(\theta)=\left(\begin{array}{ccc} cos \theta & -sin \theta \\ sin \theta & cos \theta \end{array}\right)\)

 

A função abaixo traduz essa conta para Perl. A função rotaciona um vetor posicionado na origem do plano (0, 0).

Isso é só a implementação da multiplicação de uma matriz de rotação por um vetor. No entanto, é possível generalizá-la, adicionando um outro vetor que indica em relação a que ponto do plano a rotação vai acontecer. Então podemos reescrevê-la passando um parâmetro que indica a posição do vetor de origem:

É simples testar. Aplicando rotações de noventa graus em vetores alinhados aos eixos, os resultados devem ser vetores alinhados aos eixos perpendiculares.

Se a variável $r for igual a [1, 2], a rotina estará correta.

Agora é possível movimentar partes do corpo de uma personagem. A ideia é bem simples. Tudo o que é necessário é determinar a posição de origem e orientação do desenho de cada membro do corpo. É disso que vou tratar no próximo artigo.

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">