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.

Foi útil?

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.

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