Perlin Noise: Unterschied zwischen den Versionen

Aus DDSWiki
Wechseln zu: Navigation, Suche
(Die Seite wurde neu angelegt: „3342 × 2094 == Beschreibung == * Perlin Noise definiert einen Algorhytmus, der organische Muster generiert. Unser Programm be…“)
 
(Code)
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
[[File:Perlin_Noise.png|3342 × 2094]]
+
[[File:Perlin_Noise.png|1671 × 1047]]
  
  
Zeile 21: Zeile 21:
  
 
//Sound library für Processing importieren.
 
//Sound library für Processing importieren.
 +
 
import processing.sound.*;
 
import processing.sound.*;
 +
 
SoundFile file;
 
SoundFile file;
 
//Array Liste erstellen, um Particle Objekte zu verwalten.
 
//Array Liste erstellen, um Particle Objekte zu verwalten.
Zeile 36: Zeile 38:
 
   fullScreen();
 
   fullScreen();
 
   background(26, 24, 27);
 
   background(26, 24, 27);
 +
 
//Sound File wird abgerufen, abgespielt und geloopt.  
 
//Sound File wird abgerufen, abgespielt und geloopt.  
 +
 
   file = new SoundFile (this, "soundfile_1.wav");
 
   file = new SoundFile (this, "soundfile_1.wav");
 
   file.play();
 
   file.play();
 
   file.loop();
 
   file.loop();
 +
 
//Regulierung der Lautstärke des Musikstücks.
 
//Regulierung der Lautstärke des Musikstücks.
 
   file.amp(0.5);
 
   file.amp(0.5);
 +
 
//Particles Objekte werdne zur Array Liste hinzugefügt.  
 
//Particles Objekte werdne zur Array Liste hinzugefügt.  
 
//Die For-Schleife wiederholt den Vorgang immer wieder.  
 
//Die For-Schleife wiederholt den Vorgang immer wieder.  
 
//random beschreibt den Ort des Auftauchens der Particles.
 
//random beschreibt den Ort des Auftauchens der Particles.
 
//(zwischen min.: 0 und max.:width/height)
 
