Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ glPushMatrix停止所有旋转_C++_Opengl_3d_Rotation - Fatal编程技术网

C++ glPushMatrix停止所有旋转

C++ glPushMatrix停止所有旋转,c++,opengl,3d,rotation,C++,Opengl,3d,Rotation,我的旋转有问题。我可以让立方体旋转得很好,但我只想让立方体旋转。我知道我必须使用glPushMatrix()和glPopMatrix(),但每次我将它们缠绕在绘图上时,它就会停止旋转 下面是我如何设置OpenGL的: void initOpenGL() { //these are the current version of OpenGL string versions[14] = { "GL_VERSION_1_1", "GL_VERSI

我的旋转有问题。我可以让立方体旋转得很好,但我只想让立方体旋转。我知道我必须使用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...
}

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


它在没有push和pop的情况下工作的原因是所有矩阵操作都是累积的,并且由于没有在每一轮上加载标识矩阵,所以每次调用display函数时都会按可变角度的值进行旋转。顺便说一句,这可能是您希望继续更改的内容,因为将世界的状态与显示分离可能是有意义的。

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


它在没有push和pop的情况下工作的原因是所有矩阵操作都是累积的,并且由于没有在每一轮上加载标识矩阵,所以每次调用display函数时都会按可变角度的值进行旋转。顺便说一句,这可能是你想继续改变的事情,因为将你的世界状态从显示中分离出来可能是有意义的。

我刚刚又玩了一些,还有glPopMatrix();显示中阻止旋转发生的行。知道会发生什么吗?我只是又玩了一些,还有glPopMatrix();显示中阻止旋转发生的行。你知道会发生什么吗?是的,今天当我思考这个问题时,我意识到了这一点,今天下班回家后,我会对它进行测试。奇怪的是,当我不调用glPushMatrix()和glPopMatrix()时,它会不断旋转。知道为什么没有这两个电话会发生这种情况吗?编辑答案以包含这些信息。太棒了。这确实解决了问题。我是按照你最初告诉我的方式做的。不知道为什么我改变了,但我改变了。谢谢你的回答!我将继续使用glPush/PopMatrix()!是的,今天当我想到它的时候,我意识到了这一点,今天当我下班回家的时候,我会测试它。奇怪的是,当我不调用glPushMatrix()和glPopMatrix()时,它会不断旋转。知道为什么没有这两个电话会发生这种情况吗?编辑答案以包含这些信息。太棒了。这确实解决了问题。我是按照你最初告诉我的方式做的。不知道为什么我改变了,但我改变了。谢谢你的回答!我将继续使用glPush/PopMatrix()!
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();
}