[r! - Artikel] BAM! - Das Partikelsystem hinter "Nullpunkt"

...rund um Gamedevelopment

Moderatoren: CrEEp3r, dragon

[r! - Artikel] BAM! - Das Partikelsystem hinter "Nullpunkt"

Beitragvon Fetze am 05.04.2010, 12:24

Effekte sind elementarer Bestandteil jeglichen Videospiels. Es macht einfach Laune, wenn alles explodiert, brennt, leuchtet und qualmt, erfreut das Auge und macht sich auf Screenshots immer gut. Darüber hinaus erfüllen Effekte allerdings mehr als einen Zweck.

Bild

Sie sind die Hauptträger der Resonanz auf die Aktionen und Handlungen des Spielers, seien es Explosionen zerstörter Fahrzeuge, das Mündungsfeuer einer Waffe oder die Funken getroffenen Metalls, wenn ein Projektil sein Ziel verfehlt. Sie geben dem Spieler eine Antwort auf die implizite "Was passiert, wenn ich.."-Frage ihrer Handlungen. Ebenso finden sie ihre Verwendung in der Gestaltung einer glaubwürdigen Spielumgebung: Prasselnde Feuer, unermüdliche Rauchsäulen und blinkende Kontrollleuchten sind genauso mitverantwortlich für die Szenerie wie ein ergreifender Soundtrack.

Bild

Doch was steckt hinter all diesen nur diffus als "Effekte" bezeichneten Konstrukten? Nun, in den allermeisten Fällen ist das der Bereich, in dem ein Schwall aus Partikelsystemen dem traditionellen Grafiker augenzwinkernd zunickt und sagt: "Hier übernehmen wir".

Der Grundgedanke dahinter ist, dass man komplexe Effekte nicht als solche modelliert sondern vielmehr aus einer größeren Zahl einzelner Komponenten zusammensetzt: Ein Lagerfeuer über tausende von Einzelgrafiken zu animieren und mithilfe eines einzelnen, platten Sprites darzustellen ist heutzutage einfach keine gute Idee mehr. Stattdessen ist es üblich, eine kleinere Auswahl von Feuer-Sprites zu entwerfen und das komplette Feuer dann aus einer mittelgroßen Anzahl dieser Sprites dynamisch zusammenzusetzen. Die einzelnen "Partikel" genannten Sprites werden, jeder für sich, parametrisiert, simuliert und grafisch übereinander gelegt. Den Punkt, ab dem sich die Feueranimation wiederholt, wird man so vergeblich suchen.


Das "Nullpunkt"-Projekt verwendet, wie in Hobbyprojekten oft der Fall, eine eigene Partikelengine. Für mich war es das dritte Effektsystem, das ich in meiner Hobbylaufbahn geschrieben habe und bisher ist es das beste, was ich persönlich in diesem Gebiet zustande gebracht habe. Es gibt, wie immer, viel Raum nach oben, aber ich bin nun an einem Punkt, an dem es auch genug Raum nach unten gibt, um mein Wissen in Form eines Artikels mit anderen zu teilen.
Bild