//(zwischen min.: 0 und max.:width/height)
 +
 
   for(int i = 0; i < nums; i++){
 
   for(int i = 0; i < nums; i++){
 
   particles_a.add(new Particle(random(0,width),random(0,height)));
 
   particles_a.add(new Particle(random(0,width),random(0,height)));
Zeile 58: Zeile 65:
 
   smooth();
 
   smooth();
 
   for(int i = 0; i < particles_a.size(); i++){
 
   for(int i = 0; i < particles_a.size(); i++){
 +
 
//Mapping der "alpha" und "rad" Gesamtwerte auf den konkreten Wertebereich.
 
//Mapping der "alpha" und "rad" Gesamtwerte auf den konkreten Wertebereich.
 +
 
     float alpha = map(i,0,nums,0,250);
 
     float alpha = map(i,0,nums,0,250);
 
     float rad = map(i, 0, nums, 1,2);
 
     float rad = map(i, 0, nums, 1,2);
Zeile 64: Zeile 73:
 
//Particles_a wird aus der Array Liste aufgerufen,  
 
//Particles_a wird aus der Array Liste aufgerufen,  
 
//Farbe definiert und Befehle zu Methoden gegeben.
 
//Farbe definiert und Befehle zu Methoden gegeben.
 +
 
     fill(145, 203, 62, alpha);
 
     fill(145, 203, 62, alpha);
 
     Particle part_a = particles_a.get(i);
 
     Particle part_a = particles_a.get(i);
Zeile 71: Zeile 81:
 
      
 
      
 
//Particles_b wird aus der Array Liste aufgerufen,  
 
//Particles_b wird aus der Array Liste aufgerufen,  
//Farbe definiert und Befehle zu Methoden gegeben.  
+
//Farbe definiert und Befehle zu Methoden gegeben.
 +
   
 
     fill(79, 119, 45, alpha);
 
     fill(79, 119, 45, alpha);
 
     Particle part_b = particles_b.get(i);
 
     Particle part_b = particles_b.get(i);
Zeile 80: Zeile 91:
 
//Particles_c wird aus der Array Liste aufgerufen,  
 
//Particles_c wird aus der Array Liste aufgerufen,  
 
//Farbe definiert und Befehle zu Methoden gegeben.
 
//Farbe definiert und Befehle zu Methoden gegeben.
 +
 
     fill(49, 87, 44, alpha);
 
     fill(49, 87, 44, alpha);
 
     Particle part_c = particles_c.get(i);
 
     Particle part_c = particles_c.get(i);
Zeile 89: Zeile 101:
  
 
//Durch Erschaffen einer Particle Klasse, wird ein Particle Objekt in seiner Gesamtheit definiert.
 
//Durch Erschaffen einer Particle Klasse, wird ein Particle Objekt in seiner Gesamtheit definiert.
 +
 
class Particle {
 
class Particle {
 
//Definition der einzelnen Vektorvariablen.
 
//Definition der einzelnen Vektorvariablen.
Zeile 97: Zeile 110:
 
   float tempo;
 
   float tempo;
 
//Bestimmung der Variablen, Zuweisung von Werten.  
 
//Bestimmung der Variablen, Zuweisung von Werten.  
 +
 
   Particle(float x, float y) {
 
   Particle(float x, float y) {
 
     richtung = new PVector(0,0);
 
     richtung = new PVector(0,0);
Zeile 104: Zeile 118:
 
   }
 
   }
 
//Bewegung der einzelnen Pixel wird bestimmt.
 
//Bewegung der einzelnen Pixel wird bestimmt.
 +
 
   void bewegen() {
 
   void bewegen() {
 
     float angle = noise(ort.x/noiseScale, ort.y/noiseScale)*noiseScale;
 
     float angle = noise(ort.x/noiseScale, ort.y/noiseScale)*noiseScale;
Zeile 114: Zeile 129:
 
//Progamm kontrolliert, ob Pixel gegen den Rand des Bildschirms stößt.
 
//Progamm kontrolliert, ob Pixel gegen den Rand des Bildschirms stößt.
 
//Anstatt außerhalb des Bildrahmens, erscheint Pixel randomly zwischen min.: 50 und max.:width/height.
 
//Anstatt außerhalb des Bildrahmens, erscheint Pixel randomly zwischen min.: 50 und max.:width/height.
 +
 
   void checkEdge() {
 
   void checkEdge() {
 
     if(ort.x > width || ort.x < 0 || ort.y > height || ort.y < 0){
 
     if(ort.x > width || ort.x < 0 || ort.y > height || ort.y < 0){
Zeile 120: Zeile 136:
 
     }
 
     }
 
   }
 
   }
 +
 
//Befehl, der Pixel zeichnet.
 
//Befehl, der Pixel zeichnet.
 +
 
   void display(float rad) {
 
   void display(float rad) {
 
     ellipse(ort.x, ort.y, rad, rad);
 
     ellipse(ort.x, ort.y, rad, rad);
Zeile 128: Zeile 146:
 
//Beim Drücken der Taste "r", malt sich der Hintergrund neu,
 
//Beim Drücken der Taste "r", malt sich der Hintergrund neu,
 
//das Soundfile unterbricht und die gezeichneten Particles werden entfernt.
 
//das Soundfile unterbricht und die gezeichneten Particles werden entfernt.
 +
 
void keyPressed () {
 
void keyPressed () {
 
for (int i = particles_a.size()-1; i>=0; i--) {
 
for (int i = particles_a.size()-1; i>=0; i--) {
Zeile 141: Zeile 160:
  
 
//Beim Loslassen von der Taste "r", spielt das Soundfile von Anfang an und wieder durchgehend.
 
//Beim Loslassen von der Taste "r", spielt das Soundfile von Anfang an und wieder durchgehend.
 +
 
void keyReleased () {
 
void keyReleased () {
 
   if (key == 'r') {
 
   if (key == 'r') {
Zeile 151: Zeile 171:
 
//erscheinen im Umkreis des Cursoros neue Particles Objekte in den zuvor bestimmten Farben.
 
//erscheinen im Umkreis des Cursoros neue Particles Objekte in den zuvor bestimmten Farben.
 
//Durch Bewegen über den Bildschirm können neue Muster gestaltet werden.
 
//Durch Bewegen über den Bildschirm können neue Muster gestaltet werden.
 +
 
void mouseDragged () {
 
void mouseDragged () {
 
   particles_a.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));
 
   particles_a.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));
Zeile 156: Zeile 177:
 
   particles_c.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));
 
   particles_c.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));
 
}
 
}
 
  
 
== Tipps und Tricks ==
 
== Tipps und Tricks ==

Aktuelle Version vom 13. April 2020, 13:40 Uhr

1671 × 1047


Beschreibung

  • Perlin Noise definiert einen Algorhytmus, der organische Muster generiert. Unser Programm benützt zufällige Werte, um gleichmäßige Kurven in drei unterschiedlichen Farben zu kreieren. Dabei wird ein angenehmes Ambiente erzeugt, welches den/die ZuschauerIn beruhigt. Unterstützt wird dieser Prozess durch ein sanftes Musikstück, welches immer wieder in einem Loop abgespielt wird. Durch Drücken der Taste "r" ist es möglich, das Artboard zu löschen und mit gedrückter Maustaste (LMB) selbst zu zeichnen.


Code

//Perlin Noise Visual and Sonic Experience //Autoren: Nataya Aleksic und Michael Steinbichler //New Design University Privatuniversität, St.Pölten //SS 2020 Wahlfach: Creative Coding //Lehrender: Dr. Florian Güldenpfennig //Ton aufrdehen! //Programm starten und genießen! //Weitere Linien durch gedrückte Maustaste (LMB) hinzufügen. //Das Artboard durch "r" löschen und das Musikstück neustarten. //Mit gedrückter Maustaste (LMB) selbst zeichnen.

//Sound library für Processing importieren.

import processing.sound.*;

SoundFile file; //Array Liste erstellen, um Particle Objekte zu verwalten. ArrayList<Particle> particles_a = new ArrayList<Particle>(); ArrayList<Particle> particles_b = new ArrayList<Particle>(); ArrayList<Particle> particles_c = new ArrayList<Particle>(); //Definition unterschiedlicher Variablen, die den Verlauf //und das Aussehen der Particles beinflussen. int nums = 200; int noiseScale = 800;

void setup() { //Programm wird im Vollbildmodus geöffnet und zeichnet den Hintergrund.

 fullScreen();
 background(26, 24, 27);

//Sound File wird abgerufen, abgespielt und geloopt.

 file = new SoundFile (this, "soundfile_1.wav");
 file.play();
 file.loop();

//Regulierung der Lautstärke des Musikstücks.

 file.amp(0.5);

//Particles Objekte werdne zur Array Liste hinzugefügt. //Die For-Schleife wiederholt den Vorgang immer wieder. //random beschreibt den Ort des Auftauchens der Particles. //(zwischen min.: 0 und max.:width/height)

 for(int i = 0; i < nums; i++){
 particles_a.add(new Particle(random(0,width),random(0,height)));
 particles_b.add(new Particle(random(0,width),random(0,height)));
 particles_c.add(new Particle(random(0,width),random(0,height)));
 }

}

void draw() { //Beschreibung des Aussehens der Partciles.

 noStroke();
 smooth();
 for(int i = 0; i < particles_a.size(); i++){

//Mapping der "alpha" und "rad" Gesamtwerte auf den konkreten Wertebereich.

   float alpha = map(i,0,nums,0,250);
   float rad = map(i, 0, nums, 1,2);
   

//Particles_a wird aus der Array Liste aufgerufen, //Farbe definiert und Befehle zu Methoden gegeben.

   fill(145, 203, 62, alpha);
   Particle part_a = particles_a.get(i);
   part_a.bewegen();
   part_a.display(rad);
   part_a.checkEdge();
   

//Particles_b wird aus der Array Liste aufgerufen, //Farbe definiert und Befehle zu Methoden gegeben.

   fill(79, 119, 45, alpha);
   Particle part_b = particles_b.get(i);
   part_b.bewegen();
   part_b.display(rad);
   part_b.checkEdge();
   

//Particles_c wird aus der Array Liste aufgerufen, //Farbe definiert und Befehle zu Methoden gegeben.

   fill(49, 87, 44, alpha);
   Particle part_c = particles_c.get(i);
   part_c.bewegen();
   part_c.display(rad);
   part_c.checkEdge();
 }

}

//Durch Erschaffen einer Particle Klasse, wird ein Particle Objekt in seiner Gesamtheit definiert.

class Particle { //Definition der einzelnen Vektorvariablen.

 PVector richtung;
 PVector geschwindigkeit;
 PVector ort;

//Variable Tempo beschreibt, wie schnell sich Particles bewegen.

 float tempo;

//Bestimmung der Variablen, Zuweisung von Werten.

 Particle(float x, float y) {
   richtung = new PVector(0,0);
   geschwindigkeit = new PVector(0,0);
   ort = new PVector(x,y);
   tempo = 0.8;
 }

//Bewegung der einzelnen Pixel wird bestimmt.

 void bewegen() {
   float angle = noise(ort.x/noiseScale, ort.y/noiseScale)*noiseScale;
   richtung.x = cos(angle);
   richtung.y = sin(angle);
   geschwindigkeit = richtung;
   geschwindigkeit.mult(tempo);
   ort.add(geschwindigkeit);
 }

//Progamm kontrolliert, ob Pixel gegen den Rand des Bildschirms stößt. //Anstatt außerhalb des Bildrahmens, erscheint Pixel randomly zwischen min.: 50 und max.:width/height.

 void checkEdge() {
   if(ort.x > width || ort.x < 0 || ort.y > height || ort.y < 0){
     ort.x = random(50,width);
     ort.y = random(50,height);
   }
 }

//Befehl, der Pixel zeichnet.

 void display(float rad) {
   ellipse(ort.x, ort.y, rad, rad);
 }

}

//Beim Drücken der Taste "r", malt sich der Hintergrund neu, //das Soundfile unterbricht und die gezeichneten Particles werden entfernt.

void keyPressed () { for (int i = particles_a.size()-1; i>=0; i--) {

 if (key == 'r') {
   background(26, 24, 27);
   file.pause();
   particles_a.remove(i);
   particles_b.remove(i);
   particles_c.remove(i);

} } }

//Beim Loslassen von der Taste "r", spielt das Soundfile von Anfang an und wieder durchgehend.

void keyReleased () {

 if (key == 'r') {
   file.play();
   file.loop();
 }

}

//Beim Drücken der Maustaste (LMB), //erscheinen im Umkreis des Cursoros neue Particles Objekte in den zuvor bestimmten Farben. //Durch Bewegen über den Bildschirm können neue Muster gestaltet werden.

void mouseDragged () {

 particles_a.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));
 particles_b.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));
 particles_c.add (new Particle (mouseX + random(-30,30), mouseY +random (-30,30)));

}

Tipps und Tricks

  • Unser Code kann an die Bedürfnisse jedes/jeder ZuschauerIn individuell angepasst werden. Folgende Parameter lassen sich schnell und einfach selbst verändern:
  • FARBE: Jeder Kurve wird ein spezifischer Farbwert in RGB oder HEX zugeschrieben. Diese lassen sich unter dem Befehl fill(); finden und auch modifizieren. Auch der Hintergrund unter background(); kann verändert werden. Für Hilfe bei der Suche nach der passenden Farbe, empfehlen wir die Verwendung der Website Coolors.co
  • MUSIK: Unter der setup(); Funktion kann das soundfile durch ein anderes ausgetauscht werden. Dabei muss dieses zuvor in dem Ordner des Sketches abgespeichert werden.
  • TEMPO: In der Klasse Particle wurde die Variable des Tempo definiert. Diese beschreibt die Schnelligkeit der Bewegung der einzelnen Kurven. Je nach Präferenz lässt sich dieser Wert erhöhen oder minimieren.

Quellen

  • Diese Quellen wurden während des Prozesses verwendet:

https://www.youtube.com/watch?v=HnSJZ4qTcwY

https://natureofcode.com/book/chapter-4-particle-systems/#chapter04_section3

https://www.openprocessing.org/sketch/767279

https://processing.org/examples/arraylistclass.html

https://processing.org/reference/ArrayList.html

https://github.com/processing/p5.js/wiki/Processing-transition

https://www.coolors.co