06 Processing – Vektorgrafiken importieren

Processing kann SVG-Vektorgrafiken (z.B. aus Illustrator oder das kostenlose Inkscape) verarbeiten und darstellen. Damit lassen sich grafische Elemente bequem in Illustrator erstellen und dann in Processing animieren.

Klasse PShape

Dazu gibt es die Klasse „PShape“. Mit der Funktion „loadShape()“ können wir ein PShape Objekt von einer SVG-Datei erzeugen. (Die SVG Datei muss dazu im „data“ Verzeichnis des Processings Sketches liegen. Man kann aber auch einfach die SVG Datei ins Processing Fenster ziehen und Processing kopiert sie automatisch an die richtige Stelle).

PShape s	= loadShape( test.svg );

Anschliessend können wir die Vektorgrafik mit der Funktion „shape()“ zeichnen:

shape( s );

Der Shape Funktion übergeben wir als Parameter das PShape-Objekt, dass wir zeichnen wollen. Optional können wir auch noch die x- und y Position und die Breite und Höhe übergeben.

shape( s, mouseX, mouseY, 80, 80 );

Wie gehabt können wir mit translate(), rotate() und scale() das Koordinatensystem verschieben, rotieren und skalieren, bevor wir den Shape zeichnen.

Beispiel:

PShape svg;

void setup() {
    size(500, 500);
    smooth();

    // Lade Shape
    svg         = loadShape("test.svg");
}

void draw() {
    background(255);

    // Verschiebe Koordinaten auf Fenstermitte
    translate( width / 2, height / 2 );

    // Zeichne Shape
    shape( svg);
}

Herunterladen: SVG_Simple

Mit translate( width / 2, height / 2 ) wird das Koordinatensystem so verschoben, dass die Grafik in der Fenstermitte liegt. Processing benutzt beim Positionieren der Grafik immer die Koordinaten, mit denen es in Illustrator angelegt wurde. Am besten, man zentriert die Objekte in Illustrator immer um den 0-Punkt.

Ein sehr cooles Feature von PShape ist, dass das Shape Objekt Unterobjekte enthalten kann, die wiederum Shapes sind. Schaut euch dazu die Datei “test.svg” im “data” Verzeichnis mal in Illustrator an. Im obigen Beispiel enthält die SVG-Datei 3 Ebenen: „kreis“, „zeiger1“ und „zeiger2“.

Mit der Funktion getChild() des Shape Objektes kann man dessen Unterobjekte ermitteln:

Die Funktion erwartet den Namen der Ebene im SVG File (in doppelten Anführungszeichen) und liefert (falls es die Ebene gibt) ein neues Objekt vom Typ PShape, welches nur für diese Ebene gilt. Das können wir dann in einer Variablen speichern.

PShape kreis	= svg.getChild( „kreis“ );

Jetzt haben wir das Objekt “kreis” in einer Variablen mit gleichem Namen gespeichert und können es wie ein ganz normales PShape-Objekt verwenden, z.B. zeichnen:

shape( kreis );

Damit kann man jetzt die Teile einer SVG Dstei unabhängig voneinander animieren. Zunächst brauchen wir eine Variable für die SVG Datei und für jedes ihrer Elemente:

Beispiel:

PShape svg;
PShape kreis;
PShape zeiger1;
PShape zeiger2;

float rot = 0

Die Variablen definieren wir gleich am Anfang außerhalb der Funktionen setup() und draw(), damit wir sie von dort aus benutzen können. Die Variable “rot” brauchen wir später zum Animieren.

Zu Beginn des Programms laden wir die SVG Grafik und speichern die Unterobjekte in den Variablen:

void setup() {
    size(500, 500);
    smooth();

    // SVG-Datei laden
    svg         = loadShape("test.svg");

    // Elemente ermitteln und in Variablen speichern
    zeiger1     = svg.getChild("zeiger1");
    zeiger2     = svg.getChild("zeiger2");
    kreis       = svg.getChild("kreis");
}

In der draw() Funktion löschen wir zunächst den Hintergrund und zentrieren die Grafik im Fenster. Dann zeichnen wir das erste Element, rotieren um einen kleinen Betrag (rot) und zeichnen das zweite Element. Dann rotieren wir noch etwas mehr und zeichnen das dritte Element:

void draw() {
    background(255);

    translate( width / 2, height / 2 );    // im Fenster zentrieren

    shape(kreis );            // Kreis zeichnen

    rotate( rot );            // ein bisschen rotieren
    shape( zeiger1 );         // und den ersten Zeiger zeichnen

    rotate( rot * 2 * PI );   // noch etwas mehr rotieren
    shape( zeiger2 );         // zweiten Zeiger zeichnen

    rot    += 0.005;          // Variable für Rotation etwas erhöhen
}

Herunterladen: SVG_Children

Kommentare sind geschlossen.