Partikelsystem unter OpenGL(C++)



  • Hallo,Zusammen.
    Ich habe jetzt angefangen meine Engine unter OpenGL zu Programmieren.
    Jetzt bin gerade dabei ein Partikelsystem zu entwerfen.Dabei habe ich bei
    Feuer angefangen.
    Also es funktioniert auch schon.Es werden einzelne rote Punkte erzeugt(später,wenn
    ich soweit bin werde ich natürlich Texturen verwenden),die
    sich bestimmt bewegen,usw.Falls ihr folgenden Quellcode selber ausprobieren
    wollt,müsst ihr folgendes tun:
    -ein Fenster mit allem drum und dran Programmieren
    -OpenGL in ein neues oder altes Projekt einbinden
    -OpenGL aktivieren(Können nur die,die OpenGL beherrschen,also zumindest die Grundlagen)
    -In der Hauptschleife Rendern
    -Leere Header-Datei erstellen und folgenden Quellcode in sie einfügen.
    -In der Hauptschleife Funktuion "srFeuerstarten" aufrufen mit allen Parametern(s.Unten
    für ein Beispiel)

    Falls ihr dies nicht könnt/wollt,könnt ihr ja trotzdem auch versuchen den Quellcode zu verstehen.
    Nun zu meinem Problem:
    Es funktioniert eigentlich so wie es auch sein sollte.
    Nur kann ich nur ein Feuer erstellen,da ich 2 Globale Variablen,zum Speichern der Informationen
    von einzelnen Partikeln erstellt habe.
    Und von der Funktion nur auf diese zugreifen kann.
    So werden bei mehrfachem aufrufen,z.B. die Partikel schneller.
    Wisst ihr eine Lösung,z.B. mit erstellen von Strukturen?
    Dann bitte antworten.

    Quellcode

    //////////////////
    //Partieklsystem//
    //////////////////

    /////////
    //Feuer//
    /////////

    //Die 2 Globalen Variablen 😞
    //Die Größe der beiden Felder hätte auch größer und kleiner sein können
    float Partikelleben[100000];
    float Partikelposition[100000][3];

    //Funktion zum Anzeigen des Feuers
    void srFeuerstarten(int Partikelanzahl,float Groesse,float Leben,
    float PosX,float PosY,float PosZ,
    float BeschX,float BeschY,float BeschZ)
    {
    Leben *= 10; //Partikellebensdauer
    Groesse /= 100000.0f; //Größe des Feuers
    int Partikel = 1; //Aktueller Partikel

    while (Partikel <= Partikelanzahl) //Während noch nicht alle Partikel aktualisiert sind,...
    {
    if (Partikelleben[Partikel] <= 0.0) //Wenn die Lebensdauer des aktuellen Partikels überschritten wurde,...
    {
    glColor3d(1.0,0.0,0.0); //Rote Farbe
    //Neue Partikelposition
    Partikelposition[Partikel][1] = float(rand() % 2000 - 1000) * Groesse + PosX;
    Partikelposition[Partikel][2] = float(rand() % 2000 - 1000) * (Groesse * 1.5) + PosY;
    Partikelposition[Partikel][3] = float(rand() % 2000 - 1000) * Groesse + PosZ;
    glBegin(GL_POINTS); //Punkt zeichnen
    glVertex3d(Partikelposition[Partikel][1],Partikelposition[Partikel][2],Partikelposition[Partikel][3]);
    glEnd(); //Enden von Punkt zeichnen
    Partikelleben[Partikel] = Leben; //Volles Leben für aktuellen Partikel
    Partikel ++; //Nächster Partikel
    }
    else //Wenn aktueller Partikel noch Leben besitzt,...
    {
    glColor3d(1.0,0.0,0.0); //Farbe Rot
    //Bewege aktuellen Partikel
    Partikelposition[Partikel][1] += float(rand() % 200 - 100) / (10000 / BeschX);
    Partikelposition[Partikel][2] += float(rand() % 100) / (10000 / BeschY);
    Partikelposition[Partikel][3] += float(rand() % 200 - 100) / (10000 / BeschZ);
    glBegin(GL_POINTS); //Zeichne Punkt
    glVertex3d(Partikelposition[Partikel][1],Partikelposition[Partikel][2],Partikelposition[Partikel][3]);
    glEnd(); //Enden von Punkt zeichnen
    Partikelleben[Partikel] -= float(rand() % 10) / 10; //Senke Leben,des aktuellen Partikels
    Partikel ++; //Nächster Partikel
    }
    }
    }

    In Hauptschleife:
    srFeuerstarten(1000,1.0,2.0,0.0,0.0,0.0,1.0,1.0,1.0); //Es können auch andere Parameter angegeben werden



  • Pack das mal in Codetags und lern OOP.



  • Nathan schrieb:

    Pack das mal in Codetags und lern OOP.

    Bis auf das mit den Codetags ein bescheuerter Kommentar... 🙄

    @TE
    http://www.opengl-tutorial.org/
    Bitte arbeite das mal durch. Das ist modernes OpenGL.
    Mit glBegin und glEnd arbeitet man schon seit Jahren nicht mehr.
    Ausserdem solltest du für Partikel Pointsprites verwenden.


Log in to reply