Sauerbraten Fork

SauerFork is a new project to fork Sauerbraten. 15 developers and artists attend to the team. The goal is to stay as sauer-like as possible while adding new features and renewing everything which blocks future progress and creativity.

The official Blog and the activity log:

http://sauerfork.tk/
http://sauerfork.tk/activity

Interview of the SauerWorld team with the SauerFork team:

http://www.sauerworld.org/sauerfork-interview/

Source code and the wiki:

https://github.com/sauerbraten-fork/sauerbraten-fork

Videos by me (Particle System):

In this stage the videos shows mostly the technical implementation… The art comes later 🙂











Videos by others of the team:



Implementation einer Software zur Simulation und Visualisierung von Partikeln

Minimal Rendering_2013-01-15_07-28-19

Diese Arbeit beschreibt die Implementierung einer Software zur Simulation von Partikeln. Dabei wurde auf eine hohe FlexibilitÀt Wert gelegt, die es erlaubt, zahlreiche Szenarien zu kreieren. Sowohl das Partikelsystem als auch die Darstellung sind, wie ein Baukastensystem, kombinierbar, konfigurierbar und erweiterbar. Die Software gibt dem Benutzer nichts vor, sondern fordert seine KreativitÀt heraus. Sie leistet einen Beitrag zu Forschungsprojekten.

1. Einleitung

In vielen Filmen, Computerspielen und Simulationen stellt sich die Frage, wie man natĂŒrliche Systeme wie beispielsweise Feuer oder Rauch darstellen kann. Aufgrund ihrer KomplexitĂ€t oder ihres chaotischen Verhaltens ist die Umsetzung nicht trivial.

Partikelsysteme sind Verfahren, um möglichst realistisch aussehende Darstellungen zu erzielen. Zum ersten Mal wurden Partikelsysteme von William T. Reeves im Jahr 1982 fĂŒr den Kinofilm “Star Trek II – The Wrath Of Khan” eingesetzt und 1983 in [Ree1983] beschrieben und 1985 in [Ree1985] ergĂ€nzt [Paet2005].

Im Kern basieren Partikelsysteme auf dem Grundsatz, etwas Großes aus einer Menge von kleinen Elementen zu erschaffen. Der Funkenregen beim Schweißen bildet sich aus einer Vielzahl von einzelnen und kurzlebigen Funken. Dabei geht es bei Partikelsystemen nicht um eine physikalisch korrekte Simulation von beispielsweise Explosionen, sondern um den Gesamteindruck [Hel2009].

AnwendungsfĂ€lle fĂŒr Partikelsysteme gibt es viele: beispielsweise Feuer, Rauch, Regen oder Schnee. Doch die meisten konkreten Implementierungen von Partikelsystemen sind fĂŒr einen spezifischen Einsatz gedacht. Daher haben sie ein eingeschrĂ€nktes Einsatzfeld. Der Grund dafĂŒr ist auf geringe oder fehlende Kombinierbarkeit, Konfigurierbarkeit und Erweiterbarkeit zurĂŒckzufĂŒhren.

Mit dieser Arbeit soll die Implementierung einer OpenSource Software vorgestellt werden, die zum Experimentieren einlĂ€dt und die KreativitĂ€t des Benutzers fordert. Sie dient nicht der ErfĂŒllung eines konkreten Anwendungsfalls, sondern erlaubt eine Vielzahl von Möglichkeiten. Es soll gezeigt werden, dass dieses Ziel durch Kombinierbarkeit, Konfigurierbarkeit und Erweiterbarkeit erreicht wurde.

2. Grundlagen

Der Architektur von Partikelsystemen ist maßgeblich fĂŒr die effiziente Verarbeitung. Philipp PĂ€tzold beschreibt in Entwicklung eines Partikelsystems auf Basis moderner 3D-Grafikhardware [Paet2005] eine grundlegende Architektur eines Partikelsystems. Diese umfasst ein Partikelsystem, die eine Menge von Emittern enthĂ€lt, welche eine Menge von Partikel emittieren. Er beschreibt weiterhin, dass die Implementierung auf der CPU oder auf der Grafikkarte erfolgen kann. Bei der Implementierung auf der Grafikkarte sei mit erheblichen Leistungssteigerungen zu rechnen.

Nach [Paet2005] besitzt jedes Partikel einen Lebenszyklus, der mit der durch das Emittieren beginnt und nach Ablauf der Lebensspanne endet. Ein zwingendes Attribut eines Partikels ist also seine Lebensdauer. Weitere zwingende Attribute von Partikeln sind Position und Richtungsvektor. In der Regel enthĂ€lt Partikel eine Berechnungsfunktion, um die neue Position in AbhĂ€ngigkeit von Ă€ußeren EinflĂŒssen wie Wind und Gravitation zu berechnen. Der Nachteil dieser Methode wird in dieser Arbeit herausgearbeitet.

Nina Damasky beschreibt in [Dam2008] die Implementierung der Visualisierung von verschiedenen Effekten wie Schnee, Feuer und Feuerwerk. Jeder einzelne dieser Effekte erfolgte in einer eigenen Implementierung. Vorteil der Methode ist, dass die Software um weitere Effekte erweitert werden kann, ohne dass die anderen Implementierungen beeintrÀchtigt werden. Jedoch sind die Effekte nicht kombinierbar. Auch dies soll in dieser Arbeit nÀher betrachtet werden.

