kleine OpenGL-Animation
-
ich möchte eine kleine Animation programmieren, bei der sich eine vertikale Linie
von links nach rachts (ruckelfrei) pber den Screen bewegt. Wie funktioniert das?#include <windows.h> #include <GL/glut.h> #include <cstdlib> void init(void) { glOrtho(-100,100,-100,100,-100,100); glClearColor(0.0,0.0,0.0,0.0); } // void display(void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3f(1.0,1.0,1.0); glVertex2f(-95,95); glVertex2f(-95,-95); glEnd(); glFlush(); } // int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(900, 600); glutInitWindowPosition (50, 50); glutCreateWindow(""); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }
-
Nimm die Zeit, die in ein Frame braucht und bewege die Linie
immer um v * framezeit.
-
> Wie funktioniert das?
indem du die Linie abhängig von der Zeit von links nach rechts verschiebst - ob das ruckelfrei funktioniert hängt von deinem Rechner ab
an die Zeit kommst du am einfachsten unter Windows mit der Funktion:
timeGetTime() – MSDN: The timeGetTime function retrieves the system time, in milliseconds. The system time is the time elapsed since Windows was started.ANSI C Konform ist die Funktion clock()
-
Da habe ich auch eine Frage.
Es gibt ja auch Wrapperklassen/Funktionen die
einem eine einheitliche Methode/Funktion bieten
um z.b. die Zeit zu messen.
So daß der eigene Code nicht mehr ganz speziell
das Betriebsystem abgestimmt sein muß.Die Frage ist nun, verliert man gerade durch solche Wrapperfunktionen viel Zeit?
Insbesondere da es hier um fps geht oder ist das nicht der Rede wert?
-
du solltest anstatt GL_SINGLE, GL_DOUBLE nehmen ist glaub ich für double buffering...dann klebst du noch ein SwapBuffers() in deine renderfunktion und lässt den bildschirm mit irgendwas wie postredisplay() neuzeichnen....irgendwie so sollte das funktionieren
bye
-
#include <windows.h> #include <GL/glut.h> #include <cstdlib> #include <iostream> // float i=0.0; // void init(void) { glOrtho(-100,100,-100,100,-100,100); glClearColor(0.0,0.0,0.0,0.0); } // void display(void) { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_LINES); glColor3f(1.0,1.0,1.0); glVertex2f(-85+i,95); glVertex2f(-85+i,-95); glEnd(); glFlush(); glutSwapBuffers(); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); } // int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(900, 600); glutInitWindowPosition (50, 50); glutCreateWindow(" "); init(); glutDisplayFunc(display); glutMainLoop(); return 0; }
und wo genau muß ich jetzt die glutPostRediplay()-Schleife aufrufen?;
wenn ich daß vor glutMainLoop() mache klappts nich, danach auch nich?
-
das muss in deine display funktion rein :)also nach dem swapbuffers
-
es gibt eine glutTimerFunc. in der Func die du dieser übergibst, mußt du das Postredeisplay aufrufen.
-
da mußt du auch dein i erhöhen
-
> Die Frage ist nun, verliert man gerade durch solche Wrapperfunktionen viel Zeit
1. Regel – um die wesentlichen Dinge kümmern
Bei diesem Problem würde ich einfach die einfachste Möglichkeit wählen die Zeit festzustellen – da die Zeitmessung hier nicht das wesentliche Problem darstellen sollte – in der Regel schreibt man eigenen Code der über Funktionen wie timeGetTime die Zeit ermittelt und zurückgibt – diese Funktion kann dann später, wenn das wesentliche Problem gelöst ist weiter optimiert werden – z. B. Zeitermittlung mit QueryPerformanceCounter usw.