glRotatef无法正常工作

4

我是一个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个回答

12

旋转始终是相对于接收到的顶点的坐标系进行的。您的对象似乎是在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

请注意,您应始终从底部向上阅读连续的转换操作。

更新

需要注意的是,上述解决方案更多地是一种权宜之计。通常的做法是,建立以原点为中心的模型。这个坐标系通常称为“模型空间”。

您需要在模型空间中旋转点,然后将它们平移至您想要它们位于的世界位置。我们在上面的代码中不得不将其移动到原点的唯一原因是该模型没有在模型空间中构建,所以我们必须将其移动到模型空间中。


0

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


不,他看不到任何东西,因为对象将被剪裁在近平面。 - Christian Rau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接