Die Darstellung von Partikeln ist ebenfalls von besonderer Bedeutung. Moderne Grafikkarten ermöglichen mit Billboarding eine Technik, die bei der Darstellung von Partikeln ĂŒblich ist. Dabei werden texturierte FlĂ€chen immer so gedreht, das die Kamera stets senkrecht darauf schaut. Auch bei einer Änderung der Kameraposition oder des Blickwinkels sieht man die Textur von vorn. Damit entsteht der Eindruck von dreidimensionalen Objekten wie z.B. Kugeln. Alpha Blending ist eine weitere Technik, die fĂŒr die Darstellung von Partikeln nĂŒtzlich ist. Beim additiven Alpha-Blending werden die Farbwerte eines Partikels auf den Hintergrund zu einem gewissen Teil, dem Alphawert, aufaddiert. Dieser Effekt lĂ€sst sich beispielsweise dazu nutzen, dass eine Menge von sich ĂŒberlagernden Rauch-Partikeln eine Rauchwolke ergibt.

3. Konzept und Architektur

Kombinierbarkeit, Konfigurierbarkeit und Erweiterbarkeit sind wesentliche Anforderungen an diese Software. In diesem Abschnitt wird beschrieben, wie diese Anforderungen erfĂŒllt werden.

Abbildung 1 zeigt die Architektur der Software. Sie besteht aus zwei Komponenten: einerseits der Partikelsimulation und andererseits der Visualisierungs- und Editierkomponente. Zweck der Komponente Partikelsimulation ist es, Partikel zu erschaffen, zu verÀndern und zu terminieren. Diese Komponente ist unabhÀngig von der Visualisierungs- und Editierkomponente. Das bedeutet, die Partikelsimulation ist auch ohne eine Visualisierung nutzbar. Zweck der Visualisierungs- und Editierkomponente ist es, eine 3D Szene darzustellen und FunktionalitÀten zum Editieren der Partikelsimulation anzubieten.

3.1 Partikelsimulation

Die Partikelsimulation enthÀlt eine Menge von Partikeln, Faces, Emittern, Features und Modifieren. Partikel sind einzelne Objekte, die in einer Liste effizient verwaltet werden. Sie enthalten einige notwendige Attribute, wie z.B. Position, Richtungsvektor, Anzahl der vergangenen und restlichen Iterationen des Lebenszyklus sowie welcher PartikelRenderer zum Einsatz kommen soll. Faces sind FlÀchen, die durch mindestens drei Partikel definiert sind. ZusÀtzlich enthalten Faces die Information, welcher FaceRenderer bei der Visualisierung Anwendung finden soll.

Emitter erzeugen neue Partikel sowie Faces und fĂŒgen sie der Partikelsimulation hinzu. Ein einzelnes Partikel enthĂ€lt aus GrĂŒnden der Performance und des Speicherverbrauchs möglichst wenige Attribute. Bei komplexeren Einsatzszenarien ist es jedoch notwendig, dass Partikel zusĂ€tzliche Attribute besitzen. Die FlexibilitĂ€t eines Partikels wird erreicht, indem dem Partikelsystem sogenannte Features hinzugefĂŒgt werden können. Ein Feature erweitert das Basispartikel durch ein oder mehrere zusĂ€tzliche Attribute. Die Initialisierung der zusĂ€tzlichen Attribute wird vom Emitter an alle in der Partikelsimulation instanzierten Features delegiert.

Die Aufgabe von Modifiern ist es, die Attribute jedes Partikel pro Simulationsiterationsschritt zu verÀndern. Beispielsweise können Modifier den Bewegungsrichtungsvektor eines Partikels Àndern. Auf konkrete Implementierungen von Modifiern wird im Abschnitt Realisierung eingegangen.

3.2 Visualisierung

Die Visualisierungs- und Editierkomponente besteht aus einer Menge von Renderern, Editoren, Partikel-Renderern und Face-Renderern. Die Aufgabe eines Renderers ist es, ein bestimmtes Element der Partikelsimulation zu visualisieren. So kann eine konkrete Implementierung eines Renderers eine konkrete Implementierung eines Emitters oder Modifiers in der 3D-Szene sichtbar machen. Beispielsweise rendert ein GravityPointRenderer einen GravityPoint-Modifier in der 3D-Szene. Konkrete Implementierungen von Renderern werden im Abschnitt Realisierung vorgestellt.

Editoren dienen dem Bearbeiten von Attributen von Elementen der Partikelsimulation. Eine konkrete Implementierung eines Editors ermöglicht es dem Anwender die Attribute einer konkreten Implementierung eines Emitters oder Modifiers zu Ă€ndern. Zum Beispiel stellt der Gravity-PointEditor einen Editor fĂŒr jede Instanz eines GravityPointModifier zur VerfĂŒgung.

Nur dadurch, dass Renderer fĂŒr Modifier und Emitter in der 3D-Szene dargestellt werden, ist es möglich diese per 3D-Picking auszuwĂ€hlen und somit den Editor fĂŒr den ausgewĂ€hlten Modifier oder Emitter zu aktivieren.

Die Aufgabe von Partikel- und FaceRenderer ist es, ein Partikel bzw. ein Face in der 3D-Szene darzustellen. Jedem Partikel wird bei seiner Erzeugung durch einen Emitter die Information zugewiesen, welcher PartikelRenderer zum Einsatz kommen soll. Gleiches gilt analog fĂŒr Faces und FaceRenderer.

Die konkreten Implementierungen eines PartikelRenderers stellen die einzelnen Partikel unterschiedlich dar. Beispielsweise als einfache Punktprimitive, als Dreieck oder als Tetraeder. Aber auch komplexere Darstellungsverfahren sind möglich: z.B. Ringe oder Röhren.

FaceRenderer visualisieren – Ă€hnlich wie PartikelRenderer – Faces. Jede Face enthĂ€lt eine Menge von mindestens drei Partikeln, die die Eckpunkte der FlĂ€che definieren. Konkrete Implementierungen von FaceRenderern können die FlĂ€chen unterschiedlich darstellen. Beispielsweise als eingefĂ€rbtes Polygon oder als texturiertes Polygon.