Das Effektsystem in Nullpunkt besteht aus vier wesentlichen Komponenten:

  • Das Partikelsystem:
    Jedes Objekt, das Effekte darstellen will, verwendet dazu ein eigenes Partikelsystem-Objekt. Ein Partikelsystem ist in aller Regel objektlokal und kümmert sich um die Simulation der Partikel und Effekte. Es ist das einzige Objekt, das von außen her angesprochen werden muss: Hier werden Effekte erstellt und von hier aus wird das Partikelsystem mit all seinen derzeit aktiven Partikeln dargestellt.
  • Der Effekt:
    Effekte sind die Regisseure im Partikeltheater. Sie koordinieren den zeitlichen Ablauf der Erstellung aller zu ihnen gehörigen Komponenten und kontrollieren sie während sie arbeiten. Im Speziellen sind dies Emitter (s.U.), Lichtquellen, Sounds und Ähnliches. Sie sind nicht verantwortlich für Partkel. Effekte sind im Partikelsystem zuhause und koexistieren dort ohne sich gegenseitig zu beeinflussen.
  • Der Emitter:
    Partikelemitter erstellen Partikel. Sie tun nichts anderes, aber Partikel erstellen können sie unglaublich gut. Beim erstellen werden die Partikel auch gleich parametrisiert. Wichtig ist an dieser Stelle, dass ein Emitter "seine" Partikel nicht verwaltet oder überhaupt kennt, denn das ist Aufgabe des Partikelsystems, welches sie zur optimierten Darstellung ("Single Surface") zentral verwaltet. Es ist für einen Emitter möglich, mehrere Partikeltypen unabhängig voneinander zu erstellen, als hätte man zwei Emitter mit unterschiedlichen Einstellungen. Außerdem können Emitter sowohl endlos existieren als auch in ihrer Lebenszeit begrenzt sein.
  • Der Partikel:
    Partikel sind die Atome der Partikelengine. Ihr Verhalten ist simpel und optimiert auf Geschwindigkeit: Einfache Rotation und Flugbahn, in variablem Maße an die Position oder Rotation des zugehörigen Partikelsystems geheftet und ansonsten auf ein Minimum an Daten und Logik reduziert.
Für Partikel, Emitter und Effekte gibt es weiterhin sogenannte Blueprints, Schablonen die, nach Typen gegliedert, bestimmtes Standardverhalten definieren. Ein Partikel-Blueprint enthält zum Beispiel seine physikalischen Eigenschaften, seine Grafik, etc.. Blueprinting ist aber ein Thema für sich und soll hier nicht weiter ausgebreitet werden.

Zeit, ein wenig konkreter zu werden. Wie sieht ein Standard-Explosionseffekt intern im Rahmen dieses Systems aus? Der Effekt an sich hat die folgende Form:

Code: Alles auswählen
[ParticleEffectBlueprint="Effect_Explo1"]
  [actions]
    [val0]
      emitterType = "Emitter_Explo1"
      sound = "Sfx\explo1"
      soundPitch = 0.8, 1.25
      camShakeStrength = 15
      camShakeRange = 700
      lightColor = 1, 0.4, 0.05, 1
      lightRange = 2000
      lightIntensity = 2, 2.5
      lightDuration = 1.75, 2.25
      lightZOffset = -75
      layer = Both
      intSoundVol = 0.5
    [/val0]
  [/actions]
[/ParticleEffectBlueprint]

Ein Effekt kann auf seiner internen Zeitlinie beliebig viele Aktionen ausführen. Dieser Effekt hat nur eine Aktion und da nicht anders überschrieben findet sie zum Zeitpunkt 0 statt. Ebenfalls da nicht anders überschrieben handelt es sich hier nicht um einen Loop-Effekt sondern um ein einfaches One-Time-Konstrukt. Er lässt die Kamera wackeln, wenn nah genug, erstellt eine Lichtquelle und gleichzeitig einen Sound und einen Emitter vom Typ "Emitter_Explo1". Ohne den Emitter zu kennen, tut sich da rein optisch noch nicht so viel: Wir hören einen Sound und sehen die Auswirkungen unserer temporären Lichtquelle. Wie sieht der Emitter aus? So:

Code: Alles auswählen
[ParticleEmitterBlueprint="Emitter_Explo1"]
  lifetime = 0.3
  [emissionGroups]
    [val0]
      particleType = "Particle_Explo1"
      particleLifetime = 1, 2.5
      emitSpread = 25, 75
      emitDelay = 0.2
      particleAttachRotation = False
      emitNum = 2, 3
      particleVelAngle = 0, 6.28
      particleVelLen = 0.5, 1
      particleTurnVel = -0.03, 0.03
      intEmitNum = 0.5
      intParticleLifetime = 0.5
      intEmitSpread = 0.5
      intParticleSize = 0.5
    [/val0]
    [val1]
      particleType = "Particle_ExploSparks1"
      particleLifetime = 0.75, 1.5
      intParticleLifetime = 0.5
      emitDelay = 0.2
      particleTurnVel = -0.01, 0.01
      intParticleSize = 0.5
      particleAttachRotation = False
    [/val1]
  [/emissionGroups]
