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.


Anmelden zum Antworten