3.3 Zwischenfazit

Wie eingangs erwĂ€hnt, soll die Software erweiterbar sein und dem Anwender umfangreiche Kombinations- und Konfigurationsmöglichkeiten bieten. Kann diese Software diese Anforderungen erfĂŒllen? Erstens ist die Software erweiterbar, indem neue Emitter, Modifier, Features, Renderer, Editoren, PartikelRenderer oder FaceRenderer implementiert werden. Zweitens kann der Anwender beliebig viele Emitter, Modifier und Features einer konkreten Partikelsimulation hinzufĂŒgen und durch Editoren konfigurieren – damit ist die Kombinierbarkeit und Konfigurierbarkeit gewĂ€hrleistet. Schließlich ist die Visualisierung einer konkreten Szenerie durch Renderer, PartikelRenderer und FaceRenderer sehr flexibel.

4. Realisierung

In Abschnitt 3 wurde bereits die Architektur der Software beschrieben. Dieser Abschnitt soll die konkrete Implementierung und den Funktionsumfang der Software erlÀutern.

4.1 Eingesetzte Technologien

Die in Java geschriebene Software nutzt OpenGL zur Visualisierung. FĂŒr Java existiert eine performante und leichtgewichtige Open-Source-Bibliothek, die das OpenGL Application Programming Interface fĂŒr Java zur VerfĂŒgung stellt. Des Weiteren bietet Slick2D FunktionalitĂ€ten zum Darstellen von Text per OpenGL zur VerfĂŒgung. Als Werkzeug zum Bauen und zur AbhĂ€ngigkeitsverwaltung von eingesetzten Bibliotheken wurde das in der Java-Welt verbreitete Maven genutzt.

4.2 Partikel und Features

Partikel sind inhaltlich das wichtigste Element einer Partikelsimulation. Jedoch sind bei der Implementierung einige wichtige Voraussetzungen zu erfĂŒllen. ZunĂ€chst muss davon ausgegangen werden, dass eine hohe Anzahl von Partikeln erzeugt werden soll. Je mehr Partikel es gibt, desto mehr Speicherplatz wird benötigt. Daher ist bei der Datenstruktur von Partikeln darauf zu achten, dass keine unnötigen Informationen gespeichert werden. Des Weiteren sollen die Partikel als reine Datencontainer implementiert werden, die keinerlei Fachlogik enthalten. Dies ist aus mehreren GrĂŒnden sinnvoll. Einerseits fĂŒhrt die Trennung von Daten und Fachlogik zu einer höheren Wartbarkeit der Software. Andererseits benötigen Objektinstanzen von reinen Datenklassen weniger Arbeitsspeicher als Instanzen von Klassen mit Methoden. Eine weitere Anforderung ist die gewĂŒnschte FlexibilitĂ€t der Software, die insbesondere bei der Implementierung von Partikeln zu berĂŒcksichtigen ist. Die Erweiterbarkeit und Austauschbarkeit von einer konkreten Implementierung einer Partikelklasse wurde ermöglicht, indem ein Interface Particle definiert wurde. In der gesamten Anwendung wird auf das Interface referenziert. Somit ist es ein leichtes, eine alternative Implementierung einer Partikelklasse zu nutzen. Die Standardimplementierung erbt von HashMap erlaubt daher, neben festen Attributen wie Position und Richtungsvektor, dynamische Attribute hinzufĂŒgen. Diese FlexibilitĂ€t erlaubt es, Partikel durch Features zu erweitern, wie es bereits in Abschnitt 3.1 beschrieben wurde. Nachfolgend werden einige implementierte Features vorgestellt.

Mit dem Feature ParticleColor können die Partikel um die Informationen fĂŒr Farben erweitert werden. Dazu werden in einem Partikel die Farbwerte fĂŒr Rot, GrĂŒn und Blau fĂŒr Start- und Endposition hinterlegt. Ein weiteres Feature ist ParticleSize, das die Partikel um die Start- und EndgrĂ¶ĂŸe erweitert. Durch das HinzufĂŒgen des Features InitialVelocityScatter bewirkt man, dass die Richtungsvektoren der emittierten Partikel eine Streuung erfahren. Wie sich die Streuung auswirkt, kann jeweils fĂŒr die x-, y- und z-Richtung konfiguriert werden. Ein weiteres Feature ist Mass-Spring, welches die Partikelsimulation um Federn zwischen Partikeln erweitert. Die Federn werden in einer Liste in jedem Partikel verwaltet. Schließlich kann durch das Feature PositionPath die Simulation dahingehend erweitert werden, dass in jedem Partikel die letzten Positionen eines Partikels gespeichert werden können. Dies eignet sich beispielsweise, um fĂŒr ein Partikel einen Schweif oder eine Röhre entlang seiner vergangenen Positionen zu zeichnen. Features erlauben eine Erweiterung der Datenstruktur der Partikel und sie können genutzt werden um beim Emittieren Attribute des Partikels zu setzen oder zu beeinflussen. Jedoch haben sie keine modifizierende Wirkung wĂ€hrend der Lebenszeit des Partikels. Daher ist es fĂŒr die meisten AnwendungsfĂ€lle notwendig, Modifier zu implementieren, die Partikelattribute wĂ€hrend der Lebenszeit zu verĂ€ndern. Mehr dazu in Kapitel 4.4.

4.3 Emitter

In der Anwendung wurden mehrere Emitter implementiert. Der PointEmitter erzeugt an einer bestimmten Position neue Partikel. Bei diesem Vorgang wird ein neues Partikelobjekt erzeugt und ihm die Position des Emitters zugewiesen. ZusÀtzlich werden anhand der Konfiguration des Emitters der Richtungsvektor und die Anzahl der verbleibenden Lebenszyklusiterationen gesetzt.

