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 Partikelwhile (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.