Como calcular uma matriz de rotação 3x3 a partir de 2 vetores de direção?

10

Eu tenho 2 vetores de direção, para o eixo X e o eixo Y do objeto. Como faço para calcular a matriz de rotação do objeto usando estes?

O Flash
fonte

Respostas:

17

A idéia básica é usar um produto cruzado para gerar os eixos ortogonais extras da sua matriz de rotação, com base nos eixos que você já possui.

Matrix3x3 MakeMatrix( Vector3 X, Vector3 Y )  
{  
    // make sure that we actually have two unique vectors.
    assert( X != Y );

    Matrix3x3 M;  
    M.X = normalise( X );  
    M.Z = normalise( cross_product(X,Y) );
    M.Y = normalise( cross_product(M.Z,X) );  
    return M;
}

Observe que o exposto acima não faz suposições sobre os vetores X e Y (além de não serem idênticos) e faz muita matemática extra que talvez não seja necessário na sua situação.

Por exemplo, neste código, estou fazendo um segundo produto cruzado para garantir que nossa matriz obtenha um eixo Y ortogonal, em vez de confiar cegamente que os eixos X e Y de entrada estão precisamente separados em 90 graus. Se na sua situação você tiver certeza de que seus eixos de entrada são realmente ortogonais entre si, poderá pular o segundo produto cruzado e apenas atribuir o vetor de entrada Y diretamente, em vez de recalculá-lo.

Observe que estou assumindo que sua representação matricial tem membros vetoriais 'X, Y, Z' acessíveis. Algumas implementações apenas expõem uma matriz de nove flutuadores. Nesse caso, o vetor 'X' será os elementos 0, 1 e 2 ou 0, 3 e 6, dependendo de a matriz ser de linha principal ou coluna. principal. Nessa situação (irritante), geralmente acho que é mais fácil tentar nos dois sentidos e ver qual deles funciona, em vez de pesquisar na documentação para tentar descobrir qual pedido a implementação de sua matriz específica está usando. :)

Por fim, observe que, dependendo da capacidade do seu sistema de coordenadas 3D, pode ser necessário multiplicar MZ por um negativo, a fim de gerar uma matriz de rotação legal para o seu mecanismo 3D.

Trevor Powell
fonte
Muito obrigado! Vou fazer isso e informar meus resultados.
theflash
Obrigado pela resposta muito útil! No entanto, estou curioso: o vetor X não é sempre os elementos 0, 1 e 2, independentemente da matriz ser principal de linha ou coluna? 0, 3 e 6 implicariam acessar a primeira coluna de uma matriz principal de linha ou vice-versa.
Fbrereto
11
+1 por pelo menos afirmar () que os dois vetores não são iguais, mas acho que você também deve exigir que eles não sejam zero.
21134 hans_meine
11
Observe que isso não leva em consideração um caso onde Xestá -Y.
Rafał Cieślak 15/09/16