2

回転に困っています。立方体をうまく回転させることはできますが、その立方体だけを回転させたいのです。glPushMatrix() と glPopMatrix() を使用する必要があることはわかっていますが、これら 2 つを描画に巻き付けるたびに、回転が停止します。

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();
}
4

1 に答える 1

4

マトリックスをポップすると、プッシュが呼び出されたときの状態に戻るため、基本的に常に同じ角度に回転するようです。すべての表示呼び出しで角度変数を少し増やしてみることをお勧めします (またはコード内の別の場所で、継続的に変化するようにします)。

プッシュとポップなしで機能する理由は、すべての行列演算が累積的であり、各ラウンドで単位行列をロードしないため、表示関数が呼び出されるたびに可変角度の値で回転することになるためです。ちなみに、これはおそらく、世界の状態を表示から分離することが理にかなっているため、今後変更したいものです。

于 2012-07-16T04:26:57.480 に答える