문제

3D 공간 (a 및 b)에 2 점과 n이라는 고정 축/단위 벡터가 있다고 가정 해 봅시다.

나는 지점 A (미개)와 회전 지점 사이의 유클리드 거리를 최소화하는 회전 행렬을 만들고 싶습니다.

예 :

 Q := matrix_from_axis_and_angle (n, alpha);

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

BTW- 솔루션/알고리즘을 단위로 표현하여 더 쉽게 표현할 수있는 경우 계속해서 사용합니다. 방금 매트릭스를 사용하여 더 널리 사용되기 때문에 내 질문을 공식화했습니다.


오 - 나는 몇 가지 퇴행 된 사례가 있다는 것을 알고 있습니다 (a 또는 b는 n ect와 정확히 일치합니다.) 이것들은 무시할 수 있습니다. 단일 솔루션을 계산할 수있는 경우를 찾고 있습니다.

도움이 되었습니까?

해결책

상당히 쉬운 것 같습니다. 단위 벡터 N은 지점 X0을 통해 N과 평행 한 선 주위의 회전을 의미한다고 가정합니다. x0! = 원점 인 경우, 좌표계를 -x0으로 번역하여 포인트를 얻습니다. a' 그리고 b' 새 좌표계 원점 0과 관련하여 A와 B 대신 2 점을 사용하십시오.

1) 벡터 ry = nxa를 계산합니다

2) 단위 벡터 uy = 단위 벡터를 방향으로 계산합니다.

3) 단위 벡터 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)입니다. 오른 손잡이 좌표 시스템으로 인해 AX는 항상 양수이므로 실제로 계산할 필요가 없습니다.

5) theta = atan2 (by, bx)를 계산합니다.

회전 매트릭스는 N 축 주위의 좌표계 (UX, UY, N)에 대한 각도로 회전하는 매트릭스입니다.

이것은 a가 n과 평행 한 경우 (단계 1 및 2) 또는 b가 n과 평행 한 경우 (단계 4, 5)의 대답을 퇴화시킵니다.

다른 팁

나는 당신이 다음과 같은 질문을 다시 표현할 수 있다고 생각합니다.

3D 공간의 지점에서 2D 원으로의 거리는 얼마입니까?

답을 찾을 수 있습니다 여기

따라서 필요한 단계는 다음과 같습니다.

  • 벡터 N 주위에 포인트 B를 회전하면 3D 공간에서 2D 원이됩니다.
  • 위를 사용하여 그 원장까지의 거리를 찾으십시오 (그리고 원의 지점)
  • 원의 요점은 당신이 찾고있는 회전 지점 B입니다.
  • 회전 각도를 추론하십시오

... 또는 뭔가;^)

벡터가 n을 따라 선을 따라 선으로 벡터가 벡터와 n을 따라 선으로 일하면 거리가 최소화됩니다.

N에 수직 인 평면으로 A와 B를 투사하고 2 차원으로 문제를 해결하십시오. 당신이 얻는 회전은 거리를 최소화하는 데 필요한 회전입니다.

p를 n에 수직 인 평면으로하자. 우리는 A의 p-plane으로의 투영을 찾을 수 있습니다.

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

여기서 dot (a, n)는 a와 n의 점 제품입니다.

A '와 B'는 P- 평면에 있습니다.

이제 문제를 2 차원으로 줄였습니다. 예!

A '와 B'사이의 각도 (회전)는 a에 가장 가까운 N 축 주위의 B를 스윙하는 데 필요한 각도 (회전)와 같습니다. (그림자가 P 평면에 캐스팅 될 그림자에 대해 생각하십시오).

A '와 B'사이의 각도는 쉽게 찾을 수 있습니다.

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

세타를 해결하십시오.

이제 여기에서 theta와 n이 주어진 회전 매트릭스를 찾을 수 있습니다.http://en.wikipedia.org/wiki/rotation_matrix

Jason S는 일단 Theta를 알게되면 여전히 n 축에 대해 B 시계 방향 또는 시계 반대 방향으로 회전해야한다고 지적합니다.

수량 인 dot ((Axb), n)은 (axb)가 n과 동일한 방향에 있고, (axb)가 반대 방향에있는 경우 양의 양이 될 것입니다. (a 또는 b도 n과 공동체가 아닌 한 결코 0이 아닙니다.)

(axb)가 n과 동일한 방향에 있으면 b는 n 축에 대한 각도 theta에 의해 시계 방향으로 회전해야합니다.

(AXB)가 반대 방향에 있으면 B는 N 축에 대한 각도 -theta에 의해 시계 방향으로 회전해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top