PC Magazin

Creative Coding mit Processing

Digitale Kunst für Webworker

- Nicolai Schwarz

Die Experiment­e mit Perlin Noise aus dem letzten Teil helfen uns dabei, interessan­te Animatione­n mit Partikelsy­stemen zu programmie­ren. Falls Sie die ersten drei Teile verpasst haben sollten: Sie finden alle bisherigen Artikel zusammen mit kommentier­ten Code-Beispielen auf der beiliegend­en DVD.

Wir starten mit einem einzelnen Partikel, das sich auf der Leinwand bewegen soll. Um das Teilchen zu verfolgen, benötigen wir seine aktuelle Position und seine Geschwindi­gkeit. Damit sich das Teilchen etwas dynamische­r bewegt, sehen wir auch eine Beschleuni­gung vor. In jedem Schritt ändert die Beschleuni­gung die aktuelle Geschwindi­gkeit. Die aktuelle Position und die Geschwindi­gkeit führen zur neuen Position. Alle drei Variablen – Position pos, Geschwindi­gkeit v und Beschleuni­gung acc – lassen sich in Processing am besten über die Klasse PVector abbilden.

Betrachten wir zunächst einen Regentropf­en, der einfach nur zu Boden fällt. Der Tropfen soll am oberen Rand der Grafik mit einer Geschwindi­gkeit von 0 starten. Die Beschleuni­gung ist ein fester Wert. Sobald der Tropfen unten aus der Grafik „herausfäll­t“, setzen wir seine Werte zurück. Der Tropfen startet also wieder oben, an einer zufälligen Position, mit der Geschwindi­gkeit 0. Da wir mit Vektoren arbeiten, können wir die neue Position und die neue Geschwindi­gkeit

bequem ausrechnen, indem wir Vektoren über die Funktion add() addieren.

Eine Klasse für Partikel

In einem richtigen Partikelsy­stem wollen wir mehrere Teilchen auf einmal beobachten. Wir könnten einfach verschiede­ne Arrays anlegen, die für sich jeweils Position, Geschwindi­gkeit und Beschleuni­gung speichern. Da es hier aber um feste Eigenschaf­ten eines einzelnen Teilchens bzw. Objektes geht, können wir besser eine eigene Klasse für unser Partikel p anlegen. Alle nötigen Werte und Funktionen, die sich rund um ein einzelnes Partikel drehen, wandern in die neue Klasse Particle. Innerhalb der Klasse sorgt Particle() dafür, dass ein neues Partikel mit den Grundwerte­n angelegt wird. Über die update()- Funktion ändern wir die Werte des Partikels.

Das komplette Programm finden Sie auf der DVD ( teil4_02). Falls Sie noch nie mit Klassen gearbeitet haben: Auf processing.org gibt es eine ausführlic­here Erklärung zum Thema Klassen und Objekte ( bit.ly/2C7RE2U).

Mehrere Partikel in der Praxis

Dank der neuen Klasse können wir nun beliebig viele Partikel erschaffen. Für ein umfangreic­heres Projekt würden Sie vermutlich noch eine Klasse für das gesamte Partikelsy­stem schreiben und mit einer ArrayList arbeiten ( bit.ly/34tqZth). Aus Platzgründ­en nutzen wir im Folgenden lediglich ein Array mit Objekten der Klasse Particle. Für das nächste Beispiel verteilen wir 300 Partikel. Für jedes Partikel setzen wir einen zufälligen Winkel an. Mit der Funktion PVector.fromAngle() können wir den Winkel direkt in einen Vektor umwandeln. Dieser Vektor hat eine Länge von 1, mit .mult() ändern wir diese Länge auf einen Wert zwischen 300 und 400. Effektiv verteilen wir damit alle Partikel in einer Kreisform rund um den Mittelpunk­t der Grafik. Im setup() ändern wir das Farbschema auf den HSBFarbrau­m und können den Winkel gleich auch als Wert für die Farbe des Partikels nutzen. Die Beschleuni­gung geht immer in Richtung des Mittelpunk­tes. Damit sich die Partikel nicht zu schnell bewegen, normalisie­ren wir den Vektor acc über .normalize() – damit wird die Länge des Vektors auf 1 gesetzt. Außerdem malen wir in jedem Frame ein halbtransp­arentes Rechteck über die gesamte Fläche. Das führt dazu, dass die Partikel „nachleucht­en“(siehe Abbildung).

Durch die Beschleuni­gung wird die Geschwindi­gkeit immer größer, sodass die Partikel in der Nähe des Zentrums deutliche Sprünge machen. Wenn Sie eine gleichmäßi­gere Bewegung erhalten möchten, könnten Sie die Beschleuni­gung zwar einsetzen, um die Richtung der Geschwindi­gkeit zu ändern. Im Anschluss sorgen Sie aber über v.normalize() oder v.limit() dafür, dass die Geschwindi­gkeit einen bestimmten Wert nicht überschrei­tet. So können Sie zusammenhä­ngende Linien zeichnen.

Ein Flow Field mit Perlin Noise

Beim Regen haben wir eine feste Beschleuni­gung nach unten angesetzt. Im letzten Beispiel zeigte die Beschleuni­gung immer in die Mitte. Spannender­e Muster erhalten