Eine weitere Implementierung ist der PlaneEmitter, der die initiale Position des erzeugten Partikels auf eine zufĂ€llige Position einer konfigurierten FlĂ€che setzt. Ein SphereEmitter unterscheidet sich zu einem PointEmitter dadurch, dass der Richtungsvektor zufĂ€llig ist. Das bedeutet das Partikel in alle Richtungen ausgestoßen werden.

WĂ€hrend die bereits erwĂ€hnten Emitter relativ einfach sind, lĂ€sst sich die KomplexitĂ€t von Emittern weiter steigern. Der Tetrahedron-Emitter erzeugt Tetraeder, die aus vier Partikeln bestehen, die jeweils durch Federn miteinander verbunden sind. ZusĂ€tzlich werden vier Faces erzeugt, die die Außenhaut des Tetraeders bilden. Der ClothEmitter erzeugt ein Netz von Partikeln, die jeweils mit Federn verbunden sind. Dadurch lĂ€sst sich Stoff simulieren. Ein weiterer Emitter ist der SoftBodyEmitter. Dieser lĂ€dt ein 3D-Modell aus einer Datei und erzeugt pro Vertices des 3D-Modells ein Partikel. ZusĂ€tzlich werden die Faces des 3D-Modells ausgelesen und die erzeugten Partikel zu Faces der Partikelsimulation verbunden. Die Partikel eines Faces werden weiterhin mit Federn verbunden, um dem 3D-Modell eine StabiltĂ€t zu verleihen. Außerdem werden Ankerpunkte an der initialen Position eines Partikels erzeugt und mit einer starken Feder mit dem Partikel verbunden um ihn an seiner ursprĂŒnglichen Position zu halten. Es ist zu sehen, dass Emittern einfach oder komplex sein können. FĂŒr Stoff oder wacklige Objekte wurden komplexere Emitter implementiert. Doch Emitter alleine, selbst wenn sie komplex sind, bewirken noch kein dynamisches System. Die Dynamik der Partikelsimulation wird erst durch die Modifikation der Partikel wĂ€hrend ihrer Laufzeit erreicht.

4.4 Modifier

Diese Aufgabe obliegt Modifiern. Die Attribute von Partikeln werden ausschließlich durch Modifier verĂ€ndert. Das bedeutet, dass in einer Partikelsimulation ohne Modifier sich der Zustand von Partikeln nicht Ă€ndert. FĂŒr diese Software wurde daher eine Reihe von Modifiern implementiert. Der wichtigste Modifier ist die Klasse VelocityTransformation. Er Ă€ndert die Position des Partikels, indem auf die bisherige Position der Richtungsvektor aufaddiert wird:

Formel 1: Velocity Transformation

Der Modifier VelocityTransformation ist der einzige Modifier, der die Position des Partikels Àndert. Die weiteren verÀndern in der Regel den Richtungsvektor des Partikels. Dies ist auch beim Modifier VelocityDamper der Fall. Dabei wird der Richtungsvektor um einen DÀmpfungsfaktor verringert:

Formel 2: Velocity Damper

Drei weitere Modifier lassen eine Gravitationskraft auf die Partikel wirken. Erstens ist der GravityPoint eine punktförmige Gravitationsquelle, deren Gravitationskraft in alle Richtungen wirkt. Zweitens wirkt beim Modifier GravityPlane die Gravitationskraft in Lotrichtung einer FlĂ€che. Drittens der Modifier ParticleGravity, der alle GravitationskrĂ€fte zwischen allen Partikeln berechnet. Die Gravitationskraft beeinflusst jeweils wiederum den Richtungsvektor. Da die Berechnung der GravitationskrĂ€fte fĂŒr alle drei Modifier Ă€hnlich ist, wird nachfolgend die Berechnung der Gravitationskraft exemplarisch fĂŒr den Modifier GravityPoint erlĂ€utert.

Formel 3: Berechnung der Gravitationskraft und Änderung des Richtungsvektors

ZunĂ€chst wird die Distanz des Partikels zum Gravitationspunkt berechnet. Anschließend wird die Gravitationskraft berechnet, die von der Distanz und der Masse des Partikels sowie des Gravitationspunkts abhĂ€ngig ist. Das Partikel wird in Richtung des Gravitationspunkts um die eben berechnete Gravitationskraft in AbhĂ€ngigkeit zur Distanz und Masse des Partikels beschleunigt. Abschließend wird der Beschleunigungsvektor mit dem bisherigen Richtungsvektor addiert, um den neuen Richtungsvektor zu erhalten.

Eine Eigenschaft der Partikelsimulation ist, dass Partikel voneinander unabhĂ€ngig sind. Durch das Feature MassSpring und den Modifier MassSpringTransformation wird die Simulation um das physikalische Konzept Masse-Feder-Systeme erweitert. Partikel besitzen jeweils eine Masse und sind mit Federn untereinander verbunden. Jede Feder hat eine festgelegte LĂ€nge, bei welcher sie sich im Ruhezustand befindet. Sie kann jedoch auch gestaucht sein, d.h. die Distanz zweier mit Federn verbundener Partikel ist geringer als die eigentliche LĂ€nge der Feder. Andersherum ist die Feder gestreckt wenn die Distanz grĂ¶ĂŸer ist. Der Modifier berechnet in jeder Iteration fĂŒr jedes Partikel und jede ihrer Federn die Federkraft und Ă€ndert den Richtungsvektor beider mit der Feder verbundenen Partikel. Um zu vermeiden, dass die FederkrĂ€fte doppelt berechnet werden, und damit Geschwindigkeitseinbußen zu verzeichnen wĂ€ren, ist eine Feder eindeutig einem Partikel zugeordnet. Damit Partikel ĂŒberhaupt ĂŒber Federn verfĂŒgen, mĂŒssen sie dem Partikel von einem spezialisierten Emitter hinzugefĂŒgt werden. Beispiele sind der ClothEmitter und der SoftBodyEmitter.

