Partikel und Debris sind beides viele kleine Teile welche für eine beschränkte Zeit leben und sich anhand von physikalischen Regeln durch die Welt bewegen.
Mit Partikel können wir Effekte wie Rauch, Feuer oder Explosionen erzeugen. Debris simuliert einen zerfallenden Block.
Partikel sind für die Engine ganz simple Quadrate (zwei aneinandergeheftete Dreiecke), welche sich immer zur Kamera drehen und eine Textur "abspielen". Mit abspielen ist gemeint, dass ein Partikel über seine Lebenszeit von links oben nach rechts unten auf einem Textur Atlas wandert und die verschiedenen Texturen ineinander überblendet.
Um Effekte möglichst realistisch aussehen zu lassen, haben wir bemerkt, dass eine gute Portion Zufall notwendig ist. Partikel werden mit einer Variation in Richtung, Geschwindigkeit, Lebensdauer, Grösse und Rotation generiert. Je nach Effekt können diese Werte angepasst werden, bis das gewünschte Resultat erzielt ist.
Um etwa die oben gezeigte Schockwelle zu erzeugen generieren wir viele, schnelle Partikel über eine kurze Zeit und erzeugen die Richtungsvektoren der Partikel auf einer Ebene mit zufälliger Rotation um den Normalvektor zur Ebene am Ursprungspunkt.
Der Bewegungspfad der Partikel hängt neben den oben beschriebenen Eigenschaften ebenfalls vom Einfluss der Schwerkraft auf die Partikel ab. Während eine Explosion nicht von der Schwerkraft beeinflusst ist, wird Rauch mit einem negativen Gravitationsfaktor leicht nach oben schweben.
Textur Atlas für die Explosion, Shockwelle und Shrapnel.
Beim graben nach unten fällt der Schutt mit und ein Teil stürzt nach vorne in die Tiefe.
Debris, oder auf Deutsch Schutt, entsteht wenn einer der Blocks in unserer Welt zerstört wird. Da wir ohnehin schon physikalische Eigenschaften unserer Blocks wie Härte, Dichte, Volumen, etc. definiert haben, entscheiden wir uns für ein simples Physik-System um das Zerfallen der Blocks zu simulieren.
Debris verhält sich sehr ähnlich wie Partikel, mit dem Unterschied, dass es statt gedrehte Viereck dreidimensionale Würfel sind mit einer statischen Textur. Es sind im Prinzip kleinere Kopien ihrer Ursprungsblocks und sie brauchen deshalb auch keine eigenen Shader oder Renderer.
Wird ein Block zerstört, werden solange kleine Blocks mit zufälligem Volumen, Spin (Rotationsvektor), Richtung, Position (innerhalb des Ursprungsblocks) und Lebensdauer erstellt, bis die totale Masse des Debris einen fixen Teil der Masse des Blocks erreicht hat. Das Debris erhält einen kleinen Bias in die Richtung "weg von der Wand" und jedes Trümmerteil wird individuell von der Schwerkraft nach unten gezogen unter Berücksichtigung des Materials (Dichte) und Volumen (Masse). Grosse Goldtrümmer fallen viel schneller als kleine Erdpartikel, welche mit genügend kleinem Volumen sogar schweben können.
Kommt ein Schuttteil in die Nähe eines anderen Blocks, berechnen wir die Kollision und frieren das Partikel ein solange es mit dem Block kollidiert.
Physiksysteme sind sehr mächtig um dem Spiel eine grosse visuelle Aufwertung zu geben. Ausserdem macht sogar Vektorenmathe plötzlich riesen Spass, wenn es darum geht Schockwellen zu designen!
Es gibt mit unseren Ansätzen noch viel zu optimieren und ein besseres Kollisionssystem wäre wünschenswert, doch vorerst werden wir uns anderen Dingen zuwenden. Nächste Woche ist für die Engine geplant, Lichteffekte ins Spiel zu bringen. Neben der Engine liegt die volle Aufmerksamkeit auf dem Netzwerkprotokoll.
Zum Abschluss natürlich ein kurzes Video mit allen beschriebenen Systemen im Einsatz!
Partikeleffekte und Debris in unserer Spielwelt.