A rotação da matriz que minimiza a distância
Pergunta
Digamos que eu tenho dois pontos no espaço 3D (A e B) e um vector eixo fixo / unidade chamada n.
Eu quero criar uma matriz de rotação que minimiza a distância euclidan entre o ponto A (não rotacionada) e o ponto de rotação b.
por exemplo:
Q := matrix_from_axis_and_angle (n, alpha);
find the unknown alpha that minimizes sqrt(|a - b*Q|)
Btw - Se uma solução / algoritmo pode ser mais fácil expressa com unidade-quaternions ir em frente e usá-los. Eu só matrizes usadas para formular minha pergunta porque eles estão mais amplamente utilizado.
Oh - Eu sei que existem alguns casos degenerados (. A ou b deitado exatamente em linha com n ect) Estes podem ser ignorados. Eu estou olhando apenas para o caso em que uma única solução pode ser calculado.
Solução
soa bastante fácil. Suponha unidade vector n implica a rotação em torno de uma linha paralela ao n através ponto x0. Se x0! = A origem, traduzir o sistema de coordenadas por -x0 para obter pontos a'
e b'
em relação à nova origem de coordenadas do sistema 0, e usar esses 2 pontos em vez de um e b.
1) Calcular vector ry = n x um
2) unidade calcular vector de vector de uy = unidade na direcção ry
3) unidade de calcular vector ux = uy x n
Agora você tem um trio de vetores unitários perpendiculares UX uy, e n, que formam um sistema destro de coordenadas. Pode ser mostrado que:
a = dot(a,n) * n + dot(a,ux) * ux
Isto é porque unidade vector uy é paralelo ao ry que é perpendicular a ambos um e n. (Do passo 1)
4) Calcular componentes de vectores unitários ao longo b ux, uy. de um componentes são (ax, 0) onde Ax = ponto (a, UX). de b componentes são (bx, por) onde bx = ponto (b, UX), por dot = (b, UY). Devido ao sistema destro de coordenadas, machado é sempre positivo para que você não precisa realmente para calculá-lo.
5) Calcular teta = ATAN2 (por, bx).
A sua matriz de rotação é a que roda em ângulo em relação ao sistema de coordenadas -theta (ux, uy, n) em torno do eixo n.
Este rendimentos respostas degenerados Se A é paralelo ao n (passos 1 e 2) ou se b é paralelo ao n (passos 4, 5).
Outras dicas
Eu acho que você pode reformular a pergunta para:
qual é a distância de um ponto a um círculo 2D no espaço 3D.
a resposta pode ser encontrada aqui
para os passos necessários são os seguintes:
- girar o ponto b em torno de um vector n dá-lhe um círculo 2D no espaço 3D
- usando o acima, encontrar a distância a que o círculo (eo ponto sobre o círculo)
- o ponto sobre o círculo é o ponto de rotação b que você está procurando.
- deduzir o ângulo de rotação
... ou algo; ^)
A distância irá ser minimizada quando o vector de uma para a linha ao longo n se alinha com o vector de b para a linha ao longo n.
Projecto a e b no plano perpendicular ao n e resolver o problema em 2 dimensões. A rotação você chegar lá é a rotação que você precisa para minimizar a distância.
Seja P no plano que é perpendicular ao n. Podemos encontrar a projecção de um na P-plano, (e similarmente para b):
a' = a - (dot(a,n)) n
b' = b - (dot(b,n)) n
em que ponto (a, n) é o produto de ponto de um e n
a 'e b' encontram-se na P-plano.
Nós já reduziu o problema a 2 dimensões. Yay!
O ângulo (de rotação) entre a 'e b' é igual ao ângulo (de rotação) necessária para balanço b em torno do n-eixo de modo a estar mais próxima de um. (Pense as sombras b iria expressos no plano P-).
O ângulo entre a 'e b' é fácil de encontrar:
dot(a',b') = |a'| * |b'| * cos(theta)
Resolva para theta.
Agora você pode encontrar a matriz de rotação dada theta e n aqui: http://en.wikipedia.org/wiki/Rotation_matrix
Jason S justamente salienta que uma vez que você sabe theta, você ainda deve decidir b girar no sentido horário ou anti-horário em torno do eixo n.
A quantidade, ponto ((a x b), n), será uma quantidade positiva se (a x b) situa-se no mesmo sentido que n, e negativo se (a x b) situa-se no sentido oposto. (Isso nunca é zero, desde que nem um nem b é colinear com n.)
se (a x b) situa-se no mesmo sentido que n, em seguida, b tem de ser no sentido horário rodado pelo ângulo teta sobre o eixo n.
se (a x b) situa-se no sentido oposto, em seguida, b tem de ser no sentido horário rodado pelo -theta ângulo em torno do eixo n.