Formel 4: Berechnung der FederkrĂ€fte und Änderung des Richtungsvektors

In Abschnitt 4.2 wurden bereits die Features ParticleColor und ParticleSize erwĂ€hnt. Doch beim Einsatz dieser Features ohne einen zugehörigen Modifier wĂŒrde zwar die Datenstruktur des Partikels erweitert werden, aber der Farbwert bzw. die GrĂ¶ĂŸe des Partikels nicht geĂ€ndert werden. Daher wurden zur Änderung der Farben und der PartikelgrĂ¶ĂŸe ĂŒber die Zeit mehrere Modifier implementiert. Die LinearColorTransformation Ă€ndert die aktuelle Farbe des Partikels zwischen Startfarbe und Endfarbe durch lineare Interpolation. Somit ist es beispielsweise möglich, dass ein anfĂ€nglich rotes Partikel sich zu einem gelben Partikel entwickelt. Der Modifier RandomStartColor vergibt jedem Partikel bei der ersten Iteration eine zufĂ€llige Farbe. Ein weiterer Modifier LinearSizeTransformation arbeitet Ă€hnlich wie der Modifier LinearColorTransformation und Ă€ndert die PartikelgrĂ¶ĂŸe von einer StartgrĂ¶ĂŸe bis hin zur EndgrĂ¶ĂŸe. Hingegen lĂ€sst der Modifier PulseSizeTransformation die GrĂ¶ĂŸe des Partikels mit Hilfe einer Sinusschwingung pulsieren.

Ebenfalls in Abschnitt 4.2 wurde das Feature PositionPath vorgestellt. Ziel ist es, dass ein Partikel die letzten Positionen speichert. Der Modifier PositionPathBuffering entfernt bei jeder Iteration die Ă€lteste Position und fĂŒgt die aktuelle Position hinzu.

Wie zu sehen ist, nehmen die Modifier eine zentrale Rolle im Partikelsystem ein. Sie verringern die KomplexitĂ€t des gesamten Systems, indem einzelne Operationen jeweils in einem eigenen Modifier gekapselt werden. Modifier sind kombinierbar und es können alternative Implementierungen, wie z.B. bei der Art wie die Farben ĂŒber die Zeit geĂ€ndert werden, angeboten werden.

4.5 Renderer

Die bisherigen Abschnitte behandelten die Erzeugung und Modifizierung innerhalb des Partikelsystems. Dieser Abschnitt zeigt die Visualisierung des Partikelsystems. Dabei umfasst die Visualisierung nicht nur die Partikel und Faces selbst, sondern es gilt weitere Elemente wie beispielsweise Emitter und Modifier darzustellen. FĂŒr jedes darzustellende Element muss das Interface Renderer implementiert werden. Da es einige Methoden gibt, die allen Renderern gemeinsam sind, implementieren die konkreten Renderer von der abstrakten Klasse AbstractRenderer.

Renderer können der Visualisierungs- und Editierkomponente dynamisch hinzugefĂŒgt werden. Zudem können Renderer auch temporĂ€r aktiviert und deaktiviert werden. Die Klasse RendererManager verwaltet alle Renderer und ruft in jedem Frame jeden hinzugefĂŒgten und aktivierten Renderer auf.

Zur Visualisierung von Emittern wurde die Klasse EmitterRenderer implementiert. Der EmitterRenderer zeichnet an der Position aller in der Partikelsimulation vorhandenen Emitter eine Kugel. Diese kann per Mausklick durch den Raum gezogen werden, und Ă€ndert die Position des Emitters. Beim Anklicken einer Kugel wird ein Editor fĂŒr den ausgewĂ€hlten Emitter geöffnet. Zudem ist es möglich, einen ausgewĂ€hlten Emitter per Tastendruck zu entfernen. Jedoch sind nicht alle Emitter punktförmig und mĂŒssen daher auf eine andere Weise dargestellt werden. Beispielsweise ist der PlaneEmitter mit zwei Punkten und einer Normale definiert und muss dementsprechend als FlĂ€che im Raum dargestellt werden.

Bei den Modifiern wird in darstellbare und nicht darstellbare Modifier unterschieden. Nichtdarstellbare Modifier sind beispielsweise die Klasse ParticleLimiter, die die Höchstzahl von Partikeln im System reguliert und die Klasse VelocityTranstransformation, die den aktuellen Richtungsvektor zur aktuellen Position addiert. Jedoch existieren einige Modifier, die darstellbar sind. Dies sind zum Beispiel punktförmige Gravitationspunkte, die durch den Renderer GravityPointRenderer dargestellt werden. Wie Emitter besitzen sie eine Position und werden ebenfalls als Kugel, jedoch in einer anderen Farbe, gezeichnet.

Ein weiterer Renderer ist von Nutzen, wenn das Feature MassSpring genutzt wird. Der SpringRenderer zeichnet die in der Partikelsimulation existierenden Federn zwischen Partikeln ein. Um darzustellen, ob eine Feder im entspannten Zustand ist, werden drei Farben zum Zeichnen der Linie verwendet. Eine rote Linie bedeutet, dass die Feder gedehnt ist und sich zusammenziehen will. Hingegen bedeutet eine grĂŒne Linie, dass die Feder gestaucht ist und sich ausdehnen möchte. Eine Feder im Ruhezustand wird grau gezeichnet. Ob sich die Feder im gedehnten, gestauchten oder Ruhezustand befindet, berechnet sich dadurch, ob die Distanz beider Partikel grĂ¶ĂŸer, kleiner oder gleich der FederlĂ€nge ist.

