2011-06-14 54 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 

请注意,你应该总是从下往上读连续转换操作顶部。

更新

应当注意的是,上述的解决方案是更的停止隙。这样做的典型方式是模型以原点为中心构建。这个坐标系通常被称为“模型空间”。

您在模型空间中旋转点,然后将它们转换为您想要它们的世界中的位置。我们必须将它移动到上述代码中的原点的唯一原因是因为该模型不是建立在模型空间中的,所以我们必须将其移至模型空间。