[/ParticleEmitterBlueprint]

Lasst euch an dieser Stelle nicht von den Bäumen verwirren, sondern lieber den Wald erklären: Der Partikelemitter lebt 0,3 Sekunden lang. In dieser Zeit erstellt er zwei Ladungen zwei verschiedener Partikeltypen, die eine direkt bei seiner Erstellung, die andere 0,2 Sekunden danach. Die Partikel werden mittels Zufallsbereichen initialisiert und tummeln sich fortan im Partikelsystem.

Bild
Bei "Particle_Explo1" handelt es sich um einen animierten Partikeltyp, der eine einfache Explosion enthält, hier in einem Viertel der Originalgröße dargestellt. Die Partikel werden in zufälliger Rotation mit leicht zufälliger Skalierung erstellt und drehen sich während der Animation zusätzlich mit abnehmender Geschwindigkeit langsam um sich selbst, während sie ebenfalls mit abnehmender Geschwindigkeit langsam wegdriften. Das volle Programm der dynamischen Partikelanimation also, zusätzlich zur reinen Animation der Textur.

Bild
"Particle_ExploSparks1" hat keine animierte Textur, dreht sich nur langsam und bewegt sich nicht. Stattdessen beginnt dieser Partikeltyp mit minimaler Skalierung und dehnt sich dann rasant aus. Außerdem wird er bei seiner Erstellung zufällig-rot-orange eingefärbt und verliert bis zum Ende seiner Lebenszeit seinen gesamten Alphawert, fadet also bis zu seiner Löschung aus.

So könnte eine Explosion an einem Objekt aussehen, wenn man nur eine Überlagerung aus dem animierten Explosionspartikel verwendet:

Bild
An und für sich nicht schlecht, aber auch noch nichts besonderes. Ein großer Qualitätssprung lässt sich erreichen, wenn man beide Partikeltypen verwendet und es dem Partikeleffekt erlaubt, Partikel sowohl vor als auch hinter dem Objekt zu erstellen, wobei die jeweilige Ebene bei Erstellung zufällig gewählt wird:

Bild
Die Explosion wirkt nun nicht mehr wie "aufgeklebt" sondern so, als würde sie das Raumschiff tatsächlich umhüllen. Zwei Partikelebenen zu verwenden, ist ein einfacher, aber sehr effektvoller Kniff.

Betrachten wir noch einen weiteren Aspekt des Partikelsystems: Effektintensitäten. In "Nullpunkt" ist es möglich, jedem generierten Effekt eine Intensität zuzuweisen, die auch während der Effektlaufzeit noch problemlos geändert werden kann. Diese Intensität bestimmt über.. nunja, die Intensität des Effekts: Die Lautstärke und Reichweite seiner Sounds, die Leuchtkraft seiner Lichter, die Ausprägung seiner Emitter. Sicherlich sind euch bereits die ominösen intXY-Parameter in den Blueprints von Effekt und vor allem Emitter aufgefallen; sie sind der Schlüssel zur Intensitätsabhängigkeit von Effekten.
Jeder dieser Werte stellt einen Exponenten dar, der auf die Effektintensität hinsichtlich eines bestimmten Parameters angewandt wird. Mit diesem Exponenten lässt sich bestimmen, wie stark und auf welche Weise ein Parameter auf die Intensität des Effekts reagiert, beispielsweise die Skalierung erstellter Partikel oder deren Austrittsgeschwindigkeit. Um einen Faktor für einen dieser Parameter zu bestimmen, wird die einfache Formel Faktor = IntensitätParameter-Exponent verwendet.

Ein Beispiel:
Code: Alles auswählen
intParticleSize = 0.5
bedeutet so viel wie "Wenn die Intensität sich vervierfacht, verdoppelt sich die Skalierung emittierter Partikel".
Code: Alles auswählen
intEmitDelay = -1.0
heißt nichts weiter als "Wenn die Intensität sich verdoppelt, halbiert sich der Zeitabstand zwischen zwei Partikelemissionen".

