2009-10-25 6 views
4

3D 공간 (a와 b)에 두 점과 n이라는 고정 축/단위 벡터가 있다고 가정 해 보겠습니다.거리를 최소화하는 회전 행렬

점 a (회전되지 않음)와 회전 된 점 b 사이의 유클리드 거리를 최소화하는 회전 행렬을 만들고 싶습니다.

예컨대 :

Q := matrix_from_axis_and_angle (n, alpha); 

find the unknown alpha that minimizes sqrt(|a - b*Q|) 

Btw는 - 솔루션/알고리즘 단위 사원 수로 표현 쉬울 수 있다면 가서 그들을 사용합니다. 나는 더 널리 사용되기 때문에 매트릭스를 사용하여 내 질문을 공식화했습니다.


오 - 나는 일부 (. A 또는 B를 n 요법에 맞춰 정확하게 거짓말)이 무시 될 수있는 경우를 퇴화가 알고있다. 단일 솔루션을 계산할 수있는 경우를 찾고 있습니다.

3 차원 공간에서 2D 원에 점으로부터의 거리 무엇 :

+0

b를 벡터 방향으로 회전 시키면 모든 회전이 원점에 해당한다고 가정하면 최소 거리 (또는 최대 거리)가 보장되지 않습니까? –

+0

아니면 n을 고쳤다고 가정합니까? –

+1

n은 고정되어 있습니다 ... 불행히도 나는 그것을 바꿀 수 없습니다. 그렇지 않으면 매우 간단합니다. –

답변

5

상당히 쉽습니다. 단위 벡터 n이 점 x0을 통해 n에 평행 한 선을 중심으로 회전하는 것을 의미한다고 가정합니다. x0! = 원점 인 경우 좌표계를 -x0으로 변환하여 새 좌표계 원점 0에 상대적인 점 a'b'을 얻고 a 및 b 대신이 두 점을 사용합니다.

1) 계산 벡터 RY = NXA

2) 방향 스피

3) 계산의 단위 벡터 UY = 단위 벡터를 계산하는 단위 벡터 UX = UY XN

이제의 트리플렛을 우좌 좌표계를 형성하는 서로 수직 인 단위 벡터 ux, uy 및 n을 포함한다.

a = dot(a,n) * n + dot(a,ux) * ux 

이는 단위 벡터 uy가 a와 n에 수직 인 ry와 평행하기 때문입니다.(1 단계에서)

4) 단위 벡터 ux, uy를 따라 b의 성분을 계산합니다. a의 구성 요소는 (ax, 0)이며 ax = dot (a, ux)입니다. b의 구성 요소는 (bx, by)입니다. 여기서 bx = dot (b, ux), by = dot (b, uy)입니다. 오른 손잡이 좌표계 때문에 도끼는 항상 양수이므로 실제로 계산하지 않아도됩니다.

5) theta = atan2 (by, bx)를 계산하십시오.

회전 행렬은 n 축을 기준으로 좌표계 (ux, uy, n)에 대해 각도 -theta만큼 회전하는 행렬입니다.

a가 a와 같거나 (단계 1과 2) b가 n과 평행하다면 (단계 4, 5) 축퇴 응답을 얻습니다.

+0

+1 퇴행성 사건을 식별하기 위해! – unutbu

2

나는 당신이 질문을 바꿔 수 있다고 생각합니다.

대답은

here 그렇게 필요한 단계는 다음과 같습니다 찾을 수 있습니다

:

  • 은 벡터 주위에 점 B를 회전 N 위를 사용하면 3D 공간
  • 에서 2 차원 원을 제공합니다 그 원과의 거리 (그리고 원상의 점)를 찾으십시오.
  • 원의 점은 찾고있는 회전 된 점입니다. b.
  • 는 회전 각도를

...라도 추론 ^)

2

는 거리가 최소화 될 것이다 때 라인 B의 벡터 N 라인까지 따라 라인 A에서, 벡터 n 따라.

n에 수직 인 평면에 a와 b를 투영하고 2 차원에서 문제를 해결하십시오. 회전은 거리를 최소화하는 데 필요한 회전입니다.

2

P를 n에 수직 인 평면이라고합시다. 우리 (마찬가지로, B에 대한)은 P-평면으로의 투영을 찾을 수

도트 (a, n)은 (A)의 내적 및 N

이다

a' = a - (dot(a,n)) n 
b' = b - (dot(b,n)) n 

는 ' 및 b '는 P면에 놓여있다.

이제 문제를 2 차원으로 축소했습니다. 예!

a '와 b'사이의 각도 (회전 각도)는 a에 가장 근접하도록 n 축을 중심으로 b를 돌리는 데 필요한 각도 (회전 각도)와 같습니다. (그림자가 b 평면에 던져 질 것이라고 생각하십시오).

에 '와 B'사이의 각도를 쉽게 찾을 수있다 :

dot(a',b') = |a'| * |b'| * cos(theta) 

세타 풀기.

이제 회전 행렬을 여기에 주어진 세타와 N을 찾을 수 있습니다 http://en.wikipedia.org/wiki/Rotation_matrix

제이슨 S는 당연히 당신이 THETA 알면, 당신은 여전히 ​​n 개의 축을 중심으로 (B)을 시계 방향 또는 시계 반대 방향으로 회전하기로 결정해야한다고 지적한다.

(a x b)가 n과 같은 방향에 있으면 양 (dot) (a x b) n은 양수가되고 반대 방향이면 음수가됩니다. (a와 b 중 어느 것도 n과 동일 선상에 있지 않는 한 제로가되지 않습니다.)

(axb)가 n과 같은 방향에 놓여 있다면 b는 n 축에 대해 시계 방향으로 시계 방향으로 회전해야합니다 .

(a x b)가 반대 방향 인 경우 b는 n 축을 중심으로 시계 방향으로 각도 θ만큼 회전해야합니다.

+0

theta의 가치는 180도 내에서만 유일합니다. 세타 또는 쎄타 + 180도를 선택할 수있는 방법이 필요합니다. –

+0

내적 등식을 사용하여 a '와 b'사이의 각도를 풀 때, theta를 0과 pi 라디안 사이로 사용하는 것이 일반적입니다. a와 b가 n과 동일 선상에 있지 않으면, 각 theta는 유일하다. – unutbu

+0

그 점을 이해합니다. 각도 theta = inv_cos (...)는 관습에 따라 일반적으로 양수 범위 [0, pi]로 매핑됩니다.그러나이 문제를 해결하는 데 필요한 회전 각은 [0,2 * pi] 범위 내에서 고유 한 각도입니다. 이전에 언급 한 내용이 약간 잘못되었으므로 + 세타 또는 -theta 중 하나를 선택해야합니다. 이 각도 중 하나는 b를 스윙하여 벡터 a 및 n과 동일 평면 상에 있습니다. 다른 각도는 그렇지 않습니다. –