2013-04-18 96 views
7

我一直在努力的蟒蛇實施工作,如何使用Python解決以下問題:3D剛體平移和旋轉

  1. 我們分A,B,C,d形成一個剛體
  2. 一些未知3D平移和旋轉應用到剛體
  3. 我們現在知道的座標,b,C
  4. 我們要計算座標d

我所知道的,到目前爲止:

我不能工作是如何計算給出A,B,C的「新」座標旋轉和平移矩陣。

我可以看到,在一般情況下(非剛體)這個的旋轉部分是Wahba's problem,但我認爲對於剛體應該有一些更快的計算方法,直接計算一組正交使用這些點的單位向量。

+1

您可以使用http://www.lfd.uci.edu/~gohlke/code/transformations中的affine_matrix_from_points(abc,abc_new,shear = False,scale = False)來計算「未知3D平移和旋轉」矩陣.py.html#line-882並將其應用於'd' – cgohlke

+0

謝謝 - 實際上它看起來像「疊加_矩陣」在實際上會這樣做我的情況我覺得呢?如果您的評論超出了答案,我會接受它! – lost

回答

2

對於你試圖匹配的一組對應點(有可能的擾動),我使用了SVD(奇異值分解),它似乎存在於numpy中。

這種技術的一個例子(在Python甚至)可以是found here,但我沒有評估它的正確性。

你要做的是「基礎變換」或「基礎變化」,它將被表示爲變換矩陣。假設你3個已知點不共線,則可以創建由初始基礎:

  1. 計算的矢量:X =(BA)和y =(CA)
  2. 規格化X(X = X /幅度( X))
  3. 項目Ý到X(proj_y = X DOT Y * X)
  4. 從y中減去投影(Y = Y - proj_y)
  5. 規格化ý
  6. 計算Z = x橫ÿ

這給了你一個初始的x,y,z座標基礎A.對你的新點做同樣的事情,並得到第二個基礎B.現在你想找到變換T,它將在A中取一個點並將其轉換到B(改變基礎)。這部分很容易。您可以反轉A將點轉換回Normal,然後使用B轉換爲第二個點。由於A是正交的,所以你可以轉置A得到逆。因此,「新的d」等於d * inverse(A)* B(儘管取決於您的表示,您可能需要使用B * inverse(A)* d。)

您需要熟悉一些用矩陣來獲得所有這些。您向量和矩陣的表示會告訴您哪個乘法矩陣乘以T(T是反(A)* B或B *反(A))。

要計算你的基礎矩陣從向量x =(X1,X2,X3),Y =(Y1,Y2,Y3),Z =(Z1,Z2,Z3)您填充它:

| x1 y1 z1 | 
| x2 y2 z2 | 
| x3 y3 z3 | 
+0

接受此問題是因爲它提供了一般性的高質量答案,儘管對我的問題的評論實際上更直接地解決了我的問題。 – lost

+0

*「假設你的三個已知點不共面」*相反,共線,對嗎? – rschwieb

+0

正確,修正。我正在考慮4點,非共面,但只有3點是必要的,因爲你糾正。 –