Durch dieses einfache aber effektive System ist es möglich, Effekte wie die Antriebsstrahlen eines Raumschiffes dynamisch mit ihrer gegenwärtigen Antriebsleistung zu skalieren.
Bild
Es ist damit natürlich auch möglich, Explosionseffekte zu skalieren, um so für mehr Vielfalt zu sorgen oder im Rahmen der Content Integration einfach mal zu sagen "Ich will diese Explosion hier, aber nur ein Viertel so stark". Das findet insbesondere in den sogenannen DeathSequences der Raumschiffe einige Verwendung. Bei diesen simplen Ablaufskripten handelt es sich um die Choreographie ihres Ablebens, damit ein abgeschossener Jäger nicht einfach nur "Puff" macht sondern erst links ein bisschen explodiert, dabei sein Antriebssystem in Form von brennendem Schrott verliert, ins Schleudern gerät, und so weiter. Hier ein Auszug aus einer solchen DeathSequence:

Code: Alles auswählen
      [script]
        DisableControls
        CreateEffect "Effect_EngineFail1"
        ApplyTurnVel -0.0125, 0.0125
        Wait 0.75
        CreateEffect "Effect_ExploSmall1", (0, 0), (0.8, 1.25), (0, 0), (10, 25)
        CreateEffect "Effect_ExploSmall1", (0, 0), (0.8, 1.25), (0, 0), (10, 25)
        CreateEffect "Effect_DebrisShip1", 0, 0, 0.3, 0.4
        Wait 0.125
        ApplyTurnVel -0.025, 0.025
        Wait 0.5
        CreateEffect "Effect_Explo1", 0, 0, 0.8, 1.25
        CreateEffect "Effect_DebrisShip1", 0, 0, 0.8, 1.25
        Wait 0.5
        FadeOut
        MakeInvalidTarget
      [/script]

Die DeathSequences möchte ich hier allerdings nicht weiter ausbreiten, denn sie sind eigentlich kein Teil der Partikelengine und damit auch kein Teil dieses Artikels. Ich sprach eben aber auch über brennende Trümmer und die werden über die DeathSequence offensichtlich ebenfalls über einen Effekt generiert, der da heißt "Effect_DebrisShip1". Was sind diese Trümmer? Partikel? Das hätte den Nachteil, dass sie sich nur in XY-Ebene bewegen könnten. Viel effektvoller ist es doch, wenn die Trümmer auch "in die Kamera" und "die Tiefe des Alls" fliegen, sich also auf allen drei Achsen bewegen können!

Dies ist der Hauptgrund dafür, warum die brennenden Trümmer selbst wieder "echte" Objekte sind, die über einen Partikelemitter erstellt werden. Der einzige Grund, warum ich einem Partikelemitter soetwas erlaube ist der Umstand, dass BgObjects - die Basisklasse der von den Trümmern verwendeten BgSprites - als Hintergrundobjekte in keiner Weise mit den GameObjects oder miteinander interagieren können. Sie können allerdings wiederum eigene Partikelsysteme beherbergen, in denen ein "Brennende Spur aus Feuer"-Effekt erstellt wird.

Damit möchte ich langsam zum Ende kommen. Ich hoffe, ihr habt euch nicht beim Lesen gelangweilt und vielleicht ein paar Tipps und Tricks für eure eigenen Partikelsysteme und -effekte mit auf den Weg genommen.

Viel Erfolg
- Fetze
Benutzeravatar
Fetze


Beiträge: 81
Registriert: 17.03.2010, 17:43

Re: [r! - Artikel] BAM! - Das Partikelsystem hinter "Nullpun

Beitragvon The Lord of Programming am 06.04.2010, 15:47

Sehr schön, danke!
Das ging aber schnell ;)

Jetzt hab ich schon ne Idee davon, wie sowas aussehen könnte. Ich weiß auch schon, was ich als nächstes programmier :D
http://www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Benutzeravatar
The Lord of Programming
Site Admin


Beiträge: 556
Registriert: 27.12.2005, 02:41


Zurück zu Artikel / Bücher / Websites


Social Bookmarking
Bookmark bei: Mr. Wong Bookmark bei: Del.icio.us Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Newskick Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Protected by Anti-Spam ACP Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Style by Webdesign www, książki księgarnia internetowa podręczniki