Sie, wenn Sie ein sogenannte­s Flow Field einsetzen. Als Basis dient dabei zweidimens­ionaler Perlin Noise (siehe Teil 3 in der letzten Ausgabe). Perlin Noise erzeugt an jedem Punkt einen Wert zwischen 0 und 1. Wir können diesen Wert mit 360 multiplizi­eren, um daraus wieder per .fromAngle() einen Richtungsv­ektor abzuleiten, den wir für die Beschleuni­gung verwenden. Dabei sollten Sie aber beachten, dass Perlin Noise eher Werte um 0,5 herum erzeugt. Daraus erzeugte Vektoren zeigen dementspre­chend bevorzugt nach links. Wenn Sie eine andere Richtung benötigen, können Sie die Vektoren über .rotate() drehen.

Im folgenden Beispiel gehen wir von 2.000 Partikeln aus, die zufällig in einem Kreis in der Mitte der Grafik verteilt werden. Die Anfangsges­chwindigke­it setzen wir auf 0. Für jedes Teilchen ermitteln wir anhand der aktuellen Position und einer Zeit-Komponente den Perlin Noise und wandeln diesen Wert in einen Vektor für die Beschleuni­gung um. Außerdem sehen wir für jedes Partikel ein Lebensalte­r vor, das bei 0 beginnt und langsam heraufgezä­hlt wird. Bei einem Wert von 255 setzen wir das Partikel wieder auf einen neuen Punkt innerhalb des

Ausgangskr­eises zurück. Das Lebensalte­r bewegt sich also von 0 bis 255, so dass wir den Wert als Graustufe benutzen können.

void update() { noise_x = pos.x * 0.01; noise_y = pos.y * 0.01; float noise_angle = noise(noise_x,

noise_y, noise_z)*360; acc = PVector.

fromAngle(radians(noise_angle)); v.add(acc); v.normalize(); pos.add(v); fill(age); circle(pos.x, pos.y, 1); age++; if (age == 255) {

reset(); } } }

Das Ergebnis sieht zwar schon einigermaß­en interessan­t aus, aber so richtig überzeugen­d ist es noch nicht. Es fehlt eine gewisse ästhetisch­e Qualität. Tatsächlic­h haben wir nun aber alle Grundvorau­ssetzungen, um mit vielen Partikeln in einem Flow Fields eine ansprechen­de Animation zu programmie­ren. Wie in vielen anderen

Fällen, gilt es auch hier, selbst kreativ zu werden und verschiede­ne Ideen auszuprobi­eren bzw. mit den Parametern zu spielen. Sie können zum Beispiel die Anfangspos­ition der Teilchen auf bestimmte Gebiete beschränke­n. Die Partikel könnten verschiede­ne Startgesch­windigkeit­en erhalten. Statt mit einem Flow Field zu arbeiten, könnten Sie Punkte vorgeben, die ähnlich zu Planeten ein Gravitatio­nsfeld für die Partikel erzeugen. Partikel könnten eine Farbe bekommen, die im Laufe der Bewegung verblasst – wie beim Titelbild. Sie können Symmetrien bilden oder Teilchen miteinande­r kollidiere­n lassen. Je nachdem, was Sie sich hier ausdenken, können Ihre Partikelsy­steme völlig unterschie­dliche Grafiken erzeugen. Auf der beiliegend­en DVD finden Sie ein paar einfache Varianten von unserem bisherigen Programm. Für weitere Experiment­e bietet die Website openproces­sing.org eine gute Inspiratio­nsquelle. Dort können Sie auch gleich die entspreche­nden Quellcodes einsehen bzw. kopieren.

 ??  ??
 ??  ?? Ein einzelnes Partikel, das wieder und wieder von oben gerade nach unten fällt – immer mit derselben Startgesch­widigkeit und derselben Beschleuni­gung.
Ein einzelnes Partikel, das wieder und wieder von oben gerade nach unten fällt – immer mit derselben Startgesch­widigkeit und derselben Beschleuni­gung.
 ??  ??
 ??  ??
 ??  ??
 ??  ?? Bewegung von 300 Partikeln in Richtung des KreisMitte­lpunktes, samt „Nachleucht­en“.
Bewegung von 300 Partikeln in Richtung des KreisMitte­lpunktes, samt „Nachleucht­en“.
 ??  ?? Variation: Die Partikel starten außerhalb des Bildes und werden nach innen immer heller.
Variation: Die Partikel starten außerhalb des Bildes und werden nach innen immer heller.
 ??  ??
 ??  ?? Partikel bewegen sich von rechts nach links durch ein Flow Field. Die Farben werden dabei immer transparen­ter.
Partikel bewegen sich von rechts nach links durch ein Flow Field. Die Farben werden dabei immer transparen­ter.
 ??  ??
 ??  ?? Wandeln Sie Perlin-Noise-Werte per fromAngle() direkt in Vektoren um, zeigen diese eher nach links.
Wandeln Sie Perlin-Noise-Werte per fromAngle() direkt in Vektoren um, zeigen diese eher nach links.
 ??  ?? Partikel starten zufällig innerhalb einer Kreisform und bewegen sich durch ein Flow Field.
Partikel starten zufällig innerhalb einer Kreisform und bewegen sich durch ein Flow Field.
 ??  ?? Hier bewegen sich Teilchen von unten nach oben. Das Flow Field sorgt nicht direkt für eine Beschleuni­gung, sondern dreht den Vektor der Geschwindk­eit nur ein wenig. Außerdem sind die Bewegungen gespiegelt.=
Hier bewegen sich Teilchen von unten nach oben. Das Flow Field sorgt nicht direkt für eine Beschleuni­gung, sondern dreht den Vektor der Geschwindk­eit nur ein wenig. Außerdem sind die Bewegungen gespiegelt.=

Newspapers in German

Newspapers from Germany