0

現在、GLUTライブラリでMicrosoft Visual C ++ 2010 Expressを使用しており、---関数でさまざまなメッシュを簡単にまとめて描画できvoid draw()ます。この後、アニメーション関数で異なる「フェーズ」を作成しようとしました。それぞれが異なる--を呼び出しmodel.draw("object1")ます。次に、現在のフェーズを変更するkeyboardown関数を使用しようとすると、最初は機能しますが、マウスを使用してオブジェクトを移動するとすぐに、ウィンドウが黒くなります。ヒントはありますか?

これが機能する描画関数です。

void draw() 
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(  2, 2, -250, 0, 0, 0, 0, 1, 0);
    glRotatef(spin_y, 1.0, 0.0, 0.0);
    glRotatef(spin_x, 0.0, 1.0, 0.0);      

    model.Draw("object1");
    model.Draw("object2");

    glutSwapBuffers();
}

これは、model.Draw( "...");を削除した後に機能しないアニメーションです。描画関数から:

void animation(int t)
{
    switch (phase) {
        case 0:
            break;
        case 1:
            model.Draw("object2");
            glutSwapBuffers();
            break;
        case 2:
            model.Draw("object1");
            glutSwapBuffers();
            break;
    }
    glutTimerFunc((int) 1000/FPS, animation, 0);
}

これがキーボード機能です。

void keyboardDown(unsigned char key, int x, int y) {

  switch(key) {
  case '1':phase=1;break;
  case '2':phase=2;break;
  case 'Q':
  case 'q':
  case  27:
    exit(0);
  }
}

これは、draw()で使用されるspin_x spin_yの値を更新して、マウスの動きを使用してオブジェクトを移動させる関数です。

void mouseMotion(int x, int y) 
{
    spin_x = x - old_x;
    spin_y = y - old_y;

    glutPostRedisplay();
}

関数で削除する前は完全にmodel.draw(...)機能しdraw()ますが、アニメーションを使おうとすると消えてしまいます。glutPostRedisplay()funcに後から追加しようとしましmodel.draw(...)animation()が、それでも機能しません。

そしてそれがメインです:

    int main(int argc, char** argv) 
{
    int width = 800;
    int eight = 600;

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(width, eight);
glutInitWindowPosition(100, 100);
glutCreateWindow("Perspective's GLUT Template");

glutKeyboardFunc(keyboardDown);
glutKeyboardUpFunc(keyboardUp);
glutMouseFunc(mouseClick);
glutMotionFunc(mouseMotion);
glutReshapeFunc(reshape);
glutDisplayFunc(draw);  
glutIdleFunc(idle);
glutTimerFunc((int) 1000/FPS, animation, 0);
glutIgnoreKeyRepeat(false); 


int subMenu = glutCreateMenu(menu);
glutAddMenuEntry("Do nothing", 0);
glutAddMenuEntry("Really Quit", 'q');


glutCreateMenu(menu);
glutAddSubMenu("Sub Menu", subMenu);
glutAddMenuEntry("Quit", 'q');
glutAttachMenu(GLUT_RIGHT_BUTTON);

initGL(width, eight);

glutMainLoop();
return 0;
}

アニメーション機能も追加glutSwapBuffers()しましたが、なぜ最初に作成しなかったのかわかりません。

4

0 に答える 0