2009-06-17 251 views
5

對於我的項目我需要旋轉一個矩形。我想,在運行時,這將是容易的,但我發現了一個不可預知的行爲..C++/OpenGL - 旋轉矩形

下面是代碼:

glPushMatrix(); 
    glRotatef(30.0f, 0.0f, 0.0f, 1.0f); 
    glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0); 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBegin(GL_QUADS); 

     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(0, 0); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex2f(width_sprite_, 0); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex2f(width_sprite_, height_sprite_); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex2f(0, height_sprite_); 

    glEnd(); 
    glDisable(GL_BLEND); 
    glDisable(GL_TEXTURE_2D); 
    glPopMatrix(); 

有這個問題,是我的長方形正在翻譯的地方在窗口中旋轉。換句話說,矩形不保留位置:vec_vehicle_position_.xvec_vehicle_position_.y

有什麼問題?

謝謝

回答

10

你需要翻轉你的轉化的順序:

glRotatef(30.0f, 0.0f, 0.0f, 1.0f); 
glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0); 

成爲

glTranslatef(vec_vehicle_position_.x, vec_vehicle_position_.y, 0); 
glRotatef(30.0f, 0.0f, 0.0f, 1.0f); 
+0

非常感謝,它的工作原理! – 2009-06-17 19:53:51

1

確保在翻譯前應用了旋轉。

9

闡述一下以前的答案。

OpenGL中的變換通過矩陣乘法執行。在您的例子中,你有:

M_r_ - 旋轉變換

M_t_ - 平移變換

N - 頂點

,你曾在順序應用它們:

M_r_ * M_t_ * v

使用括號說明:

(M_r_ *(M_t_ * v))

我們看到頂點由更接近的矩陣首先轉換,在這種情況下是轉換。這可能有點反直觀,因爲這需要你按照與你希望它們應用的順序相反的順序來指定變換。但是如果你想到如何將變換放置在矩陣棧上,它應該有希望變得更有意義(堆棧被預先倍增)。

因此,爲了得到您想要的結果,您需要指定相反順序的變換。

+0

確實:)感謝您的更新! – 2009-06-18 02:24:23

3

慣性提供了非常好的響應。從代碼角度來看,您的轉換將按照它們出現的相反順序進行。換句話說,更接近實際繪圖代碼的轉換將首先應用。

例如:
glRotate();
glTranslate();
glScale();
drawMyThing();

首先會擴展你的東西,然後把它翻譯,然後轉動它。您實際上需要「向後讀取您的代碼」來確定以哪種順序應用哪些變換。同時請記住,當您推入並彈出模型視圖堆棧時,這些轉換的狀態是什麼。