Pergunta

Eu tenho uma linha (na verdade, um cubo) que vai de (x1, y1, z1) para (x2, y2, z2). Gostaria de girá-lo para que ele está alinhado ao longo de outra linha que vai de (x3, y3, z3) para (x4, Y4, Z4). Atualmente estou usando Math::Atan2 juntamente com Matrix::RotateYawPitchRoll. Alguma maneira melhor de fazer isso?

Edit: eu acho que já redigido este post muito mal. O que eu estou procurando realmente é uma matriz de rotação de dois vetores.

Foi útil?

Solução

Sim, você pode fazer isso sem a necessidade de pensar em termos de ângulos em tudo.

Uma vez que você tem um cubo, suponha que você escolher um canto e, em seguida, definir as 3 bordas irradiando para fora dele como vetores f0, F1, F2 (estes são vetores de direção, em relação ao canto que você escolheu). Normalizar os e gravá-los como colunas em uma matriz F

(f0x f1x f2x)
(f0y f1y f2y)
(f0z f1z f2z)

Agora faça a mesma coisa para o t0 vetores, T1, T2 do cubo que deseja girar para e chamá-lo matriz T.

Agora, a matriz R = T * inversa (F), é a matriz que gira em relação à orientação do primeiro cubo para a orientação do segundo (porque inversa mapeia F por exemplo f0 para (1 0 0)', e, em seguida, t mapas (1 0 0)' para t0).

Se você quer saber por que isso funciona, pensar em termos de coordenar vetores de base do sistema: se você quiser rodar o XY e Z. para um novo sistema de coordenadas, bem as colunas da matriz de rotação são apenas os vetores que você quer (1 0 0) '(0 1 0)' & (0 0 1)' para ser mapeada para. T * inversa (F) é eficazmente rotativo seu cubo de sua orientação original em relação ao eixo alinhadas, e em seguida, para a orientação desejada.

(Desculpe, acima é para vetores coluna e transforma na esquerda, estilo OpenGL. Eu me lembro Direct3D é vetores linha e transforma à direita, mas deve ser óbvio como ligá-lo ao redor).

Ele também se aplica igualmente bem para 4x4 matrizes com um componente de tradução também.

Outras dicas

Você pode querer adicionar como realmente interpolar as matrizes. Origem e de destino matrizes são muito bem em sua resposta, mas computar o inverso é inútil. Quaternions lhe dará o caminho rotacional mais curta, para tomar as matrizes 3x3 rotação em ambos os matrizes, convertido ao quaternions e Lerp aqueles. Fazer um Lerp separado para a tradução e recompor. Google para quaternion - conversões de matriz e para trás e Lerp quaternion.

Editar: Uma matriz de rotação a partir de uma para a frente e para cima de um vector é trivial. A coluna em falta é o produto cruzado dos outros dois vectores. (Não se esqueça de colunas normalizar).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top