2012-07-16 37 views
1

我在与旋转的麻烦。我可以让立方体旋转得很好,但我只希望立方体旋转。我知道我必须使用glPushMatrix()和glPopMatrix(),但每次我在绘图周围包装这两个图形时,它都会停止旋转。glPushMatrix停止所有旋转的发生

下面是我设立的OpenGL:

void initOpenGL() 
{ 
    //these are the current version of OpenGL 
    string versions[14] = 
    { 
     "GL_VERSION_1_1", 
     "GL_VERSION_1_2", 
     "GL_VERSION_1_3", 
     "GL_VERSION_1_4", 
     "GL_VERSION_1_5", 
     "GL_VERSION_2_0", 
     "GL_VERSION_2_1", 
     "GL_VERSION_3_0", 
     "GL_VERSION_3_1", 
     "GL_VERSION_3_2", 
     "GL_VERSION_3_3", 
     "GL_VERSION_4_0", 
     "GL_VERSION_4_1", 
     "GL_VERSION_4_2" 
    }; 

    //Determine which versions are safe to use 
    cerr << "OpenGL+GLEW Info: " << endl; 
    for (int i = 0; i < 14; ++i) 
    { 
     if (glewIsSupported(versions[i].c_str())) 
      cerr << versions[i] << " is supported" << endl; 
     else 
      cerr << "ERROR: " << versions[i] << " is not supported" << endl; 
    } 
    cerr << endl << "Open GL " << glGetString (GL_VERSION) << " is the current OpenGL version" << endl << endl; 

    glClearColor(0, 0, 0, 0); 
    //By setting this option, we can explicityly control how the program terminates to ensure proper cleanup 
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); 

    //setup the camera 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(MIN_X, MAX_X, MIN_Y, MAX_Y, MIN_Z, MAX_Z); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    //enable access to the alpha channel 
    glEnable (GL_BLEND); 
    glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

... some more code to load textures... 
} 

这里是我的显示功能:

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glPushMatrix(); 
     glColor3f(1, 0, 0); 
     glRotatef(angle, 1, 1, 0); 
     glutSolidCube(30); 
    glPopMatrix(); 

    glutSwapBuffers(); 
} 
+0

我只是打周围的一些更多的,和glPopMatrix();是显示的行,停止发生旋转。任何想法可能会发生什么? – Steven 2012-07-16 04:15:02

回答

4

基本上,你似乎总是旋转相同的角度,因为弹出矩阵返回它到推送被调用时的状态。您可能想在每次显示调用时尝试增加角度变量(或代码中的其他位置,以使其不断变化)。

为什么它没有push和pop的原因是,所有的矩阵运算是累积的,因为你不会在每次结束了可变角度每次显示函数被调用的值旋转轮装载单位矩阵。顺便说一下,这可能是你想要改变的事情,因为它可能有意义的分离你的世界的状态和显示它。

+0

是的,我意识到今天当我想到这件事,并且今天下班回家时就会测试它。奇怪的是,当我不调用glPushMatrix()和glPopMatrix()时,它不断旋转。任何想法为什么没有这两个电话发生这种情况? – Steven 2012-07-16 16:51:11

+0

编辑了包含该信息的答案。 – Jari 2012-07-16 18:23:39

+0

太棒了。那确实解决了它。我按照你最初告诉我的方式去做。不知道为什么我改变了,但我做到了。感谢你的回答!我将继续使用glPush/PopMatrix()! – Steven 2012-07-16 22:33:27