Como combinar rotação em 2 eixos em uma matriz

8

Eu já sei sobre as matrizes que tenho que usar para realizar rotações. Se eu tiver que girar no eixo z e depois no eixo x, eu o faria em 2 etapas. Minha pergunta é: é possível combinar as duas rotações em uma única matriz? Agradeço o seu feedback.

JORGE
fonte

Respostas:

8

(Essa resposta é essencialmente a mesma que a de Stefan, mas eu queria adicionar alguns detalhes sobre os vetores de linha e coluna e como determinar qual você está usando.)

Sim, isso é possível, mas os detalhes dependem de você representar seus vetores como linhas ou colunas.

Vetores de coluna

Se você estiver usando vetores de coluna , normalmente os transformará, multiplicando à esquerda suas matrizes:

vector = mRotateZ * vector;
vector = mRotateX * vector;

Obviamente, você também pode fazer isso em uma etapa:

vector = mRotateX * mRotateZ * vector;

Mas a multiplicação de matrizes é associativa, o que significa que não importa qual multiplicação é realizada primeiro:

A * B * C = (A * B) * C = A * (B * C)

Para que possamos escrever

Matrix mRotate = mRotateX * mRotateZ;
vector = mRotate * vector;

Foi agora criada uma única matriz, o que é equivalente a primeira rotação sobre Ze segunda sobre X. Isso generaliza trivialmente para qualquer número de transformações. Observe que as transformações são aplicadas da direita para a esquerda.

Vetores de linha

Se, por outro lado, você estiver usando linhas vetores, normalmente você vai direito -multiply suas matrizes:

vector = vector * mRotateZ;
vector = vector * mRotateX;

Mais uma vez, escrevendo-o em uma etapa, obtemos

vector = vector * mRotateZ * mRotateX;

que pode ser reescrito como

Matrix mRotate = mRotateZ * mRotateX;
vector = vector * mRotate;

Observe que, nesse caso, as transformações foram aplicadas da esquerda para a direita.

Martin Ender
fonte
11
Eu ficaria muito carrfull com esse comentário associatividade é fácil entender mal
joojaa
@joojaa Não sei exatamente o que você quer dizer, mas tentei esclarecer isso.
Martin Ender
É difícil para um leigo separar entre ordem e multiplicar as coisas e a ordem na qual os elementos estão em multiplicação.
Joojaa 13/10/2015
então eles não entendem a diferença entre assiocativo e comutativo. por isso, se você fala da ordem de multiplicação muitos podem pensar de comutatividade
joojaa
6

Sim, basta multiplicá-los na ordem inversa:

Matrix myrotation = Matrix.CreateRotationX(xrot) * Matrix.CreateRotationZ(zrot);

EDITAR. Minha resposta se aplica apenas se você estiver usando vetores de coluna. Por favor, veja a resposta detalhada de Martin Büttner.

Stefan Agartsson
fonte
Sinto muito, mas não entendi a idéia. O que você quer dizer exatamente com "ordem inversa"?
JORGE #
11
Multiplique x por z em vez de z por x;
Stefan Agartsson
11
na verdade, a ordem é arbitrária, pode-se modelar usando vetores de linha e modelar vetores de coluna. A computação gera o mesmo resultado em ambos, mas a ordem de multiplicação muda. Mas sim, essa é a resposta certa.
Joojaa 10/10
Joojaa, obrigado por deixar isso claro! Matriz de linha significa ordem inversa de multiplicação, está correto?
Stefan Agartsson 10/10
3

De matemática:

Existe um homomorfismo 2: 1 dos quaterniões da unidade para SO (3) (o grupo de rotação).

O que isso (essencialmente) significa é que:

  1. Toda orientação pode ser representada como um quaternion
  2. Quaternions representam uma única rotação
  3. A multiplicação de quaternions produz outro quaternion (fechamento) e é equivalente a compor as rotações.
  4. Portanto, qualquer número de rotações pode ser representado como uma única rotação!

Pense sobre isso. A partir do espaço do objeto, você pode girar seu objeto em qualquer orientação usando apenas uma única rotação.


Gostaria de salientar que trazer quaternions não era apenas matemática aleatória. Em contraste com as outras respostas, a abordagem preferida nos gráficos é na verdade representar as rotações como quaternions, pois elas ocupam menos espaço e são mais rápidas de combinar.

Existem maneiras facilmente acessíveis de converter entre matrizes de rotação e quaternions, dependendo da sua preferência. O ponto é que as rotações são os quaternions em um sentido matemático; portanto, suas combinações também são rotações únicas.

imallett
fonte