OpenGL/GLUT Problem mit glutkeyboardfunc

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • OpenGL/GLUT Problem mit glutkeyboardfunc

    Hallo Zusammen,

    ich will ein OpenGL/Glut Program schreiben, dass seine Hintergrundfarbe ändert,
    wenn man die Taste 'r' oder 'w' drückt. Dazu habe ich folgendes geschrieben:

    Source Code

    1. void tasten (unsigned char key, int xmouse, int ymouse)
    2. {
    3. switch (key){
    4. case 'w':
    5. glClearColor (1.0, 0.0, 0.0, 0.0);
    6. break;
    7. case 'r':
    8. glClearColor (0.0, 1.0, 0.0, 0.0);
    9. break;
    10. default:
    11. break;
    12. }
    13. }
    Display All


    Mein Problem ist jetzt, dass es die Farbe zwar ändert aber erst dann wenn man nach der Taste auch noch die Maus drückt.
    Benutze ich die falsche Funktion? Oder mach ich irgendwas anderes falsch? Ich will, dass es die Farbe direkt ändert, wenn
    man die Taste drückt.
    Vielen Dank für eure Hilfe.

    Bobby253

    Hier der ganze Code falls ihr ihn braucht:

    C Source Code

    1. #include <stdlib.h>
    2. #include <GL/glut.h> /* includes the necissarie libaries, etc*/
    3. static GLfloat spin = 0.0;
    4. void init(void)
    5. {
    6. glClearColor (0.0, 0.0, 0.0, 0.0);
    7. glShadeModel (GL_FLAT);
    8. }
    9. void display(void)
    10. {
    11. glClear(GL_COLOR_BUFFER_BIT);
    12. glPushMatrix();
    13. glRotatef(spin, 0.0, 0.0, 1.0);
    14. glColor3f(1.0, 1.0, 1.0);
    15. glBegin(GL_POLYGON);
    16. glVertex2f(-25.0, -25.0);
    17. glVertex2f(-25.0, 25.0);
    18. glVertex2f(25.0, 25.0);
    19. glVertex2f(25.0, -25.0);
    20. glVertex2f(0.0, 40.0);
    21. glEnd();
    22. glPopMatrix();
    23. glutSwapBuffers();
    24. }
    25. void spinDisplay(void)
    26. {
    27. spin = spin + 0.10;
    28. if (spin > 360.0)
    29. spin = spin - 360.0;
    30. glutPostRedisplay();
    31. }
    32. void spinDisplay2(void)
    33. {
    34. spin = spin - 0.10;
    35. if (spin > 360.0)
    36. spin = spin - 360.0;
    37. glutPostRedisplay();
    38. }
    39. void reshape(int w, int h)
    40. {
    41. glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    42. glMatrixMode(GL_PROJECTION);
    43. glLoadIdentity();
    44. glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0);
    45. glMatrixMode(GL_MODELVIEW);
    46. glLoadIdentity();
    47. }
    48. void tasten (unsigned char key, int xmouse, int ymouse)
    49. {
    50. switch (key){
    51. case 'w':
    52. glClearColor (1.0, 0.0, 0.0, 0.0);
    53. break;
    54. case 'r':
    55. glClearColor (0.0, 1.0, 0.0, 0.0);
    56. break;
    57. default:
    58. break;
    59. }
    60. }
    61. void motionleft (int mousex,int mousey)
    62. {
    63. static int lx, ly;
    64. if (!lx) lx=mousex; //worng : only choosen first time
    65. if (!ly) ly=mousey;
    66. int dy;
    67. dy=ly-mousey; //wrong: only measures movments
    68. spin=spin+dy*0.1;
    69. }
    70. void mouse(int button, int state, int x, int y)
    71. {
    72. switch (button) {
    73. case GLUT_LEFT_BUTTON:
    74. if(state == GLUT_DOWN);
    75. glutIdleFunc(spinDisplay);
    76. if (state == GLUT_DOWN)
    77. glutMotionFunc(motionleft);
    78. if (state == GLUT_UP)
    79. glutIdleFunc(NULL);
    80. if (state == GLUT_UP)
    81. glutMotionFunc(NULL);
    82. break;
    83. case GLUT_RIGHT_BUTTON:
    84. if (state == GLUT_DOWN)
    85. glutIdleFunc(spinDisplay2);
    86. if (state == GLUT_UP)
    87. glutIdleFunc(NULL);
    88. break;
    89. default:
    90. break;
    91. }
    92. }
    93. int main(int argc, char** argv)
    94. {
    95. glutInit(&argc, argv);
    96. glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
    97. glutInitWindowSize (250, 250);
    98. glutInitWindowPosition (100, 100);
    99. glutCreateWindow ("***- Assignment 2");
    100. init ();
    101. glutDisplayFunc(display);
    102. glutReshapeFunc(reshape);
    103. glutKeyboardFunc(tasten);
    104. glutMouseFunc(mouse);
    105. glutMainLoop();
    106. return 0;
    107. }
    Display All

    The post was edited 1 time, last by Bobby253 ().

  • Okay,
    hab die Lösung gefunden. Das Bild wurde nur neu gezeichnet, wenn die Maus gedrückt wurde. Deswegen hat sich
    nichts getan. Wenn ich ein glutPostRedisplay(); bei meiner tastenfunction einfüge geht es.
    Falls jemand das gleiche Problem hat...

    Trotzdem Danke.

    Vielleicht kann mir jemand erklären wie die glutmotionfunc genau funktioniert. Ich dachte das sie mir mit (int mousex, int mousey)
    die Position der Maus mitteilt, aber irgendwie stimmt das nicht ganz.

    Ich hätte gerne, dass wenn ich die Maus drücke und gedrückt halte und sie dann nach oben bewege, dass sich das Polyeder schneller dreht und wenn
    ich die Maus nachunten bewegen, dass es sich dann langsam dreht. (Bei dem Punkt an dem ich das erste Mal drücke (0,0) will ich Geschwindigkeit v und
    dann will ich dass sich die Geschwindigkeit linear ändert, das heißt das zum Beispiel bei (x,1) die Geschwindigkeit v+0.1*1 ist bei (x,2) die Geschwindigkeit
    v+0.1*2 ist usw.) Sorry ich hoffe, dass ist verständlich erklärt.

    was mein Program macht wenn ich die Maus überhalb meines Startpunktes in Bewegung halte wird die Geschwindigkeit erhöht (je schneller ich die
    Maus bewege desto schneller dreht es sich) Bwege ich die Maus unterhalb meines Startpunktes verlangsamt sich die Geschwindigkeit entsprechend. Bewege ich
    die Maus nicht (egal wo sie still steht) ist die Geschwindigkeit wieder normal v (meine Startgeschwindigkeit).

    Ich hoffe, man versteht was ich meine.

    Danke schon Mal für eure Hilfe