Es gibt weitere Renderer, die kurz vorgestellt werden sollen: der CameraRenderer stellt an den Positionen der Kameras einen Trichter in Blickrichtung der Kamera dar. Der AxisRenderer zeichnet ein Achsenkreuz durch den Ursprung des World Space.

4.6 Rendering von Partikeln und Faces

Nun stellt sich die Frage, wie Partikel und Faces gezeichnet werden. Auch dies soll der Anforderung der Software entsprechen, flexibel und erweiterbar zu sein. Um unterschiedliche Partikeltypen darzustellen, existiert ein Interface ParticleRenderer. Das konkrete Zeichnen von Partikeln findet in einer Klasse statt, die dieses Interface implementiert.

Die Klasse ParticleRendererManager verwaltet die einzelnen Renderer fĂŒr Partikel. Auch sie können dynamisch zur Laufzeit hinzugefĂŒgt, entfernt oder ausgetauscht werden. Zur Effizienzsteigerung ist eine weitere Aufgabe des ParticleRendererManager das Cachen von Partikeln in separaten Listen fĂŒr jeden genutzten ParticleRenderer. Diese Listen ermöglichen es, Partikel, die einen bestimmten ParticleRenderer nutzen, direkt nacheinander zu zeichnen. Das bedeutet, dass die Initialisierung und Deinitialisierung des Zeichnens, wie beispielsweise das Laden einer Textur oder das Setzen einer Zeichenprimitive in OpenGL, nicht einmal pro Partikel geschieht, sondern nur einmal pro ParticleRenderer. Auf diese Weise konnte, je nach konkreter Implementierung, eine enorme Steigerung der Performance erreicht werden. Der zu zahlende Preis ist eine gesteigerte KomplexitĂ€t durch die Verwaltung der Listen und die Invalidierung von Cacheobjekten, d.h. Partikel deren Lebenszyklus beendet ist. Gerade das Entfernen von Partikelobjekten aus dem Cache ist Performancekritisch. Daher wurde es nötig, die Java-Klasse LinkedList zu verwenden, die im Gegensatz zu ArrayList sowohl beim hinzufĂŒgen als auch beim entfernen von Listenobjekten in linearer Zeit arbeitet.

Die Darstellung von Partikeln selbst kann unterschiedlich komplex sein. Die einfachsten FĂ€lle sind das Zeichnen von Primitiven wie Punkten, Linien, LinienzĂŒge, Dreiecken und Vierecken. Diese konnten so erweitert werden, dass sie farbig gezeichnet werden, wenn das Feature ParticleColor vorhanden ist. Auch die Verwendung des Features ParticleSize ist beispielsweise durch die PunktgrĂ¶ĂŸe oder die Liniendicke auf einfache Weise möglich. Zudem wurde Alphablending eingesetzt, so dass Punktwolken deutlich realistischer wirken, da die Dichte der Wolke sichtbar wird.

Sollen optisch ansprechende Partikelrenderer implementiert werden, so steigt der Aufwand bei der Implementierung. OpenGL unterstĂŒtzt mit sogenannte Point Sprites, mit welchen sich das Verfahren Billboarding anwenden lĂ€sst (siehe Abschnitt 2). Die Initialisierungsphase eines Partikelrenderers ist bei der Nutzung von Billboarding deutlich umfangreicher. Doch dieses Verfahren ist lohnenswert: in Verbindung mit geeigneten Texturen werden optisch ansprechende Effekte möglich. So greifen einige Partikelrenderer fĂŒr diese Technik zurĂŒck, um Feuer- und EnergiebĂ€lle, Lagerfeuer, grĂŒne Giftwolken, Nebelschwaden und Schnee-flocken darzustellen. Dank der UnterstĂŒtzung der Grafikhardware und OpenGL ist das Zeichnen nur wenig langsamer als das Zeichnen einer Punktprimitive.

Die Möglichkeiten der Visualisierung von Partikeln sind damit jedoch noch nicht ausgeschöpft. So wurde ein Partikelrenderer fĂŒr Ringe implementiert, der einen Kreis mit dem Durchmesser der PartikelgrĂ¶ĂŸe zeichnet. Dabei liegt der Richtungsvektor des Partikels im Lot der FlĂ€che des Kreises, so dass bei hintereinander emittierten Partikeln der Effekt einer gekrĂŒmmten Röhre entsteht. Der TubeParticleRenderer nutzt das Feature PositionPath und stellt anhand der letzten Positionen eine Röhre dar. Dazu muss neben der Normale und der Tangente auch die Bitangente des Partikels fĂŒr die Berechnung der einzelnen Röhrensegmente genutzt werden. Eine Variante des TubeParticleRenderers ist die Klasse SpiralParticleRenderer, die die Röhrensegmente beim Zeichnen verdreht, so dass statt einer Röhre eine Spirale entsteht.

Im Laufe der Entwicklung wurden Partikelrenderer auch dazu verwendet, um physikalische VorgĂ€nge zu visualisieren. In einer Partikelsimulation mit mehreren Gravitationspunkten ist es beispielsweise von Interesse, wie sich der Richtungsvektor eines Partikels pro Iteration Ă€ndert. Sehr anschaulich wird dies durch die Klasse VelocityIndicatorParticleRenderer. Diese zeichnet ausgehend von der Position des Partikels den Richtungsvektor als Linie. Eine weitere Darstellungsform ist die Klasse VeloCube, die einen Quader zeichnet. Die Ausmaße ergeben sich dabei durch die drei Komponenten des Richtungsvektors.

