Eu tenho alguns modelos que eu quero girar usando quaternions da maneira normal, exceto que em vez de rotação sobre a origem, eu quero que ele seja ligeiramente deslocado. Eu sei que você não diz, no espaço 3D, que gira em torno de um ponto; você diz que gira em torno de um eixo. Então, eu estou visualizando como girando sobre um vetor cuja cauda não está posicionada na origem local.
Todas as transformações afins no meu mecanismo de renderização / física são armazenadas usando SQT (escala, quaternário, tradução; uma idéia emprestada do livro Game Engine Architecture ). Então, construo uma matriz de cada quadro desses componentes e passo-a para o vertex shader. Nesse sistema, a tradução é aplicada, depois a escala e a rotação.
Em um caso específico, preciso converter um objeto no espaço do mundo, dimensioná-lo e girá-lo sobre um vértice não centralizado na origem local do objeto.
Pergunta: Dadas as restrições do meu sistema atual descrito acima, como posso obter uma rotação local centrada em um ponto diferente da origem? Voto automático para quem pode descrever como fazer isso usando apenas matrizes também :)
fonte
Respostas:
Em resumo
Você só precisa alterar T no seu formulário SQT.
Substitua o vetor de conversão
v
porv' = v-invscale(p-invrotate(p))
ondev
está o vetor de conversão inicial,p
é o ponto em torno do qual você deseja que a rotação ocorrainvrotate
einvscale
são as inversas de sua rotação e escala.Demonstração rápida
Seja
p
o ponto em torno do qual você aplica a rotaçãor
. Lets
Ser seus parâmetros de escala ev
seu vetor de tradução. A transformação final da matriz é emT(p)R(r)T(-p)S(s)T(v)
vez deR(r)S(s)T(v)
.O que você deseja são novos parâmetros de transformação
v'
,r'
es'
tal que a transformação final da matriz sejaR(r')S(s')T(v')
e tenhamos:O comportamento no infinito indica que os parâmetros de rotação e os parâmetros de escala não podem mudar (isso pode ser demonstrado). Temos assim
r = r'
es = s'
. O único parâmetro que falta év'
, portanto , seu novo vetor de tradução:Se essas matrizes são iguais, seus inversos são iguais:
Isso vale especialmente para a origem
O
:Escalar e girar a origem produz a origem, e obtemos:
v'
é o novo vetor de tradução que você está procurando e permite armazenar sua transformação no formato SQT. Provavelmente é possível simplificar o cálculo; mas pelo menos o armazenamento necessário não é aumentado.fonte
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 (por1,1
). Portanto, em geral, para obter a matriz de rotaçãoR
para uma rotação der
cerca de ponto,P
faça o seguinte:onde
translate
erotate
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 finalR
em 3D é assim:onde
a
é um vetor de unidade que representa o eixo de rotação eP
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:
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.
fonte