2009-10-25 62 views
4

比方說,我在3D空間(a和b)和固定軸/單位向量n中有兩個點。使距離最小化的旋轉矩陣

我想創建最小化點(未旋轉)和旋轉點b之間的歐氏距離的旋轉矩陣。

E.g:

Q := matrix_from_axis_and_angle (n, alpha); 

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

順便說一句 - 如果一個解決方案/算法可以用單位四元數表示更容易繼續使用它們。我只是用矩陣來形成我的問題,因爲它們被廣泛使用。


哦 - 我知道有一些退化的情況(a或b完全符合這個結果)。這些可以忽略。我只是在尋找可以計算單個解決方案的情況。

+0

假設所有的旋轉都是關於原點,如果你旋轉b,所以它落在向量上,這是不是確保最小(或最大)距離? – 2009-10-25 14:39:23

+0

或者我們假設n是固定的? – 2009-10-25 14:42:28

+1

n是固定的......不幸的是我無法改變它。否則,它會非常簡單。 – 2009-10-25 14:55:28

回答

5

聽起來相當容易。假設單位矢量n意味着圍繞一條平行於n點的直線到點x0的旋轉。如果x0!=原點,則用-x0平移座標系,以獲得相對於新座標系原點0的點a'b',並使用這2點代替a和b。

1)計算矢量RY = NXA

2)計算單位矢量UY =單位矢量方向RY

3)計算單位矢量UX = UY XN

現在有了的三重相互垂直的單位矢量ux,uy和n,它們形成右手座標系。可以證明:

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

這是因爲單位向量uy平行於ry,它與a和n都垂直。(來自步驟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),這將產生退化答案。

+0

+1用於識別退化情況! – unutbu 2009-10-25 18:33:40

2

我想你可以改寫的問題:什麼是從點到3D空間中的2D圓的距離

答案可以發現here

所以所需的步驟如下:

  • 旋轉點b圍繞向量n使用上述給你在3D空間
  • 二維圓,找到該圓的距離(以及圓上的點)
  • 圓上的點是您正在尋找的旋轉點b。
  • 推斷旋轉角度

...或東西; ^)

2

的距離將被最小化當從該載體沿着n行了載體中的線從b到線沿着n。

將a和b投影到垂直於n的平面上,並在2維中解決問題。你到達那裏的旋轉是你需要減小距離的旋轉。

2

設P是垂直於n的平面。 我們可以找到一個投影成P平面,(並且類似地對於b):

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

其中點(A,n)是a的點積和n

一個」和b'位於P平面。

我們現在已經將問題簡化爲2個維度。好極了!

a'和b'之間的角度(旋轉角度)等於圍繞n軸擺動b以使其最接近a所需的角度(旋轉角度)。 (想想陰影b會投射在P平面上)。

a '和b' 之間的角度是很容易找到:

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

求解有峯。

現在,你可以找到旋轉矩陣給定的THETA和n這裏: http://en.wikipedia.org/wiki/Rotation_matrix

賈森小號正確地指出,一旦你知道THETA,你仍必須決定到B順時針或逆時針繞N軸轉動。如果(a x b)與n的方向相同,則數量dot((a x b),n)將爲正數量,如果(a x b)的方向相反,則數量爲負數量。 (只要a和b都不與n共線,它就從不爲零)。

如果(axb)與n的方向相同,則必須順時針旋轉b圍繞n軸的角度theta 。如果(a x b)位於相反的方向,則必須圍繞n軸順時針旋轉角度θ。

+0

你的θ值在180度內唯一;你需要一些選擇theta或theta + 180degrees的方法。 – 2009-10-25 22:07:05

+0

當使用點積公式求解a'和b'之間的角度時,習慣上取θ在0和pi弧度之間。只要a和b不與n共線,角度theta是唯一的。 – unutbu 2009-10-25 23:40:37

+0

我明白。按照慣例,角度theta = inv_cos(...)是唯一的,正如你所說,通常映射到正範圍[0,pi]。但是解決這個問題所需的旋轉角度是範圍[0,2 * pi)之間的獨特角度。我之前的評論有些不對,您需要選擇+ theta或-theta。其中一個角度將擺動b,以便與矢量a和n共面。另一個角度不會。 – 2009-10-26 00:28:24