2010-10-21 70 views
2

(也許這對數學堆棧交換更好?)翻譯一個四元數

我有一個由骨頭組成的鏈。每個骨頭都有一個尖端和一個尾巴。下面的代碼將計算出其尖端會給出一個旋轉,並設置適當鏈的位置下一個環節:

// Quaternion is a hand-rolled class that works correctly (as far as I can tell.) 
    Quaternion quat = new Quaternion(getRotationAngleDegrees(), getRotation()); 

    // figure out where the tip will be after applying the rotation 
    Vector3f rotatedTip = quat.applyRotationTo(tip); 

    // set the next bone's tail to be at this one's tip 
    updateNextPosFrom(rotatedTip); 

如果旋轉應該圍繞對象的座標系的原點發生這工作。但是如果我想旋轉發生在對象的其他任意點周圍?我不知道如何翻譯四元數。什麼是最好的方式來做到這一點?

(我使用JOGL/OpenGL的。)

回答

4

四元數是專門用來處理一個旋轉因子,但不包括翻譯的。

通常,在這種情況下,您需要將旋轉應用到基於「骨骼」長度的點上,但以原點爲中心。然後,您可以將後期旋轉轉換爲空間中的適當位置。

4

四元數通常只用於表示旋轉;他們也不能代表翻譯。

您需要將convert your quaternion into a rotation matrix插入標準OpenGL 4x4矩陣的相應部分,並將其與翻譯結合起來以便圍繞任意點旋轉。基於雙數字(Clifford代數之一,d = A + EB其中a,b是實數和

4x4 rotation matrix: 
    [ r r r 0 ] 
    [ r r r 0 ] <- the r's are the 3x3 rotation matrix from the wiki article 
    [ r r r 0 ] 
    [ 0 0 0 1 ] 
2

雙四元數是用於表達剛性空間變換有用(組合旋轉和平移)。 e不等於零,但e^2 = 0),雙四元數U + e V可以表示空間中的線,U是單位方向四元數,V是圍繞參考點的時刻。這樣,雙四元數線非常像Pluecker線。雖然四元數變換QVQ *(Q *是Q的四元數共軛)用於圍繞一個點旋轉單位矢量四元數V,但可以使用類似的雙四元數形式來應用於行螺旋變換(圍繞軸線與沿所述軸線的平移組合剛性旋轉。)

正如任何剛性2D變換可被解析爲一個關於一個點旋轉,任何剛性3D變換可被解析爲一個螺釘。

對於這樣的動力和表現力,雙四元數引用薄,而且Wikipedia article是一個很好的地方一樣開始。

-1

編輯:這個答案是錯的。它認爲在4×4變換矩陣性質,不屬於四元......

我可能聽錯了,但對我來說(不像一些答案)四元數確實是辦理轉和翻譯工具(和更多)。這是一個4x4矩陣,最後一列代表翻譯。使用矩陣代數,由4-向量(X,Y,Z,1),並計算經變換的向量由矩陣代替3-矢量(X,Y,Z)。您會發現矩陣最後一列的值將被添加到原始矢量的座標x,y,z中,如翻譯中所示。

3D空間的3x3矩陣表示線性變換(如圍繞原點的旋轉)。您不能像轉換一樣使用3x3矩陣進行仿射轉換。所以我簡單地把四元數理解爲一種用來代表使用矩陣代數的更多類型轉換的「小技巧」。訣竅是添加等於1的第四個座標並使用4x4矩陣。因爲矩陣代數仍然有效,所以可以通過乘以矩陣來合併空間變換,這確實是強大的。

+1

這個答案在很多方面混淆了3D圖形的每一個可能的部分。您的第一段討論線性變換矩陣,第二段討論均勻座標。與四元數無關。 – Dan 2016-12-05 05:40:31

+0

是的,當我寫這封郵件時,我確信4x4變換矩陣是一個四元數。哎呀。 – 2016-12-14 13:40:27

+0

如果你仍然在與四元數糾纏在一起,這個播放列表幫助我理解了許多我覺得沒有在其他地方解釋的部分:https://www.youtube.com/playlist?list=PLW3Zl3wyJwWNWsJIPZrmY19urkYHXOH3N如果你決定回來,讓你的答案更準確,@我在評論中,我會很樂意刪除我的投票。這只是爲了防止其他讀者變得更加困惑。 – Dan 2016-12-14 14:04:05