2011-06-28 75 views
3

我已經卡住了我的旋轉矩陣的歐拉角。來自YZX旋轉矩陣的歐拉角問題

我的約定是:

  • 左手(X右,z後,Y向上)
  • YZX
  • 左手角旋轉

我的旋轉矩陣建立起來的來自歐拉角(來自我的代碼):

var xRotationMatrix = $M([ 
     [1, 0, 0, 0], 
     [0, cx, -sx, 0], 
     [0, sx, cx, 0], 
     [0, 0, 0, 1] 
    ]); 

    var yRotationMatrix = $M([ 
     [ cy, 0, sy, 0], 
     [ 0, 1, 0, 0], 
     [-sy, 0, cy, 0], 
     [ 0, 0, 0, 1] 
    ]); 
    var zRotationMatrix = $M([ 
     [cz, -sz, 0, 0], 
     [sz, cz, 0, 0], 
     [ 0, 0, 1, 0], 
     [ 0, 0, 0, 1] 
    ]); 

在最後旋轉矩陣結果:

R(YZX) = | cy.cz, -cy.sz.cx + sy.sx, cy.sz.sx + sy.cx, 0| 
     | sz,    cz.cx,   -cz.sx, 0| 
     |-sy.cz, sy.sz.cx + cy.sx, -sy.sz.sx + cy.cx, 0| 
     |  0,     0,     0, 1| 

我使用這個代碼計算我的歐拉角回從這個矩陣:

this.anglesFromMatrix = function(m) { 
    var y = 0, x = 0, z = 0; 

    if (m.e(2, 1) > 0.999) { 
     y = Math.atan2(m.e(1, 3), m.e(3, 3)); 
     z = Math.PI/2; 
     x = 0; 
    } else if (m.e(2, 1) < -0.999) { 
     y = Math.atan2(m.e(1, 3), m.e(3, 3)); 
     z = -Math.PI/2; 
     x = 0; 
    } else { 
     y = Math.atan2(-m.e(3, 1), -m.e(1, 1)); 
     x = Math.atan2(-m.e(2, 3), m.e(2, 2)); 
     z = Math.asin(m.e(2, 1)); 
    } 
    return {theta: this.deg(x), phi: this.deg(y), psi: this.deg(z)}; 
}; 

我向後做了數學和轉發數次,但我看不出有什麼問題。任何幫助將非常感激。

+0

請問你的問題http://math.stackexchange.com/ –

+3

我會,但有更多的材料在3D旋轉上的計算器。 math.stackexchange聲稱是「學習數學或數學相關專業的人」的網站。這不包括我。 –

+3

@ Scorpi0:這裏是一個合適的問題。 @Brendon:你的代碼看起來不錯。我會嘗試一些微不足道的情況:圍繞X軸旋轉+90度,然後檢查結果。然後圍繞Y軸等等。一次只能旋轉一次,始終從原始狀態開始,不會連續旋轉。 – Ali

回答

2

你的矩陣和歐拉角不一致。它看起來像你應該使用

y = Math.atan2(-m.e(3, 1), m.e(1, 1)); 

代替

y = Math.atan2(-m.e(3, 1), -m.e(1, 1)); 

對於一般情況(else分支)。

我說「貌似」,因爲 - 這是什麼語言?我假設你有這種語言的索引正確。你確定關於atan2嗎? atan2沒有單一的約定。在一些編程語言中,正弦項是第一個參數,在其他語言中,餘弦項是第一個參數。

+0

我知道它會降低到1個字符!你讓我很快樂。我重複了很多次計算,但我的眼睛往往會看到他們想要的。 –

1

anglesFromMatrix函數的最後一個也是最重要的分支有一個小符號錯誤,但在其他方面工作正常。使用

y = Math.atan2(-m.e(3, 1), m.e(1, 1)) 

因爲只有m.e(3, 1)m.e(1, 1) = cy.czm.e(3, 1) = -sy.cz應該被反轉。我沒有檢查其他分支是否有錯誤。

要注意的是,因爲sz = m.e(2, 1)有兩個解,用於構建基質m角度(x, y, z)可能不與由anglesFromMatrix(m)返回的角度(rx, ry, rz)。相反,我們可以測試從(rx, ry, rz)構造的矩陣rm確實等於m

+0

謝謝@antonakos。我剛剛注意到了兩個解決方案問題(以及圍繞兩極的問題),並且它目前導致圍繞這些點的一些非常酷的兩個角度旋轉。但我認爲我可以通過用矩陣驅動我的旋轉並使用歐拉角來記錄靜止狀態來編程。感謝您的回答。 –

+0

@Brendon:極點周圍的行爲稱爲「萬向節鎖」。在三維圖形中避免此問題的常見方法是四元數。 – Landei

0

我對這個問題進行了廣泛的研究,想出了給定矩陣的正確角度。數學中的問題來自於SIN(x)= SIN(-x)以來不能確定SIN的精確值,並且這將影響矩陣的其他值。我提出的解決方案在八個可能的解決方案中提出了兩個同樣有效的解決方案。我用了一個標準的Z。 Y。 X矩陣形式,但它應該適用於任何矩陣。首先找到三個角度:X = atan(m32,m33):Y = -asin(m31):Z = atan(m21,m11):然後創建角度X'= -sign(X)* PI + X: Y'=符號(Y)* PI-Y:Z = - 符號(Z)* pi + Z。使用這些角度創建八組角度組:XYZ:X'YZ:XYZ':X'YZ':X'Y'Z':XY'Z':X'Y'Z:XY'Z 使用這些設置爲創建八個相應的矩陣。然後做一個未知矩陣和每個矩陣之間的差異的總和。這是未知的每個元素減去測試矩陣的相同元素的總和。這樣做後,其中兩個和將爲零,那些矩陣將表示與原始矩陣的解的角度。這適用於所有可能的角度組合,包括0。隨着0的推出,八個測試矩陣中的更多變得有效。在0,0,0他們都變成了同一個矩陣! 希望這可以幫助,它對我的​​應用程序非常有效。 Bruce 更新 在上述解決方案中發現Y = -90或90度的問題後。我想出了這個解決方案,似乎可以重現所有值的矩陣! X =如果(或(M31 = 1,M31 = -1),0,ATAN(M33 + 1E-24,M32)) Y = -asin(M31) Z =如果(或(M31 = 1,M31 = -1) - ATAN2(M22,M12),ATAN2(M11 + 1E-24,M21)) 我去了很長的路周圍找到這個解決方案,但華盛頓很有啓發:O) 希望這有助於! 布魯斯

+0

注意:我試圖重新創建用於創建3D矩陣的角度。使用這種解決方案,其中一個集合始終是用於創建矩陣的原始角度。兩個解決方案集合都是完全相同的矩陣,無法將它們與解決方案區分開來。 –