Place to do random C.G. things and hopefully make tutorials out of them.
Rotacionar objetos pode parecer trivial, mas obter um resultado intuitivo não é.
A rotação de objetos deve ter algum ponto de referência e além disso deve possuir uma orientação espacial para saber os eixos possíveis de rotação.
Essa é uma transformação um tanto quanto complicada. Ele requer que olhemos para a câmera do ponto de vista do sistema de coordenadas centrado no objeto, mas com os mesmos eixos de orientação espacial da câmera e não do objeto.
Primeiramente obtenho o objeto em coordenadas de câmera. Temos o objeto em coordenadas de mundo $o_w$, e temos a matriz inversa da câmera $C^{-1}$, então podemos obter $o_c$:
Agora podemos criar uma matriz de translação, que leva do objeto para a câmera dentro do sistema de coordenadas da câmera. Basta definir a última coluna da identidade com o vetor posição do objeto $o_c$:
Temos que usar a inversa dela para levar a câmera até o objeto. Aplicar a operação de rotação $R$ e depois voltar com a câmera para o lugar aplicando a transformação que leva o objeto para a câmera:
O que temos agora é a nova câmera rotacionada em torno do objeto, no sistema de coordenadas da câmera antiga.
Acontece que a matriz da câmera, é uma que leva do sistema da câmera para o sistema do mundo, que é exatamente a matriz $N$ transformada do sistema de câmera para o de mundo:
Agora que temos uma fórmula para rotacionar a câmera em torno do objeto central, basta generalizar para outros objetos além da câmera.
Qualquer objeto que assim como a câmera tenha um sistema de coordenadas que o orienta no sistema de mundo, além de ter uma posição, pode ser rotacionado em torno de qualquer ponto. Basta trocas as variáveis anteriormente explicadas.
Com isso criei o método object_relative_movement
,
que aceita os seguintes parâmetros:
Eu usei algumas texturas que não são minhas nestes exemplos. Aqui estão algumas informações sobre como econtrá-las.
Pesquisas no Google por imagens:
Sites com images para testes de mapeamento de texturas: