Einführung

Structure Synth ist ein plattformübergreifendes (Windows, Linux, Mac) Programm zum Generieren von 3D Strukturen. Diese werden aus Benutzerbefehlen generiert. Dazu verwendet die Open-Source-Software die Skriptsprache EisenScript.

Im Gegensatz zu anderen Programmiersprachen hat EisenScript eine relativ freie Struktur: Bereits einzelne, unabhängige Befehle liefern ein dreidimensionales Ergebnis. Die verschiedenen Variablen von Structure Synth bestimmen zum Beispiel die Art des Objekts, die Farbe oder die Position im Koordinatensystem.

Mit Hilfe so genannter "rules" transformiert Structure Synth die Ausgabeobjekte. Diese Regeln wiederholt die kostenlose Anwendung beliebig oft. So entsteht ein immer neues Ergebnis. Mit einem Mausklick auf "Render" rechnet Structure Synth die Befehle in ein 3D-Modell um. Bei Bedarf holt man sich Anregungen bei den zahlreichen mitgelieferten Vorlagen. Die fertigen Bilder speichert man als PNG- oder BMP-Bild ab.

 

Offizielle Projekt homepage:

http://structuresynth.sourceforge.net/

Entwickler Blog:

http://blog.hvidtfeldts.net/index.php/category/structure-synth/

 

Für das folgende Tutorial wäre etwas Script- oder Programmiererfahrung von Vorteil.

States, Transformationen und Aktionen

 

Die wichtigsten Elemente beim Scripten mit Structure Synth sind die States. Sie beschreiben das aktuellen Koordinatensystem und den Farbmodus. Das Koordinatensystem bestimmt die Position, Orientierung und Größe aller Objekt die im jeweiligen State gezeichnet werden.

States werden mittels Transformationen verändert. Um das Koordinatensystem um eine Einheit auf der X-Achse bewegen, wenden wir diese Transformation an:

{ x 1 } 


Ähnlich können wir auch das Koordinatensystem um 90 Grad auf der X-Achse rotieren:

{ rx 90 }


States können mit Rule Aufrufe kombiniert werden. In Structure Synth gibt es einige vordefinierte Rules wie zum Beispiel box oder sphere.

Ein Beispiel:
{ x 2 } box

Hier wird ein einfacher Box Mesh gezeichnet, kombiniert mit einer Transformation auf der X-Achse.

 

Um das zu verdeutlichen hier noch ein Beispiel:

box
{ x 2 } box
{ x 4 } box
{ x 6 } box 

 

Dieser Code erzeugt folgende Ausgabe:

Dieser Code kann verkürzt werden weil EisenScript auch Iterationen unterstützt:

4 * { x 2 } box

 

Folgende Rules sind vordefiniert

box, sphere, grid, line, dot

 


 

 

 

Farb Transformationen

Ähnlich den räumlichen Transformationen können Farbwerte transformiert werden. Structure Synth benutzt den HSV (Hue, Saturation, Value) ähnlichen Farbraum HSB (Hue, Saturation, Brightness) um Farben darzustellen.

Das nächste Beispiel demonstriert Iterationen in Farb und Raum.

 

10 * { x 1 hue 36 } 10 * { y 1 sat 0.9 } 10 * { z 1 b 0.9 } box 

Die ersten zehn Iterationen verändern den Farbton (hue) und die Position auf der X-Achse. Die nächsten 10 Iterationen verändern die Sättigung (sat) und die Position auf der Y-Achse. Die letzten 10 Iterationen verändern die Helligkeit (b) und die Position auf der Z-Achse. Diese Iterationen kombiniert mit dem Rule Aufruf box zum Schluss erzeugt 1000 (10*10*10) Boxes und liefert folgende Ausgabe:

 

Rules

Selbstdefinierte Rules sind der Schlüssel für komplexe und anspruchsvolle Strukturen. Rules werden mittels dem Schlüsselwort rule definiert. Eigene Rules können dann wie die vordefiniert Rules aufgerufen werden.

Ein Beispiel:

MyRule

rule MyRule {
  { x 0.9 rz 6 ry 6 s 0.99 sat 0.6 } MyRule
  { s 2 } grid
}

Erzeugt folgende Struktur:

 

Schauen wir uns die einzelnen Code Elemente an:

 

MyRule

Hier wird unsere Rule aufgerufen.

 

rule MyRule

Hier definieren wir den Namen unserer Rule.

 

{ x 0.9 rz 6 ry 6 s 0.99 sat 0.6 } MyRule 

Hier werden verschieden Transformationen angewendet (Position auf X-Achse, Rotation auf Z- und Y-Achse, Farbton).

