GLUT. Objekte rotieren
-
Hallo,
Anbei ein kleiner Sourcecode, der auf dem Bildschirm eigentlich ein Quadrat, das sich um die X-Achse rotieren sollte, ausgeben sollte. In der Realität aber ist ein Quadrat zu erkennen, das sich garnicht dreht.
Kommisch ist aber: Wärend ich das Konsolenfenster gedrückt halteund verschiebe, rotiert sich das Quadrat im openGL Fenster doch, so wie es sollte.Warum der Scheiß?
#include <iostream> #include <stdlib.h> #include <GL/glut.h> using namespace std; GLuint tex; void handleKeypress(unsigned char key,int x, int y) { switch (key) { case 27: exit(0); } } void initRendering() { glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); } void handleResize(int w, int h) { glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0,(double)w / (double)h,1.0,200.0); } float rot=0.0f; void drawScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-10.0f); glRotatef(rot,1.0f,0.0f,0.0f); glBegin(GL_QUADS); glTexCoord2f(0,0); glVertex3f(-1.0f,-1.0f,0.0f); glTexCoord2f(1,0); glVertex3f(1.0f,-1.0f,0.0f); glTexCoord2f(1,1); glVertex3f(1.0f,1.0f,0.0f); glTexCoord2f(0,1); glVertex3f(-1.0f,1.0f,0.0f); glEnd(); rot = rot+5.0f; glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("CFLD"); initRendering(); glutDisplayFunc(drawScene); glutKeyboardFunc(handleKeypress); glutReshapeFunc(handleResize); glutMainLoop(); return 0; }
-
Das ist ein typischer Anfängerfehler: Deine Display-Funktion wird ja nur aufgerufen, wenn Bedarf besteht, das Fenster neu zu zeichnen. Das passiert u.a. bei Bewegung des Fensters. Um ein permanentes Neuzeichnen zu erreichen, benutzt Du entweder die Idle-Funktion und rufst dort glutPostRedisplay auf oder besser benutzt Du einen Timer (glutTimerFunc), der z.B. alle 30 ms ein Neuzeichnen durchführt.
-
Dankeschön, hab jetzt glutTimerFunc benutzt!
Tja, das passiert eben, wenn man glut benutzt, sich aber davor nicht richtig durchgelesen hat, was die einzelnen Funktionen genau machen.
Was immernoch komisch ist, dass glutDisplayFunc eine Funktion mit keinem Arument erwartet, während glutTimerFunc eine Mit einem Integerargument erwartet. Deswegen kann man die DrawScene-Funktion nicht als TimerFunc UND als DisplayFunc registrieren.
Weil glutDisplayFunc aufgerufen werden MUSS, hab ich das so gemacht:void Shit() { } ... glutDisplayFunc(Shit); ...
-
Du sollst ja auch nicht in der Timer-Funktion zeichnen, sondern dort lediglich das Zeichnen aufrufen (mittels glutPostRedisplay)!
Sonst würde ja nur alle soundsoviel ms gezeichnet werden, nicht aber, wenn z.B. das Fenster bewegt wird!