Analog zur Darstellung von Partikeln erfolgte die Umsetzung der Darstellung von Faces. Jedoch muss das Interface FaceRenderer implementiert werden. Die Verwaltung erfolgt durch die Klasse FaceRendererManager. Das beschriebene Verfahren zum Cachen von Partikeln wurde ebenfalls beim FaceRendererManager angewendet. Der bedeutenste Unterschied liegt darin, dass FaceRenderer die Positionen von einer variablen Anzahl von in den Faces enthaltenen Partikeln nutzen mĂŒssen. Eine einfache Implementierung ist die Klasse PolygonFaceRenderer, die ein Polygon unter Verwendung der Partikelpositionen als Eckpunkte zeichnet. Jedoch sind weitere AnwendungsfĂ€lle möglich, wie beispielsweise gekrĂŒmmte OberflĂ€chen oder das Zeichnen von mehreren FlĂ€chen.

4.7 Performance

Ein wichtiger Aspekt bei der Implementierung der Partikelsimulation ist die Performance. Um die Performance zu steigern, wurden mehrere Maßnahmen durchgefĂŒhrt.

Pro Iterationsschritt wird jeweils jeder Emitter aufgerufen. Anschließend werden in jedem Iterationsschritt fĂŒr jedes Partikel jeder Modifier aufgerufen. Im Gegensatz zu Emittern ist also die Anzahl von Modifiern entscheidend fĂŒr die Performance. Da Modifier fĂŒr jeden Partikel aufgerufen werden, sinkt die Performance je mehr Partikel existiert sind. ZusĂ€tzlich unterscheiden sich der Aufwand der Implementierungen von Emittern und Modifiern.

Wie in Abschnitt 3 gezeigt, ist die Komponente Partikelsimulation unabhÀngig von der Visualisierungs- und Editierkomponente. Durch diese Trennung wird es möglich beide Komponenten in eigenen Threads zu betreiben. Dies ist in doppeltem Sinne erstrebenswert: die Verarbeitungsgeschwindigkeit wird einerseits erhöht und andererseits blockieren sich beide Komponenten nicht.

Weiterhin werden Partikel, Faces, Emitter, Modifier und Features in einer ArrayList verwaltet, da dies in Java den schnellstmöglichen Zugriff per Iterator ermöglicht.

Ein weiterer Aspekt betrifft das fortlaufende Erzeugen von neuen Partikelobjekten durch Emitter. Schon das Erzeugen von Java-Objekten belastet die Performance. Noch drastischer wirkt sich jedoch das AufrĂ€umen von nicht mehr genutzten Objekten in Java aus. Wird ein Objekt referenzlos, so wird dieses bei der nĂ€chsten GarbageCollection von der Java Virtual Maschine entfernt. WĂ€hrend der GarbageCollection wird jedoch die Anwendung, die auf der virtuellen Maschine lĂ€uft, in diesem Fall die Partikelsimulation, vollstĂ€ndig blockiert bis die Garbage-Collection beendet ist. Dies fĂŒhrt bei wenigen Partikeln, zu gelegentlichen und kaum merkbaren Rucklern. Je mehr Partikel jedoch emittiert wurden und nach ihrem Lebenszyklus schließlich aufgerĂ€umt werden mĂŒssen, desto hĂ€ufiger und störender wirkt sich dieser Effekt aus.

Als Maßnahme um diese störenden Effekte zu minimieren, werden Partikel wiederverwendet. Statt ein Partikelobjekt nach dem Lebenszyklus aus der Liste von lebenden Partikeln zu entfernen, und damit der Garbage-Collection zu ĂŒberlassen, werden sie in einem als Stack implementierten Pool gespeichert. Emitter erzeugen nur noch dann neue Partikel- objekte, wenn in dem Pool keine Partikelobjekte mehr vorhanden sind. Anderenfalls wird ein Partikelobjekt aus vom Stack geholt und initialisiert. Somit konnte verhindert werden, dass die Anwendung durch hĂ€ufige und lĂ€nger dauernde GarbageCollection-VorgĂ€nge unterbrochen wird. Zudem konnte durch das Reduzieren des Erzeugens von neuen Java-Objekten Performancesteigerungen erreicht werden.

5. Ergebnisse

Die Software leistet einen Beitrag zur Entwicklung von Partikelsimulationen mittels Java, OpenGL und der Leightweight Java Game Library. Sie ist als Open-Source Experimentiersoftware fĂŒr Partikelsysteme bisher konkurrenzlos. Durch die Architektur der Software wird nicht nur die Erweiterbarkeit gewĂ€hrleistet, sondern zudem eine hohe Performance erreicht.

Die vorgestellte Anwendung könnte zum Ausprobieren von neuartigen visuellen Effekten, beispielsweise fĂŒr Computerspiele oder Filme, genutzt werden oder sogar KĂŒnstlern als neue Ausdrucksform dienen. Des Weiteren bietet sich die Software zur Visualisierung von Simulationen an.

Um die Erkenntnisse öffentlich verfĂŒgbar zu machen, steht die entwickelte Software unter dem General Public License. Dies erlaubt es Dritten, die Software zu nutzen, erweitern und unter gleichen Bedingungen weiterzugeben.

6. Zusammenfassung und Ausblick

Diese Arbeit zeigt die Implementierung einer Experimentiersoftware zur Simulation und Darstellung von Partikeln. Sie erlaubt es dem Anwender, visuell eindrucksvolle, aus Partikel bestehende Szenarien zu entwickeln. Dieses Ziel wurde durch die Erweiterbarkeit der Software einerseits und die Kombinierbarkeit und Konfigurierbarkeit innerhalb der Anwendung andererseits erreicht.

