2017-12-02 190 views
0

我的四元數執行有什麼問題?我認爲他們仍然像萬智牌一樣擁有萬向鎖。四元數行爲就像歐納

Quaternionf rotations = makeQuaternion(new Vector3f(1, 0, 0), angles.x); 
      rotations.mul(makeQuaternion(new Vector3f(0, 1, 0), angles.y)); 
      rotations.mul(makeQuaternion(new Vector3f(0, 0, 1), angles.z)); 

Matrix4f matrix = new Matrix4f(); 

matrix.translate(position); 
matrix.rotate(rotations); 
matrix.scale(scale); 

angles包含歐拉角。人們總是告訴我,我根本不應該使用它們,但我不知道如何改變四元數的價值。我認爲Quaternionf rotations是正確的。例如。與角度0, 90, 0四元數包含0.00, 0.707, 0.00, 0.707 (x,y,z,w)。這是正確的嗎?

那麼問題在哪裏?我已經閱讀了我所發現的關於這個主題的所有內容,但我顯然還是不明白。

編輯:

private static Quaternionf makeQuaternion(Vector3f n, float a) { 

    float w, x, y, z; 

    a = a/360 * (float) Math.PI * 2; 

    w = (float) Math.cos(a/2); 

    x = (float) (n.x * Math.sin(a/2)); 
    y = (float) (n.y * Math.sin(a/2)); 
    z = (float) (n.z * Math.sin(a/2)); 

    Quaternionf quaternion = new Quaternionf(x, y, z, w); 

    return quaternion; 

} 
+0

*「我的四元數執行有什麼問題?」* - 由於您沒有顯示*您的*四元數執行,所以我們無法判斷。 – luk2302

+0

@ luk2302我認爲這是最重要的部分。我可以給你'makeQuaternion'函數,但正如我所說,我認爲它給出了正確的結果。 – Maineri

+0

你是否正常化你的四元數? –

回答

1

四元顯得很有欺騙性,這是非常,非常努力拿到了堅實的感覺他們。

首先,您可能已經閱讀了一些資源。對於四元數的維基百科頁面是方程一個很好的資源:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

我也對基礎知識的博客帖子大約四元數,什麼幫助我得到了他們的感覺: https://blog.mide.com/quaternions-for-orientation

有一個很少有東西在makeQuaternion中看起來很奇怪,而且不清楚你是不正確地使用東西還是隻是在不同的地方應用東西。

您正在實施的公式爲:

quaternion equation

這裏,A是旋轉的總角度,也就是如果你沒有圍繞一個軸的總旋轉你會應用旋轉,並Bx,By,Bz是方向角度。方向角餘弦的平方和必須是1(即cos^2 Bx + cos^2 By + cos^2 Bz = 1),因爲它表示一個指向原點的向量。

您可以使用n.x,n.y,n.z,只要您確定平方和= 1,即它們需要是單位球體上的點,它就會起作用。 A和方向角之間有類似的關係,但最簡單的驗證方法是確保四元數的平方和等於1.

+0

我有2個四元數。一個是對象的方向,另一個是臨時的,包含當前的方向變化。臨時的x + y + z + w在標準化後爲1.01,主要的在-2和2之間跳躍。這兩個四元數相乘。 – Maineri

+0

如果使用makeQuaternion並且結果是-2到+2,那麼這意味着您的a和n值不合理。如果n個值通過餘弦平方檢驗和,那麼它必須是a值。 1.01可能只是一個舍入誤差 另外,請確保您使用ijk向量正確地相乘。如果Q1的X = 1,Q2的Y = 1,那麼Q1 * Q2 =(Z = 1) – pscheidler

+0

它們應該是什麼?他們只規定我跟着那裏的角度在0和360之間。軸的值在0和1之間。圍繞y軸旋轉90°:makeQuaternion(new Vector3f(0,1,0),90)。 – Maineri