Quaternions e rotação ao redor do eixo mundial

11

Disclaimer: Eu sou um programador profissional de jogos, e uso quaternions na maioria dos dias, mas eles estão perto de magia negra para mim. Estou relativamente à vontade com a matemática, mas os números imaginários sempre me confundem. Costumo tratar quats como útil e acabo revertendo multiplicações mais de uma vez. Tento argumentar sobre eles como faria com matrizes com sucesso limitado.

De qualquer forma ....

O que me deixa perplexo é o seguinte. Quando quero girar um objeto em torno de seu eixo local, multiplico sua rotação pelo quaternion que representa a rotação que quero aplicar. É, portanto, uma rotação no espaço local.

Agora, se eu quiser girá-lo em torno de um eixo no espaço mundial, meu raciocínio seria: Faça a rotação no espaço mundial como um quaternion. Multiplique o inverso da minha rotação de objetos com este quaternion. Isso trará a rotação do meu mundo no espaço local. Multiplique minha rotação com este novo quaternion. ie: newRot = oldRot * (inverso oldRot * worldRot)

No entanto, o que eu preciso fazer é newRot = oldRot * (inverso oldRot * worldRot) * oldRot.

Por que, depois de multiplicar com o quat inverso, ainda preciso multiplicar com o meu próprio quat antes de aplicá-lo? Eu sei que deve haver uma razão válida perfeita, mas não consigo pensar em como sair dela e isso é frustrante para mim. Eu tentei as várias perguntas frequentes e outros enfeites, mas a maioria vai fundo na matemática, deixando menos claro para mim.

Alguém que possa me explicar isso como se eu tivesse 5 anos?

Kaj
fonte
Não é um pouco como traduções e roatations de matriz (ou seja, você precisa mover seu objeto para o centro, girar e depois voltar quando quiser girar um item ao seu redor: Minv_transl * Mrot * Mtransl)
Valmond
I try to reason about them like I would with matrices- então você está no caminho certo. Se você entendeu como girar em torno dos eixos dos objetos e dos eixos do mundo usando matrizes, pode fazer o mesmo usando quaternions. A ordem de multiplicação é a mesma para matrizes e quaterniões.
Maik Semder

Respostas:

11

Quaternions são associativos:

você menciona que sua solução é:

newRot = oldRot * (inverse oldRot * worldRot) * oldRot

que é o mesmo que:

newRot = oldRot * inverse oldRot * worldRot * oldRot

que é o mesmo que:

newRot = identity * worldRot * oldRot
newRot = worldRot * oldRot

o que realmente o leva de volta ao que realmente está acontecendo:

localTransformed = oldRot * rot
worldTransformed = rot * oldRot

A ordem de aplicação está mudando, isso é tudo. Voltando às matrizes, quando você aplica uma matriz de objetos a uma matriz de transformação e armazena isso como sua nova matriz de objetos, essa é a transformação do espaço local. Quando você aplica a matriz de transformação à matriz de objetos e armazena isso, é a transformação do mundo. É tudo sobre a ordem de aplicação e nada mais.

Richard Fabian
fonte
1
+1 na primeira parte, a segunda parte é um pouco enganadora. Se você usar apenas 'rot' no último exemplo de código, em vez de 'localRot' e 'worldRot', o exemplo ficará mais claro. Caso contrário, isso implica que os apodrecimentos são de alguma maneira diferentes . Mas a diferença está apenas na ordem de multiplicação, como você mostrou, em vez de em diferentes quaternions ('localRot' e 'worldRot'). 'localTransformed' e 'worldTransformed' seriam melhores como: 'rotatedAroundLocalAxis' e 'rotatedAroundWorldAxis'. Isso por si só explicaria as equações e tornaria obsoleto o último parágrafo, o que tem algumas falhas.
Maik Semder
Falhas no último parágrafo: a distinção entre matriz e transformação (ambas são iguais aqui e intercambiáveis, portanto, é melhor usar apenas matriz para evitar confusão) e os termos "transformação do espaço local" e "transformação do mundo": seria mais correto dizer, a primeira equação fornece a 'matriz local para o mundo' depois de ser girada em torno do eixo local do objeto, a segunda equação fornece a 'matriz local para o mundo' depois de ser girada em torno do eixo do mundo. Nos dois casos, o que você recebe é simplesmente a 'matriz local para o mundo'. No entanto, a primeira parte tem meu +1 de qualquer maneira para a análise.
Maik Semder
+1 @Maik talvez você possa escrever uma resposta separada para tornar a indiferença entre rotações e a questão da ordem de multiplicação ainda mais clara? Obrigado pelo comentário de qualquer maneira!
Max Dohme
Ah, agora faz sentido. Eu não sabia (ai, isso seria nas perguntas frequentes) que a multiplicação de quaternion era associativa; portanto, a rotação e a inversão são canceladas uma à outra, dando-me a percepção de que eu precisava, uma tem a rotação local à direita e a outra à direita. esquerda que basicamente diz 'aplicar rotação no espaço pai' ou 'aplicar rotação no espaço local' .... não é diferente de matrizes. Consideravelmente elementar quando você o vê! Obrigado!
Kaj