[Newbiefrage] Theorie: Logischer Aufbau von Animationen nach Usereingaben



  • Hi,

    ich lerne grade Stück für Stück C++, OpenGL und SDL, alles mehr gleichzeitig als nacheinander, und bisher habe ich dabei immer nur Würfel und Pyramiden, mal bunt - mal mit Texturen, erstellt die sich um ihre eigenen Achsen drehen, näher oder weiter Zoomen, und das entweder Automatisch oder via Tastendruck. Und darum drehen sich jetzt meine Gedanken. Bisher hatte ich immer Globale Variablen, z.B. float xRot, in denen ich einen Wert gespeichert habe um wieviel sich die Matrix drehen soll bevor ich den Würfel zeichne. Bei jedem durchlauf habe ich dann diesen Wert entweder automatisch erhöht oder aber nur dann wenn eine Taste gedrückt wurde. So hat sich der Würfel dann gedreht. Mein Code war dabei so aufgebaut:

    #Include <...>
    
    GlobaleVariable ...;
    
    //main
    {
    FensterÖffnen;
    
    //schleife
    {
    EventsAbfragen();
    SzeneZeichnen();
    }
    
    Programm beenden;
    }
    
    //EventsAbfragen()
    {
    Wenn (Taste ... gedrückt)
    {
    GlobaleVariable ... += ...;
    }
    }
    
    //SzeneZeichnen();
    {
    MatrixDrehenUm (Globale Variable ...);
    WürfelZeichnen;
    }
    

    Ich denke mir jetzt dass das recht schnell kompliziert wird sobald man z.B. mehrere Objekte hat die sich bewegen? Zudem lese ich immer das Globale Variablen sowieso schlechter Stil sind? Daher überlege ich grade wie man es denn anstellt wenn man z.B. folgendes Realisieren will:

    Ich erstelle einen Würfel und möchte das er sich nach dem drücken der Taste A solange bei jedem durchlauf um 5° dreht bis ich die Taste B drücke. Ich stehe grade vielleicht auf dem Schlauch aber ich kann mir nicht vorstellen das zu realisieren ohne Globale Variablen. Ich würde halt bei jedem durchlauf von EventsAbfragen() überprüfen ob A gedrückt wurde. Dann eine Globale Variable "Rotieren" auf true setzten und bei Taste B diese Variable auf false. Solange Rotieren dann true ist würde ich die Globale Variable zum drehen der Matrix erhöhen.

    Das machen dann ja schon 2 Globale Variablen nur für eine Achse des Würfels. Wenn ich das jetzt z.B. mit 2 Würfel machen möchte, die sich unabhängig voneinander drehen und das sogar um alle 3 Achsen können sollen. Da explodieren ja förmlich die Anzahl der Variablen?

    Mir geht's jetzt nicht um konkrete Codebeispiele, ich möchte nur mal einen Schubs in die richtige Richtung. Wie geht man es an, wenn man viele Objekte hat die sich völlig unabhängig voneinander je nach Usereingabe bewegen sollen? Ich dachte jetzt z.B. an ein struct welches für die jeweiligen Objekte deren Position auf der X, Y, Z Achse speichert und deren Drehung auf der jeweiligen Achse. Ist das der richtige Ansatz? So könnte ich realisieren das er bei jedem Tastendruck den jeweiligen Wert anpasst. Aber wie würde ich es hinbekommen das er das bei jedem durchlauf macht solange keine Taste gedrückt wurde die das aufhebt? Oder wenn ich möchte das er nach dem drücken einer Taste 10 Durchläufe lang den Wert ändert? Und bei einem anderen Objekt nur 5 Durchläufe lang?

    Das ist für mich alles irgendwie höchst kompliziert und ich hoffe ich bin überhaupt im richtigen Forum gelandet? 🙂

    Wie geht man so etwas an? Userinteraktion? 🙂 Ist es überhaupt der richtige Weg erst alle Events abzufragen und danach zum Zeichnen überzugehen? Oder fragt man Usereingaben wärend des Zeichnens ab? Das kann ich mir irgendwie aber grade nur schwer vorstellen.

    Eventuell hat ja jemand einen Tipp für mich oder sogar ein Tutorial was sich damit beschäftigt? Es geht mir wie gesagt erstmal vor allem um die Logik die dahinter steckt. Ich will's einfach verstehen. Sicher, für meinen drehende Würfel ist das was ich bisher mache völlig ausreichend, aber ich will ja auch nicht ewig drehende Würfel schreiben... 😉

    Gruß Daniel

    PS: Ich habe das jetzt einfach mal so aus meinem wirren Kopf zu "Papier" gebracht. Ich hoffe ihr versteht überhaupt was ich meine? 😃



  • Die Antwort kommt recht spät, weiß nicht ob sie noch von Interesse ist.

    Also, ob globale Variable oder das altbekannte goto gut oder schlecht sind, möchte ich nicht ausdiskutieren. Alles hat mit Sicherheit seine Daseinsberechtigung.

    Was für dich ein Zauberwort sein könnte wären Objekte.
    Statt rotX, rotY, rotZ, posX, posY, posZ etc. kann man sich aus allem ein Objekt basteln. Das reduziert die Variablen erheblich und ist wesentlich übersichtlicher.
    Alle benötigten Variablen sind dann in dem Objekt zusammengefasst.

    In einer 3D-Umgebung könnte es das Objekt Kamera geben. Ein Würfel wäre auch ein Objekt usw.

    Die Animation läuft kontinuierlich und nicht erst bei einem Tastendruck. Hierzu werden die Events für Taste gedrückt und Taste losgelassen unterschieden. Der Refresh läuft parallel immer weiter.



  • Hi, danke, mein Thread war mir schon selbst fast in Vergessenheit geraten... 🙂 Hab mir mittlerweile sowas dann auch schon Gedacht nachdem ich ein wenig weiter mich mit C++ beschäftigt habe. Als Anfänger ist es immer schwer sich bestimmte Sachen zu überlegen wenn man im Grund nichtmal alle Möglichkeiten kennt die einem die Sprache so bietet. *gg* 😞

    Danke und schönen Tag noch 🙂


Anmelden zum Antworten