openGL: Zufällig angeordnete Punkte zeichnen
-
Hallo zusammen,
ich bin auf dieses Forum gestoßen, da ich gerade etwas Hilfe mit openGL in C gebrauchen könnte. Es wäre super, wenn mir jemand helfen könnte.
Mein folgendes C Code-Schnipsel soll 10 zufällig platzierte Punkte auf einem Fenster mit der Größe 640x480 zeichnen.
int getRandomVal(int max) { srand ( time(NULL) ); //initialize random generator return rand() % max; } static void DrawStars() { // Draw random stars int i; float pos[2]; for (i=0; i<10; i++) { pos[0]=getRandomVal(640); //x pos[1]=getRandomVal(480); //y glPointSize(2.4); glBegin(GL_POINTS); glColor3f(1.0, 1.0, 1.0); glVertex2f(pos[0], pos[1]); glEnd(); glFlush(); } }
Leider zeichnet mein Programm in diesem Code-Schnipsel nur genau einen Punkt (nicht 10). Dadurch, dass mittels glutSwapBuffers() und glutMainLoop() alles ständig wiederholt wird, blinkt dieser Punkt ständig an verschiedenen Stellen kurz auf.
Ich habe quasi folgende beiden Fragen:
- Wieso zeichnet dieser Code nur einen Punkt und nicht 10 Punkte auf einmal?
- Wie kann ich sicherstellen, dass die Funktion DrawStars() nur genau einmal (bei der initialisiertung) aufgerufen wird (trotz Endlosschleife: glutMainLoop())?
-
Siegfried1 schrieb:
- Wieso zeichnet dieser Code nur einen Punkt und nicht 10 Punkte auf einmal?
Weil du 10 mal den gleichen Punkt zeichnest. Du solltest den Zufallszahlengenerator nur einmal am Anfang initialisieren und nicht für jede Zahl wieder aufs Neue.
glBegin und glEnd können übrigens aus der Schleife raus, und glFlush brauchst du nicht aufzurufen.Wie kann ich sicherstellen, dass die Funktion DrawStars() nur genau einmal (bei der initialisiertung) aufgerufen wird (trotz Endlosschleife: glutMainLoop())?
Indem du sie nur einmal (bei der Initialisierung) aufrufst?
Wenn du damit nichts anfangen kannst, musst du mehr Code zeigen.
-
oh ja! Frage 1 hat sich gerade kurz nachdem ich auf Absenden geklickt habe, beim nochmaligen Durchlesen, von selbst erledigt
Dieses Problem ist schon mal gelöst.
Zur zweiten Frage: Hier meine main Methode:
int main (int argc, char **argv) { // Glut Init glutInit( &argc, argv ); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowPosition(200, 0); glutInitWindowSize(640, 480); glutCreateWindow("Blank GL window"); init(); // Set Callbacks glutDisplayFunc(DisplayFunc); glutKeyboardFunc(KeyboardFunc); glutReshapeFunc(ReshapeFunc); glutIdleFunc(IdleFunc); //DrawInit(); glutSwapBuffers(); glutMainLoop(); return 0; }
In welchen Bereich würdest du sie reinsetzen? Ich hatte sie schon in der init() und direkt in der main() aufgerufen. Mir kommt es so vor, als sei der komplette Code in einer Endlosschleife, so dass es gar keinen Unterschied macht wo sie drin steht
-
Reicht es nicht, die Funktion anfangs
main()
aufzurufen? Sonst geh mal mit dem Debugger durch und schau, woher dein Eindruck einer Endlosschleife um die gesamtemain
-Funktion kommt. Oder überprüf ihn mit einfachen Konsolenausgaben. Wobei fast höhere Mächte im Spiel sein müssen, sollte sich dein Verdacht bestätigen...
-
Nexus schrieb:
Reicht es nicht, die Funktion anfangs
main()
aufzurufen?Nein. Allerdings sieht das Sternenbild mit vielen blinkenden Sternen auch ganz nett aus