1. ホーム
  2. opengl

[解決済み] glutSpecialFuncを正しく使うには?

2022-02-19 03:17:50

質問

次のような場合に、四角が大きくなるようにしたい。 UO が押される。

void displayScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();

    glTranslatef(0,x,0);

    glBegin(GL_QUADS);
    glVertex3f(-0.4,-0.4, -5.0);
    glVertex3f( 0.4,-0.4, -5.0);
    glVertex3f( 0.4, 0.4, -5.0);
    glVertex3f(-0.4, 0.4, -5.0);
    glEnd();

    //x = x + 0.1;

    glutSwapBuffers();
}

gluSpecialFuncを使っています。

void ProcessSpecialKeys(unsigned char key, int x, int y)
{
    if (key == GLUT_KEY_UP)
    {
        x = x + 0.1;
    }

    glutPostRedisplay();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(0,0);
    glutCreateWindow("OpenGL Window");
    init();
    glutDisplayFunc(displayScene);
    glutSpecialFunc(ProcessSpecialKeys);
    //glutKeyboardFunc(ProcessKeys);
    glutMainLoop();
    return 0;
}

帰るとき x+=0.1 の中に displayScene を押すと、四角い部分が盛り上がります。

私は glutSpecialFunc が間違っているのでしょうか?以前使っていて、普通に使えたからです。何が足りないのでしょうか?

解決方法は?

glutSpecialFunc は、キーを押している間、連続的に呼び出されることはありません。コールバックは、キーが押されたときに一度だけ呼び出されます。
フリーグラット が提供する glutSpecialUpFunc コールバックは、キーが解放されたときに呼び出されます。

のときに状態を設定します。 UP が押されたときに状態をリセットし を離す。

int main(int argc, char** argv)
{
    // [...]
    glutSpecialFunc(ProcessSpecialKeys);
    glutSpecialUpFunc(ReleaseSpecialKeys);
    // [...]
}

int keyUpPressed = 0;

void ProcessSpecialKeys(unsigned char key, int x, int y)
{
    if (key == GLUT_KEY_UP)
        keyUpPressed = 1;
}

void ReleaseSpecialKeys(unsigned char key, int x, int y)
{
    if (key == GLUT_KEY_UP)
        keyUpPressed = 0;
}

を変更します。 x の状態に依存します。 keyUpPressed . を呼び出すことでシーンを継続的に再描画します。 glutPostRedisplay displayScene

void displayScene(void)
{
    if (keyUpPressed)
        x += 0.1;

    // [...]

    glutSwapBuffers();
    glutPostRedisplay();
}