Zu beachten ist der Befehl s, aber vorher kurz noch der Rule Aufruf MyRule am Schluss. Hier wird unsere Rule rekursiv aufgerufen. Die Rekursionstiefe ist defaultmäßig auf 1000 Rekursionen eingestellt. Mit dem Befehl set maxdepth kann die Rekursionstiefe auch selber eingestellt werden.

 

Der Befehl s welcher das Koordinatensystem (X,Y,Z) um den Faktor 0.99 verkleinert, bewirkt am Ende (durch die Rekursion) die Spiralform unserer Struktur.

 

Zufällige Variation

Um etwas Variation in unsere Struktur zu bringen, können wir unsere Rule mehrfach definieren. Structure Synth wählt dann beim Aufruf zufällig eine Defintion unserer Rule aus.

Beispiel:

MyRule

rule MyRule {
{ x 0.9 rz 6 ry 6 s 0.99 h 0.6 } MyRule
{ s 2 } grid
}

rule MyRule {
{ x 1.8 rz 9 ry -9 s 0.99 h 0.6 } MyRule
{ s 2 } sphere
}

Wie man sieht sind bei der zweiten Definition unserer Rule MyRule die Transformationen auf der X-Achse, Rotation auf der Z- und Y-Achse verändert. Weiters wird anstatt einem grid eine sphere gezeichnet.

Hier das Ergebnis:

 

Animation

Mit Structure Synth kann man sein Strukturen auch animieren. Dies funktioniert mittels einem JavaScript (wird auch von Structure Synth unterstützt). In diesem Script ändert man in einer Schleife schritt für schritt die Parameter der Transformationen.

Beispiel Struktur:

 

#define MyZ 50

MyRule

rule MyRule {
{ x 0.5 ry 6 rz MyZ s 0.98 h 0.5 } MyRule
{ s 0.7 } sphere
}

Ausgabe:

 


Um die Parameter über das JavaScript ändern zu können, müssen sie als Variablen deklariert werden. In unserem Fall die Variable MyZ, welche die Rotation auf der Z-Achse darstellt.
Variablen werden mit einem #define am anfang des Scripts definiert.
Dieses Script speichern wir nun unter dem Namen MyRule.es.

Wir erstellen nun ein neues Script für die Animation (JavaScript).

 

#javascript

function laufnummer(number) {
number = number + ''; // konvertiert die zahl zu einem string
while (number.length < 4) {
number = "0" + number;
}
return number;
}

Builder.load("MyRule.es");
laufnr = 0;

for (i = 50; i >= 15; i -= 1) {
Builder.reset();
Builder.setSize(0,300);
Builder.define("MyZ", i);
Builder.build();
Builder.raytraceToFile("MyRule" + laufnummer(laufnr) + ".png", true);
laufnr = laufnr + 1;
}

Mit #javascript teilen wir Structure Synth mit, dass es sich beim folgenden Script um ein JavaScript handelt. Die Funktion laufnummer(number) dient uns zum Generieren der PNG-Dateinamen mit fortlaufender Nummer.

Builder.load("MyRule.es") lädt das Script unserer Struktur (welches sich im selben Ordner befindet wie das JavaScript).

In der FOR-Schleife, bei der abwärts gezählt wird (von 50 bis 15) rufen wir Builder.define("MyZ", i) auf. Mit diesem Aufruf definieren wir die Rotation auf der Z-Achse in unserer Struktur (unserer Variable MyZ wird die Laufvariable i zugewiesen). Die darauf folgenden Builder-Aufrufe rendern und speichern die PNGs.

 

Das Ergebnis:

 

 

Weitere und genauere Informationen über Animationsscripting in Structure Synth findet man im Entwickler-Blog unter http://blog.hvidtfeldts.net/index.php/2010/11/scripting-in-structure-synth/

Raytracer

Der interne Raytrace kann über verschiedene Befehle konfiguriert werden (am Script-Anfang).

Eine kleine Übersicht:

set raytracer::light [0.2,0.4,0.5]
set raytracer::shadows true
set raytracer::samples 6
set raytracer::ambient-occlusion-samples 1
set raytracer::dof [0.23,0.2]
set raytracer::size [0x0]
set raytracer::max-threads 0
set raytracer::voxel-steps 30
set raytracer::max-depth 5
set raytracer::reflection 0.0
set raytracer::phong [0.6,0.6,0.3]

Genaue Erklärungen findet man im Entwickler-Blog unter http://blog.hvidtfeldts.net/index.php/2010/09/creating-a-raytracer-for-structure-synth/