Todas as fórmulas rotacionais canônicas usadas para derivar suas matrizes de rotação são para rotação sobre a origem. Se você preferir aplicar essa rotação em torno de um ponto específico, primeiro desloque a origem - ou, equivalentemente, mova o objeto para que o ponto sobre o qual você deseja girar esteja na origem.
Considere o caso 2D primeiro, porque é mais simples e a técnica é dimensionada. Se você tivesse um cubo de largura 2 centrado na origem e desejasse girá-lo 45 graus sobre o centro, isso seria uma aplicação trivial da matriz de rotação 2D .
Mas se você deseja girá-lo em torno do canto superior direito (localizado em 1,1
), primeiro você precisa traduzi-lo para que o canto fique na origem. Isso pode ser conseguido com uma tradução de -1,-1
. Em seguida, você pode girar o objeto como antes, mas você deve segui-lo traduzindo-o de volta (por 1,1
). Portanto, em geral, para obter a matriz de rotação R
para uma rotação de r
cerca de ponto, P
faça o seguinte:
R = translate(-P) * rotate(r) * translate(P)
onde translate
e rotate
são as matrizes canônicas de translação / rotação, respectivamente. Por acaso, isso é dimensionado trivialmente para 3D, que também é a exceção de fornecer um eixo para a rotação - você sempre pode escolher as matrizes canônicas de rotação dos eixos X, Y ou Z, mas isso seria tedioso. Você deseja usar a matriz de rotação eixo-ângulo arbitrária . Sua final R
em 3D é assim:
R = translate(-P) * rotate(a,r) * translate(P)
onde a
é um vetor de unidade que representa o eixo de rotação e P
agora é um ponto 3D no espaço do modelo que representa o ponto de rotação.
Por acaso, os quaternions podem ser convertidos de e para representações matriciais, para que você possa fazer sua concatenação dessa maneira, se assim desejar. Ou você pode simplesmente deixar tudo como matrizes (os quaternions têm algumas vantagens interessantes, como facilitar a interpolação de uma maneira sã, mas se você precisa ou não disso é com você).
Além disso:
Então, eu estou visualizando como girando sobre um vetor cuja cauda não está posicionada na origem local.
A rigor, enquanto vetores podem ser usados para representar posições, considerando-os como deslocamentos de uma origem, os vetores não têm posições em si, portanto, é um pouco incomum visualizá-los como tais.