glRotatef无法正常工作

Abd*_*mad 3 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();
    }
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 11

旋转总是相对于它接收的顶点的坐标系发生.您的对象似乎是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
Run Code Online (Sandbox Code Playgroud)

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

更新

应该注意的是,上述解决方案更多的是一种权宜之计.这样做的典型方法是以原点为中心建立模型.该坐标系通常称为"模型空间".

您可以旋转模型空间中的点,然后将它们转换为您想要它们的世界中的位置.我们在上面的代码中将它移动到原点的唯一原因是因为模型不是在模型空间中构建的,所以我们不得不将它移动到模型空间.