glRotatef无法正常工作

时间:2011-06-14 23:10:59

标签: opengl graphics rotation

我是openGl的初学者。我做的很基本。只想将对象围绕x轴旋转20.0度。但它不是旋转而是向上移动。

任何人都可以在我做错的地方帮助我。

以下是我的代码,

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();
    }

2 个答案:

答案 0 :(得分: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

请注意,您应该始终从下到上阅读连续的转换操作。

更新

应该注意的是,上述解决方案更多的是一个止损。这样做的典型方法是以原点为中心建立模型。该坐标系统通常称为“模型空间”。

旋转模型空间中的点,然后将它们转换为您想要的世界中的位置。我们不得不将它移动到原点在上面的代码的唯一原因是因为该模型没有在模型空间中创建的,因此我们不得不将它移动到模型空间。

答案 1 :(得分:0)

如果将对象置于坐标轴中心,则可以看到旋转的效果。在每个glVertex3f调用中,将Z值从-0.5f更改为0.f,您将看到围绕X轴的旋转,这是您期望的。