2011-06-14 48 views
3

我是openGl的初學者。我正在做非常基本的事情。只想旋轉一個關於x軸20.0度的物體。但不是旋轉它向上移動。glRotatef無法正常工作

任何人都可以幫助我,我做錯了。

下面是我的代碼,

void drawScene(){ 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3f(1.0f, 0.0f, 0.0f); 
    glPushMatrix(); 
    //glTranslatef(1.0f,0.0f,0.0f); 
    glRotatef(20.0f,1.0f,0.0f,0.0f); 

    glBegin(GL_QUADS); 
    glVertex3f(-0.7f, -0.5f, -5.0f); 
    glVertex3f(0.7f, -0.5f, -5.0f); 
    glVertex3f(0.4f, 0.5f, -5.0f); 
    glVertex3f(-0.4f, 0.5f, -5.0f); 
    glEnd(); 
    glPopMatrix(); 

     glutSwapBuffers(); 
    } 

回答

0

如果將對象置於座標軸上,則可以看到旋轉的效果。在每個glVertex3f調用中,將Z值從-0.5f更改爲0.f,您將看到您所期望的圍繞X軸的旋轉。

+0

不,他不會看到任何東西,因爲對象將被裁剪在近平面。 – 2011-06-14 23:55:47

10

輪作總是發生相對於它接收到的頂點的座標系。你的物體似乎是一個在Z軸-5.0處的平面。旋轉矩陣圍繞座標系的原點(0,0,0)旋轉。由於你的物體不是以原點爲中心,所以它會圍繞原點旋轉。

處理此問題的典型方法是將對象轉換爲原點,旋轉並翻譯回原點。在你的情況,這將是這樣的:

glTranslatef(0.0f, 0.0f, -5.0f); //Translate back to the original location. 
glRotatef(...);     //Rotate. 
glTranslatef(0.0f, 0.0, 5.0f); //Translate to the origin 

請注意,你應該總是從下往上讀連續轉換操作頂部。

更新

應當注意的是,上述的解決方案是更的停止隙。這樣做的典型方式是模型以原點爲中心構建。這個座標系通常被稱爲「模型空間」。

您在模型空間中旋轉點,然後將它們轉換爲您想要它們的世界中的位置。我們必須將它移動到上述代碼中的原點的唯一原因是因爲該模型不是建立在模型空間中的,所以我們必須將其移至模型空間。