2014-10-02 84 views
0

Initial PoseAfter rotationUnwanted affectThe wanted affect我在OpenGL中編寫了一個簡單的應用程序。我有一個模型,我想圍繞其中心旋轉(局部座標),然後將其與本地座標一起翻譯。我做了兩個場景, 旋轉然後翻譯,反之亦然。在第一種情況下,我得到的旋轉是正確的,但是模型根據世界座標而不是模型(局部)座標進行平移。當我首先翻譯時,我得到了翻譯的權利,但輪換不在模型中心附近。 這裏的代碼,對象座標上的旋轉和平移

glPushMatrix(); 

// ignore this 
/*glRotatef(_zRoll, 0.0, 0.0, 1.0); 
glRotatef(_yTilt, 1.0, 0.0, 0.0); 
glRotatef(_xPan, 0.0, 1.0, 0.0);*/ 
glScalef(scale, scale, scale); 
glTranslatef(0.0, 0.0, -2.0); 
glTranslatef(_xTranslate, _yTranslate, _zTranslate); // The required translation 
// The required rotation 
glRotatef(_yangle, 0.0, 1.0, 0.0); 
glRotatef(_zangle, 0.0, 0.0, 1.0); 
glRotatef(_xangle, 1.0, 0.0, 0.0); 
glTranslatef(coord.x, coord.y, coord.z); // translate to the model center 

glCallList(aHelix); 

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 

glPopMatrix(); 

glutSwapBuffers(); 
+1

*插入關於棄用的固定功能管道的標準免責聲明*,目前的方法是使用着色器並管理自己的變換矩陣 – 2014-10-02 09:35:57

+0

不清楚你想要做什麼以及你的值是什麼意思。幾個插圖或截圖與評論會很好。從我能夠理解的,你需要先翻譯,然後旋轉。 – keltar 2014-10-02 11:07:22

+0

@keltar我想要做的事情基本上是將模型與旋轉方向一起移動(平移)。例如,如果我將模型向左旋轉90度(圍繞z軸),然後沿-x軸移動對象,模型應向下移動(根據模型(局部)座標,而不是按照左移世界座標 – jouzef19 2014-10-03 07:44:46

回答

0

我想我現在你要尋找的理解。我會試圖重申你想要的,所以請糾正我,如果我錯了。

讓我們用下面的頂點座標(列是頂點)一個簡單的模型:

[3 2 3 4] 
[5 2 3 2] 
[0 0 0 0] 
[1 1 1 1] 

所以第一點是在x = 3,Y = 5,Z = 0。繪製這個模型,我們得到:

Original model

如果我們簡單地旋轉模型(在這種情況下,由43 °),然後在Y方向(上),說4個單位轉換,我們得到這樣的:

Model rotated then translated Y

該模型現已移動單元4在Y方向上,但在世界座標系。據我瞭解,以上結果是你不要想要的。

相反,如果我們翻譯在它旋轉後指向的方向模型,我們得到這樣的:

Model rotated then translated at angle

這一點,我相信,是你的DO想要什麼。這是我使用的代碼。

glTranslatef(3.0, 3.0, 0.0); 
glTranslatef(-2.728, 2.924, 0.0); 
glRotatef(43.0, 0.0, 0.0, 1.0); 
glTranslatef(-3.0, -3.0, 0.0); 

我首先將模型旋轉43度,然後根據更新的局部Y方向進行平移。我通過使用向量[0 4 0 0]並使用與該模型相同的旋轉矩陣旋轉它來獲得硬編碼的平移向量。這不是以編程方式直接進行的(至少在固定管道中),並且隨後的旋轉會變得更糟。

事實證明,雖然,你通過[0 4 0 0]首先進行翻譯得到同樣的結果(你可以手動驗證),其次是旋轉:

glTranslatef(3.0, 3.0, 0.0); 
glRotatef(43.0, 0.0, 0.0, 1.0); 
glTranslatef(0.0, 4.0, 0.0); 
glTranslatef(-3.0, -3.0, 0.0); 

這裏的第二個結果比較組代碼:

Model translated then rotated

的問題是,如果你做任何隨後轉/平移,您協調SY幹仍然搞砸了。爲了解決這個問題,您需要確保您使用累加器來進行旋轉和平移,並將它們一次全部應用到原始模型,而不是進行小的增量更改。因此,每按一次向上箭頭鍵,爲您的_yTranslate變量添加一些增量值,對於每次按下「旋轉」按鈕,從_zangle開始加上或減去某個值,依此類推。

+0

是的,你有我想要提供的想法。您的解決方案實際上就是我所做的,並且在某種程度上起作用。謝謝 – jouzef19 2014-10-07 06:53:23