ZukĂŒnftige Weiterentwicklungen könnten weitere Emitter, Modifier und Features umfassen. Beispielsweise könnten Emitter fĂŒr die Generierung von fraktalen Landschaften oder fĂŒr die Generierung von Vegetation mittels Lindenmayer Systemen implementiert werden. Eine weitere Erweiterungsmöglichkeit bestĂŒnde darin, einen Modifier zu implementieren, der die Reproduktion und VervielfĂ€ltigung von Partikeln anhand von Regeln simuliert. DarĂŒber hinaus könnte die Software um Beleuchtungs- und Reflexionsmodelle erweitert.

Literatur:

[BFA2002] Bridson, Robert; Felkiw, Ronald und Anderson, John. Robust Treatment of Collisions, Contact and Friction for Cloth Animation. 2002, Standford, USA

[BW1998] Baraff, David und Witkin, Andrew. Large Steps in Cloth Simulation. 1998, Orlando, USA

[Dam2008] Damasky, Nina Partikelsimulation (Studienarbeit). 2008, Koblenz

[FR1986] Fournier, Alain und Reeves, William T. A simple model of ocean waves. 1986, Toronto, USA

[Hel2009] Helminger, Mathias. Physics – Particle Systems. 2009, MĂŒnchen

[Lan2004] Lange, Marc. Simulation StoffÀhnlicher Objekte. 2004, Koblenz

[LMT1991] Lafleur, Benoit; Magnenat Thalmann, Nadia und Thalmann, Daniel. Cloth Animation with Self-Collision Detection- 1991, Switzerland.

[OS2003] O’Connor, Corey und Stevens, Keith. Modeling Cloth Using Mass Spring Systems. 2003, Claremont, USA

[Paet2005] PĂ€tzold, Philipp. Entwicklung eines Partikelsystems auf Basis moderner 3D-Grafikhardware(Studienarbeit). 2005, Koblenz

[Ree1981] Reeves, William T. Inbetweening for Computer Animation Utilizing Moving Point Constraints. 1981

[Ree1983] Reeves, William T. Particles Systems – A Technique for Modeling a Class of Fuzzy Objects. 1983

[Ree1985] Reeves, William T. Approximate and Probabilistic Algorithms for Shading and Rendering Structured Particle Systems. 1985.

Terrain Generation in der Cube2 Engine

Die Cube2-Engine verfĂŒgt ĂŒber einen exzellenten in-game Map-Editor. Basierend auf einem Octree, können Cubes auf allen sechs Seiten deformiert werden. Das Format spart nicht nur Platz auf der Festplatte, sondern auch im Arbeitsspeicher. Damit ist es möglich große 3D-Welten auch auf resourcenschwacher Hardware darzustellen. Da die Welt jedoch nicht einfach aus einer Menge von Vertices besteht, ist die Implementierung eines Terrain Generators deutlich aufwĂ€ndiger.

Der grundlegende Algorithmus ist Simplex-Noise, eine Weiterentwicklung von Perlin-Noise. Vorteil des Algorithmus gegenĂŒber seinem VorgĂ€nger ist es, dass er in höheren Dimensionen deutlich performanter ist. Das Ergebnis des Algorithmus ist eine Höhenmap fĂŒr entweder 2D oder 3D. Wird Simplex-Noise fĂŒr 2D generiert, bekommt man pro x,y-Koordinate einen Höhenwert, also den z-Wert. Somit erhĂ€lt man eine hĂŒgelige Landschaft. Wird Simplex-Noise jedoch fĂŒr 3D generiert, bekommt man einen Dichtewert pro x,y,z-Koordinate. Dieser Dichtewert bewegt sich zwischen einem Minimum und einem Maximum, ĂŒblicherweise zwischen 0 und 1. Setzt man einen Grenzwert, beispielsweise 0.5, kann man zwischen solidem Gestein und Luft unterscheiden. Ein Dichtewert an einer Position x,y,z ist Gestein, wenn er den Grenzwert unterschreitet, ansonsten Luft. Außerdem ist es möglich das Spektrum zwischen 0 und 1 in mehrere Segmente aufzuteilen, um beispielsweise mehrere Schichten unterschiedlichen Gesteins zu erzeugen. Tiefere Schichten bestehen beispielsweise aus Granit, höhere Schichten aus Erde.

Um Höhen- und Dichtewerte in der Cube-Engine zu nutzen, muss die Map in gleich große Blöcke eingeteilt werden. Der Wert entscheidet darĂŒber, ob ein Block erstellt wird oder ob der Platz frei bleibt. Diese Welt ist jedoch eine Klötzchenwelt und damit ist der RealitĂ€tsgehalt sehr niedrig. Die Blöcke mussen nun noch interpoliert werden, um nahtlos aneinander anzuschließen. Dazu ist ein weiterer Algorithmus zustĂ€ndig: Marching Cubes. Dabei werden die Blöcke weiter in kleinere Blöcke zerlegt und fĂŒr jeden kleineren Block bestimmt, wie die OberflĂ€che des grĂ¶ĂŸeren Blocks diesen kleineren Block durchschneidet. AbhĂ€ngig davon wird eine von 15 möglichen Deformationen durchgefĂŒhrt. Damit ist die Geometrie erzeugt.

Um Lichter zu setzen, wird wiederum der Dichtewert bemĂŒht. Es wird derjendige Punkt ausgewĂ€hlt, der in der Mitte einer Höhle, d.h. garantiert in der Luft und in einiger Entfernung zu einer Wand, ist. Dies erreicht man indem man wiederum einen Grenzwert bestimmt, der deutlich grĂ¶ĂŸer ist, als der Grenzwert zwischen Gestein und Luft, aber etwas niedriger als das Maximum. Außerdem wird ein Minimalabstand zwischen den erzeugten Lichter eingehalten um eine gleichmĂ€ĂŸigere Ausleuchtung zu erzielen.

0 A.D. alpha 7 brings new sounds!