Partikelsystem

Aus DGL Wiki
(Weitergeleitet von Partikelsysteme)
Wechseln zu: Navigation, Suche
Hinweis: Dieser Artikel wurde von den Benutzern des Wikis zum exzellenten Artikel berufen!
(weitere exzellente Artikel)
Excelent.jpg

Partikelsysteme

Partikel feuer.png

Partikelsysteme sind Grafikeffekte die aus vielen, meist primitiven, voneinander unabhängig berechneten Einzelteilen (Partikeln) bestehen. Bei den Effekten die man mit Partikelsystemen simuliert (oder erzielen möchte) handelt es sich üblicherweise um Objekte die nicht (oder nur schwer) durch ein Polygonmodell darstellbar wären. Typische Anwendungsfälle sind:

  • Wasser (vom Gebirgsbach bis zum Springbrunnen)
  • Feuer
  • Rauch
  • Wolken
  • Nebel
  • Explosionen
  • Feuerwerke
  • Wetter (Schnee und Regen)

Also primär Objekte wo nicht nur die Oberfläche interessant ist, sondern das gesamte Volumen.

Darstellung eines Partikels

Üblicherweise werden Partikel als Billboards dargestellt. In manchen Fällen sind aber Punkte (mit GL_POINTS, Point Sprites) oder Linien (mit GL_LINES) auch ausreichend. Da Partikel häufig transparent sind, muss man beim Zeichnen etwas achtsam sein. Eine Tiefensortierung ist bei 100en Partikeln nicht mehr allzu schnell. Aus diesem Grund werden Partikelsysteme meist gerendert ohne in den Tiefenpuffer zu schreiben. Dies wird mittels glDepthMask(GL_FALSE) erreicht.

Typische Eigenschaften eines Partikels

Position Jedes Partikel hat eine eigene Position. Dabei wird nicht auf Kollisionen mit anderen Partikel geachtet. Auf Kollisionen mit der Umgebung kann aber sehr wohl geachtet werden, auch wenn dies häufig sehr rechenintensiv ist.

Geschwindigkeit und Richtung Üblicherweise durch einen Vektor dargestellt. Gibt an wie weit und in welche Richtung sich das Partikel bewegen würde wenn 1 Sekunde vergangen wäre. Aber auch die Geschwindigkeit kann sich im Laufe der Zeit ändern, beispielsweise durch Gravitation oder auch Kollision.

Farbe Die Farbe und vor allem die Änderung der Farbe innerhalb der Lebensspanne eines Partikels ist bei vielen Effekten ein essentieller Bestandteil.

Transparenz Damit ein Partikel am Ende seiner Lebensspanne nicht einfach verschwindet, kann man Transparenz verwenden um es langsam sterben zu lassen. Natürlich kann man den Transparenz Wert aber auch für andere Dinge gebrauchen wenn einem der Sinn danach steht.

Größe Ein Partikel langsam kleiner werden zu lassen ist auch eine Möglichkeit damit es nicht von einem Augenblick auf den nächsten verwschindet. Jedoch beispielsweise für Rauch wird man (genau umgekehrt) die Partikel je nach Alter vergrößern.

Alter Partikel werden laufend generiert, damit jedoch nicht unmengen Partikel entstehen müssen sie mit der Zeit auch wieder gelöscht werden. Der Zeitpunkt wann ein Partikel wieder gelöscht wird, wird meist anhand seines Alters fest gelegt. Jedoch auch zur Bestimmung aller anderen Werte kann man wenn man möchte das Alter verwenden (Beispielsweise die Rauchpartikel immer größer, jedoch immer transparenter im Laufe der Zeit).

Rotation Vor allem bei großen Partikeln (wo ein Partikel beispielsweise eine eigene kleine Rauchwolke (als Textur) ist) bringt eine Rotation einiges an Realismus ein.

Erzeugen von Partikeln

Tutorial Partikel1.gif

Auch beim Erzeugen der Partikel hat man viele Gestaltungsmöglichkeiten. So kann man als Startposition immer einen Punkt angeben, einen Bereich (eine Kugel, einen Quader, ...) oder wenn man möchte sogar die Oberfläche eines beliebigen anderen Objektes. Und auch alle anderen Eigenschaften des Partikels werden innerhalb eines bestimmten Bereiches (oder auch fix) festgelegt.

In der Filmindustrie werden auch häufig hierarchische Partikelsysteme verwendet, bei denen jedes Partikel wiederum ein eigenständiger Erzeuger von Partikeln sein kann (erstmals im Genesis Effekt in "Star Trek II - Der Zorn des Khan").

Verwalten der Partikel

Ein häufiger Fehler der bei Partikelsystemen gemacht wird ist, dass ein Partikel als Objekt mit Funktionen zum animieren und zeichnen ausgestattet wird. Obwohl es weniger dem objektorientiertem Denken entspricht, kann einem das berechnen aller Partikel innerhalb einer Funktion eine menge Zeit sparen.

Eine gängige Möglichkeit Partikel zu Verwalten ist ein Feld (array) oder mit einer Liste (TList) wenn die Anzahl der Partikel nicht fest ist. (Für Infos siehe Delphihilfe zu "TList".)

const
maxPartikel = 100;
type
TPartikel = record
    Pos   : TVector3f;
    Richt : TVector3f;
    Farbe : TVector3f;
    Alpha : real;
    Alter : integer;
 maxAlter : integer;
 RotAchse : TVector3f;
   Winkel : real; //Kann auch über globale Variable gemacht werden.
end;  

TPartikelFeld = array[1..maxPartikel] of TPartikel;

oder

TPartikelList = TList;
PTPartikel = ^TPartikel;

var PList : TPartikelList;
    PPartikel : PTPartikel;
    i : integer;
       
begin
      PList := TPartikelList.Create;
      for i := 1 to 20 do
      begin
         new(PPartikel);
         // Eigenschaften zuweisen
         PPartikel^.Alter := 0;
         ...
 
         // An die Liste hängen
         PList.Add(PPartikel);
      end;
end;


Während der Lebensspanne eines Partikels können natürlich alle Eigenschaften geändert werden. Die Geschwindigkeit wird häufig durch Graviation und ähnliches modifiziert. Die Position wird durch die Geschwindigkeit modifiziert. Andere Werte werden nach belieben geändert. Dies kann sowohl eine lineare Änderung, eine lineare Interpolation zwischen einigen gegebenen Werten als auch jede andere Funktion sein.

Optimierungen

Da die Bahnberechnung vieler Partikel unter Umständen recht lange dauern kann (> 1ms), ist es außerdem eine Überlegung wert, diese Berechnungen in einen anderen Thread zu verlagern. Somit wird die Hauptanwendung nicht blockiert und beim Zeichnen des Partikelsystems müssen nur noch die bereits fertig berechneten Vertex-/Punktdaten an die Grafikkarte gesendet werden. Außerdem ist dies unter anderen ein sinnvoller Ansatz zur Auslastung der immer weiter verbreiteten Mehrprozessorsysteme.


Siehe Auch