2010-07-28 104 views
7

我試着做一個關於x和y軸的立方體的一個簡單的旋轉:OpenGL的矩陣旋轉四元

我想總是以量X 旋轉在x軸的立方體,並通過旋轉立方體y軸通過量Y獨立於x軸旋轉

第一的i天真地做的:

glRotatef(x,1,0,0); 
glRotatef(y,0,1,0); 

然後

但第一旋轉OV呃x然後旋轉y 我想獨立x訪問旋轉y。

我開始尋找到四元數,所以我嘗試:

Quaternion Rotation1; 
Rotation1.createFromAxisAngle(0,1, 0, globalRotateY); 
Rotation1.normalize(); 

Quaternion Rotation2; 
Rotation2.createFromAxisAngle(1,0, 0, globalRotateX); 
Rotation2.normalize(); 

GLfloat Matrix[16]; 

Quaternion q=Rotation2 * Rotation1; 

q.createMatrix(Matrix); 
glMultMatrixf(Matrix); 

,只是做幾乎正是在完成連續做2個glRotates ...所以我想我缺少一個步驟或2

是四元的路要走還是應該使用不同的東西?如果四元數是我可以添加的步驟,以使多維數據集獨立於每個軸旋轉。 我覺得有人有相同的問題: Rotating OpenGL scene in 2 axes

+0

OK,讓我這樣說...我想要做的就是用鼠標旋轉的立方體。我想向左右控制屏幕y軸旋轉,然後向下控制屏幕x軸旋轉。我希望它們獨立於另一個軸旋轉,但僅在屏幕全局座標軸上旋轉。 如果我做2 glRotations我不會得到這種行爲,因爲一軸旋轉使另一個旋轉。 – yeahdixon 2010-07-28 07:03:01

+0

例如旋轉立方體: 沒有旋轉操作只顯示單面 然後我做 glRotatef(90,1,0,0); \t glRotatef(45,0,1,0); \t⁃\t gives \t給我一個傾斜的立方體(鑽石),當我想要一個立方體的角落朝向相機,這實際上是交換操作的結果: \t glRotatef(45,0,1,0); \t glRotatef(90,1,0,0); 我只是交換旋轉命令,但當角度值翻轉時會遇到相同的問題。 – yeahdixon 2010-07-28 07:03:43

回答

3

我得到這個工作正常使用四元數:我確定有其他方式,但反過來reseset,這對我完全工作。我在另一個論壇上發佈了類似的版本。http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=280859&#Post280859

首先創建變化的角度的x/y 則每個幀乘以變化的角度四元到累積四元數的四元數表示,然後最終轉換該四元數矩陣形式乘以當前矩陣。這裏是循環的主要代碼:

Quaternion3D Rotation1=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(-1.0f,0,0), DEGREES_TO_RADIANS(globalRotateX)); 
Quaternion3DNormalize(&Rotation1); 

Quaternion3D Rotation2=Quaternion3DMakeWithAxisAndAngle(Vector3DMake(0.0f,-1.0f,0), DEGREES_TO_RADIANS(globalRotateY)); 
Quaternion3DNormalize(&Rotation2); 


Matrix3D Mat; 
Matrix3DSetIdentity(Mat); 
Quaternion3DMultiply(&QAccum, &Rotation1); 

Quaternion3DMultiply(&QAccum, &Rotation2); 

Matrix3DSetUsingQuaternion3D(Mat, QAccum); 
globalRotateX=0; 
globalRotateY=0; 

glMultMatrixf(Mat); 

然後繪製立方體

+0

這個網站真的幫了我很大的忙: http://www.gamedev.net/reference/articles/article1095.asp但一開始我沒有任何意義,直到我研究並嘗試了更多的東西 – yeahdixon 2010-07-29 05:53:42

0

這將有很大的幫助,如果你能給出你正在嘗試做的,更詳細的解釋你所得到的結果是如何從你想要的結果不同。但一般情況下,使用歐拉角度旋轉有一些問題,因爲組合旋轉會導致不直觀的行爲(並且在最壞的情況下會失去一定的自由度)。

如果可以的話,Quaternion slerp可能會適合您找到代表您想要的旋轉的單個軸和單個角度。但是使用四元數圍繞X和Y軸連續旋轉將無助於避免構成歐拉旋轉中固有的問題。

您鏈接到的帖子似乎涉及另一個問題,但。這張海報似乎一直在翻譯他的對象,然後做他的旋轉,當他應該先旋轉,然後翻譯。

+0

我更詳細地描述了上述問題,但我認爲官方稱爲萬向節鎖 – yeahdixon 2010-07-28 07:10:56

0

目前尚不清楚你想實現什麼。也許你應該考慮一些問題以及你想讓它們旋轉到哪裏 - 例如頂點(1,1,1)應該映射到(0,1,0)。然後,根據該信息,您可以計算所需的旋轉。

四元數通常用於插入兩個旋轉「位置」之間。所以第一步是確定你的開始和結束「職位」,你還沒有。一旦你有了,你使用四元數進行插值。這聽起來不像你在這裏有任何時間變化的方面。

+0

我更詳細地描述了上述問題,但我認爲官方稱爲萬向節鎖 – yeahdixon 2010-07-28 07:10:33

0

你的問題不是萬向節鎖。實際上,沒有理由爲什麼你的四元數版本比你的矩陣(glRotate)版本更好,因爲你使用的四元數在數學上與你的旋轉矩陣相同。

如果你想要的是鼠標控制,你可能想要檢查出arcballs

+0

謝謝,是的,我完全同意,四元數和旋轉矩陣可以互換,因此可以在沒有四元數的情況下完成。這個概率的答案更多的是在矩陣的預乘法中,使用增量旋轉。 – yeahdixon 2010-08-02 00:14:15