【问题标题】:glPushMatrix stops all rotation from happeningglPushMatrix 阻止所有旋转发生
【发布时间】:2012-07-16 03:40:47
【问题描述】:

我遇到了旋转问题。我可以让立方体旋转得很好,但我只希望那个立方体旋转。我知道我必须使用 glPushMatrix() 和 glPopMatrix() 但每次我将这两个包裹在我的绘图周围时,它都会停止旋转。

这是我设置 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();
}

【问题讨论】:

  • 我又玩了一些,还有 glPopMatrix();是显示中阻止旋转发生的行。知道会发生什么吗?

标签: c++ opengl 3d rotation


【解决方案1】:

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

它在没有 push 和 pop 的情况下工作的原因是所有矩阵运算都是累积的,并且由于您没有在每一轮上加载单位矩阵,因此每次调用 display 函数时最终都会按可变角度值旋转。顺便说一句,这可能是您想要更改的内容,因为将您的世界状态与显示状态分开可能是有意义的。

【讨论】:

  • 是的,我今天想到它就意识到了这一点,今天我下班回家时会测试它。奇怪的是,当我不调用 glPushMatrix() 和 glPopMatrix() 时,它会连续旋转。知道为什么在没有这两个电话的情况下会发生这种情况吗?
  • 编辑答案以包含该信息。
  • 太棒了。那确实解决了它。我是按照你最初告诉我的方式做的。不知道为什么我改变了,但我做到了。感谢你的回答!而且我会继续使用glPush/PopMatrix()!
猜你喜欢
  • 2012-12-02
  • 1970-01-01
  • 2018-01-23
  • 2011-08-26
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多