Ein wenig Schulgeometrie macht noch keinen CAD-Experten. Mit OpenSCAD sinkt die Einstiegshürde jedoch beträchtlich.
Wer gelernt hat, dass der Radius eine Kugel definiert oder Höhe und Durchmesser der Grundfläche einen Kegel, der fühlt sich in OpenSCAD sofort zu Hause. Mit der Software entwerfen Sie nahezu im Handumdrehen Strukturen, die selbst ein 3D-Drucker versteht. Im Test für diesen Artikel entstanden die Vorlage für die Kappe eines USB-Sticks, das Modell eines Flugzeugs, Lego-Steine und ein Ersatzschlüssel.
Die gängigen Distributionen bieten OpenSCAD direkt zur Installation an, in aller Regel in der Version von 2014. Die Homepage [1] erläutert den Download der aktuelleren Version 2015.03-1. Dieser lohnt sich schon deswegen, weil diese die Möglichkeit bietet, Textobjekte ohne Umwege einzubinden.
Einstieg
Nach dem Start öffnet sich ein Fenster mit einem Bereich für die Eingabe (links), einem für die Ausgabe (rechts oben) sowie einer Konsole. Einige Schalter bieten grundlegende Funktionen an: Über dem Editorfenster beziehen sich die linken Icons auf typische Aufgaben wie das Öffnen oder Speichern von Dateien und typische Aktionen eines Editors, wie Rückgängigmachen, Wiederholen oder Einrücken.
Die beiden Würfel-Icons starten das Programm entweder für den CSG-Schnellentwurf, falls ein STL-Export ansteht, oder für das Rendern mittels CGAL. Die gleichen Aktionen lösen Sie mit [F5] und [F6] aus. Mit einem ersten, kleinen Programm probieren Sie die Schaltflächen unter dem Ausgabefenster aus. Wie die meisten Programmiersprachen lehnt sich jene von OpenSCAD ans Englische an.
Um eine Kugel zu zeichnen, tippen Sie den Befehl sphere(); in den Editor. Vergessen Sie bei der Eingabe von Befehlen nicht das Semikolon, das jedes Kommando abschließt. Drücken Sie [F5] oder klicken Sie auf das Würfel-Icon mit den zwei Zacken, so führt die Software das einzeilige Programm aus. Es erscheint rechts ein blaues, eckig wirkendes Gebilde (Abbildung 1).
Über die Icon-Leiste verändern Sie den Blickwinkel auf das Objekt, drehen es und ändern die Darstellung zwischen orthografischer (Fluchtpunkt im Unendlichen) und perspektivischer Projektion (entfernte Objekte erscheinen kleiner). Am einfachsten verschieben Sie den Blickwinkel mit der Maus: Das Scrollrad ändert den Abstand, die linke Maustaste den Blickwinkel, die rechte die Position. Die Koordinaten der imaginären Kamera gibt das Programm in der Statusleiste unten aus.
Das erste Programm zeigt bereits einige Eigenarten von OpenSCAD: Die meisten Variablen belegt das Programm bereits mit Vorgabewerten. Geben Sie keinen Radius oder keine Position des Körpers an, geht das Programm von einer Kugel mit einem Durchmesser von einer Einheit im Koordinatenursprung aus.
Die Software kennt keine gekrümmten Flächen. Stattdessen nähert sie sich durch ein Gitternetz aus Dreiecken der gewünschten Form an. Der Menüpunkt View | show_edges blendet das Netz ein. Über die Variable $fn steuern Sie die Anzahl der Kanten:
$fn=200; sphere();
Nun dauert das Rendern zwar etwas länger, aber Sie erhalten eine fast perfekte Kugel. Anstatt die Variable global zu ändern, bietet die Applikation die Möglichkeit, diese auf die eine Kugel zu beschränken:
sphere(); translate([2,0,0]) sphere(r=2, $fn=200);
Sie sehen nicht nur die grob gerenderte Kugel im Ursprung, sondern neben ihr eine wohlgeformte Kugel mit dem Radius r=2 Einheiten (Abbildung 2). Damit sich die Kugeln nicht überdecken, verschiebt der Befehl translate() sie um den Vektor mit den Koordinaten x, y und z, wobei im konkreten Fall der Wert für x 2 Einheiten entspricht.

translate() stellen Sie zwei Objekte nebeneinander.” width=”300″ height=”166″ />
Abbildung 2: Durch das Verschieben des Ursprungs über den Befehltranslate() stellen Sie zwei Objekte nebeneinander.Viele Befehle wirken auf ein nachfolgendes Objekt. Stände hinter dem Translate-Befehl ein Semikolon, würde die Anweisung hier abbrechen und sich nicht auf die nachfolgende Kugel erstrecken.
Im nächsten Beispiel geht es um die Konstruktion eines Bleistifts. Er besteht aus einem Zylinder der Höhe h=50 und dem Radius r=5. Da er sechseckig sein soll, beschränken Sie mit $fn=6 das Rendern auf sechs Flächen:
cylinder(h=50, r=5, $fn=6);
Als Kegel dient ein Zylinder mit einem oberen Radius von r2=5, einem unteren Radius von r1=0 und einer Höhe von h=15. Damit die Software alle Objekte außer dem Schaft des Bleistifts mit großer Genauigkeit glättet, setzen Sie die Variable $fn global auf 50, indem Sie sie den entsprechenden Zeilen voranstellen:
$fn=50; cylinder(h=15, r1=0, r2=60);
Mit dem Kegel erzeugen Sie die Spitze des Bleistifts. Der Befehl intersection() beschränkt die Ansicht auf die Elemente, die gleichzeitig zum Kegel und zum Griff gehören. Der Befehl rotate() neigt den Stift (Abbildung 3). Wie bei translate() wirkt der Befehl auf das nachfolgende Element, deshalb schließt er nicht mit einem Semikolon ab.
Übergeben Sie, wie im Beispiel, nur einen Vektor an die Funktion rotate(), so steht der erste Wert für den Winkel einer Rotation um die X-Achse, der zweite für die sich daran anschließende Rotation um die Y- und die Z-Achse. Übergeben Sie der Funktion rotate() zusätzlich eine Angabe für einen Winkel, interpretiert er den Vektor als Drehachse.
Seit der Version 2015 kennt das Programm den Befehl text(), der zweidimensionalen Text erzeugt. Erkennen lässt sich dieser nur im CGAL-Renderer, da die Schnellansicht den Text behelfsmäßig auf eine Dicke von einer Einheit extrudiert. Über den Befehl linear_extrude() tritt er tatsächlich plastisch hervor.
Druckvorlage
Mit wenigen Programmzeilen erstellen Sie über die Software Objekte, die unter anderem als Vorlage für einen 3D-Drucker taugen. Als Beispiel soll uns hier eine Kappe für einen USB-Stick dienen. Sie erfordert nicht mehr als drei Befehle: einem Quader, der die äußere Abmessung der Kappe festlegt, einem Quader, dessen Größe der des USB-Steckers entspricht sowie dem Befehl difference(), der beide Blöcke voneinander abzieht. Listing 1 zeigt die entsprechenden Befehle, Abbildung 4 das Ergebnis.
Listing 1
difference(){
translate([0,0,5]) color("red", 0.8) cube([5.5, 13, 12], center=true);
translate([0,0,15]) color("grey", 1) cube([4.5, 12, 30], center=true);
}
Das Dateiformat STL verstehen die meisten Slice-Programme für 3D-Drucker. Das Abspeichern einer Datei mit einer entsprechenden Vorlage setzt voraus, dass zunächst der CGAL-Renderer erfolgreich durchläuft. Dabei gehen naturgemäß die Farbinformationen verloren. Anschließend speichern Sie das Ergebnis entweder über das STL-Icon oder über File | Export Export_STL.
Die Software kennt keine Dimensionen, sondern nur Einheiten. Das Programm, das die Daten weiter verarbeitet, erwartet deshalb den Hinweis, ob die Weite der Kappenöffnung von 4,5 mal 12 Zoll oder Millimeter beträgt, und ob möglicherweise ein Skalierungsfaktor zum Anpassen der Schrumpfung zum Zug kommt. Stellen Sie den Befehl projection(cut=true) voran, bestimmt OpenSCAD die Querschnittsfläche innerhalb der X/Y-Ebene. So kontrollieren Sie die Wandstärke der Kappe.
Um den Verwendungszweck der Kappe zu veranschaulichen, erweitern Sie das Skript um eine Schemazeichnung des USB-Sticks. Der Befehl color() färbt Objekte ein. Er versteht Namen von Farben in Englisch oder in Form eines Vektors, dessen drei Komponenten die Anteile für Rot, Grün und Blau bestimmen. So erzeugt color([1,1,0]) die Farbe Gelb. Die Transparenz fügen Sie als vierte Koordinate hinzu oder als einzelne Zahl, wenn Sie die Farbe benennen, etwa color("yellow", 0.5).
Ein Flugzeug bauen
Ähnlich wie der Bleistift setzt sich auch das Modell eines Flugzeugs aus Grundelementen zusammen. Für die Flügel erstellen Sie ein eigenes Modul und nennen es wing. Ein Modul ähnelt vom Prinzip her einer Funktion: Es nimmt Parameter entgegen und liefert ein Objekt zurück, hier einen Flügel (Listing 2, Zeile 24).
Listing 2
$fn=100;
sep() flugzeug();
module flugzeug(){
// Flügel
wing(0.7);
translate([18,0,0]) wing(1);
translate([0,0,2.1]) rotate([90,-20,0]) wing(0.45);
// Rumpf
hull(){
translate([-3,0,0]) sphere(1.5);
translate([24,0,0]) sphere(3);
};
// Kanzel
translate([19,0,2]) scale([2,1,1]) color("red",0.6) sphere(2);
//Propeller
translate([26.5,0,0]) scale([2,1,1]) color("grey") sphere(1);
translate([27.3,0,0]) rotate([0,90,0]) color("grey",0.5) cylinder(h=0.5, r=5);
// Flügelmodul
module wing(s=1){
rotate([90,0,0])
scale([3*s,0.4*s,1*s*s])
cylinder(h=35,r=1,center=true);
};
};
module sep(){
translate([0,0,-0.5]) difference(){
children();
translate([-40,-40,0]) cube(100);
};
translate([0,0,0.5]) intersection(){
children();
translate([-40,-40,0]) cube(100);
};
};
Die geschweiften Klammern sind notwendig, da ein Modul typischerweise mehr als ein Objekt enthält. Die Flügel erzeugen wir aus einem deformierten Zylinder:
scale([3,0.4,1]) cylinder(h=35,r=1)
Der Befehl streckt die X-Achse um den Faktor 3, staucht die Y-Achse um 0,4 und belässt die Z-Achse, wie sie ist. Der Aufruf wing(1) erzeugt die Tragflächen, wings(0.7) das Höhenleitwerk. Der im Skript vorangestellte Befehl translate() verschiebt die Komponenten an die richtige Position.
Der Rumpf besteht aus zwei Kugeln, je eine vorne und hinten. Der Befehl hull() umschließt beide Objekte mit einer Schale und verknüpft sie zu einem neuen Objekt. Die anderen Elemente fügen Sie nach den bekannten Mustern hinzu (Abbildung 5).

Abbildung 5: Um das Modell eines kleinen Flugzeugs für den 3D-Druck vorzubereiten, teilen Sie die Zeichnung. So erhalten Sie eine glatte Fläche.
Für die Ausgabe auf einem 3D-Drucker bietet es sich an, das Objekt in zwei Teile zu zerlegen, um eine ebene Unterlage zu bekommen. Diese Arbeit übernimmt das Modul sep(). Das Objekt children() – beziehungsweise child(), sofern Sie eine Version vor 2015 nutzen – ist der Name des Objekts, auf dem sep() arbeitet. Der Befehl difference() zieht den oberen Teil des Flugzeugs ab, während intersection() genau den Bereich beschreibt, den es mit dem Würfel gemeinsam hat.
Code auslagern
Das Programm fällt etwas übersichtlicher aus, wenn Sie den Hauptteil des Programms in eine eigene Datei auslagern. Ein Beispiel für Lego-Steine verdeutlicht das Verfahren. Der Nachbau der Steine funktioniert genauso wie das Zusammensetzen des Flugzeugs aus einzelnen geometrischen Objekten. Mühsam ist das Ausmessen und Platzieren der Elemente. Wir stützen uns hier auf eine der zahlreichen Bibliotheken [2].
Als kleines Gimmick platziert der Code einen Schriftzug auf den Noppen der Steine. Bei der aktuellen OpenSCAD-Version genügt es, die Zeilen import("tech.stl"); durch linear_extrude(2) text("Linux"); in der Bibliothek zu ersetzen, um den Text zu platzieren. Der Befehl linear_extrude(2) macht aus dem Text ein 3D-Objekt, denn CGAL ist nicht in der Lage, gemischte 2D- und 3D-Objekte zu berechnen.
Wenn die Datei mit den Daten für den Spielstein den Namen lego_brici_builder.scad trägt, genügen zwei Zeilen zum Darstellen eines 6×2-Steins:
use <lego_brici_builder.scad> brick(6,2,3);
Mit zusätzlichen Befehlen lässt sich selbst ein Turm schnell aufbauen. Die Schleife for (i=[0:1:6]) iteriert über die Variable i von 0 bis einschließlich 6 in Einerschritten. Da der Schleife nur ein Objekt folgt, ist eine geschweifte Klammer nicht zwingend. Die Befehle rotate() und translate() drehen und erhöhen die Bausteine mit jedem Durchlauf (Abbildung 6).

Abbildung 6: Durch das Auslagern von Code in eine separate Datei erstellen Sie mit einer Schleife Modelle aus mehreren Instanzen eines Moduls.
Sie möchten dem Bau zuschauen? Dazu ersetzen Sie die Zahl 6 in der Definition der Schleife durch die Variable $t*10 und wählen den Menüpunkt View | animate aus. Damit schalten Sie unter dem Fenster für die Ausgabe eine neue Eingabezeile frei. Dort geben Sie für Steps die Zahl 10 ein und für FPS (frames per second) eine 1.
Mit diesen Einstellungen erhöht sich die interne Variable $t jede Sekunde um ein Zehntel, um bei Erreichen von 1 wieder bei 0 anzufangen. Jede Sekunde baut die Schleife den Turm neu auf, jedes Mal um einen Schritt weiter. Sie speichern die Bilder, indem Sie die Checkbox rechts neben dem Feld Steps aktivieren. Ein Programm wie Ffmpeg macht daraus ein Video. Da die Software die Position des Betrachters über interne Variablen steuert, gelingen auch Kamerafahrten.
Falls es sich noch nicht herumgesprochen hat: Ein offen herumliegender Schlüssel stellt ein Sicherheitsrisiko dar. Zur Demonstration der Gefahr kam im Beispiel ein Foto eines Schlüssels aus der Wikipedia [3] zum Einsatz. Ein einfaches Programm zum Digitalisieren half dabei, über den Verlauf des Barts über 25 Referenzpunkte zu bestimmen. In OpenSCAD fungieren diese Werte als Vektor, mit den 2D-Punkten als Komponenten. Über folgendes Kommando übertragen Sie die Punkte in einen Polygonzug und anschließend in den Schlüsselbart mit einer Dicke von 0,2 Zentimetern:
linear_extrude(height=0.2) polygon(points);
Vier weitere Befehle fräsen mittels difference() zwei Fugen in die Oberseite und zwei in die Unterseite des Schlüssels. Hinzu kommt ein Ring zum Anfassen – fertig ist die 3D-Druckvorlage (Abbildung 7).
Visualisierung
OpenSCAD eignet sich auch dazu, größere Datenmengen dreidimensional zu veranschaulichen – etwa die Verteilung von Erdbeben ab einer Stärke 5, die es weltweit im letzten Jahr gab [4]. Die Grafik zeigt den Ort der Beben auf der Erde, die Stärke ausgedrückt durch den Durchmesser der Kugeln und die überhöhte Tiefe, sowohl zu erkennen durch die Anordnung unterhalb des Koordinatengitters als auch durch die Farbe (Abbildung 8).

Abbildung 8: Das Programm eignet sich selbst für Infografiken, wie die Verteilung von Erdbeben ab einer Stärke 5.
Die Koordinaten und Stärke der Erdbeben liegen in zwei Arrays, abgelegt in der Datei eq03.scad. Zur Orientierung enthält der eigentliche Code die Koordinaten einiger Städte. Daten und Namen stehen in den Arrays plock und plockname. Die Schleife durchläuft alle Elemente, deren Anzahl der Befehl len() berechnet. Die selbst definierte Funktion ku2ka bestimmt aus den Kugelkoordinaten Länge, Breite und Tiefe die kartesischen Raumkoordinaten x, y und z. Sie nimmt einen Vektor entgegen und gibt den umgerechneten Vektor zurück.
Am komplexesten fällt die Konstruktion des Gitters aus: Eindimensionale Linien ohne Füllung gibt es bei OpenSCAD nicht. Deshalb konstruieren Sie diese aus extrudierten Kreisscheiben als dünne 3D-Objekte. Bei der kleinen schwarzen Kugel in der Grafik handelt es sich um die Stadt Honolulu auf Hawaii. Die Beschriftung lässt sich in der Reproduktion nicht lesen. Südwestlich stoßen die pazifische und die australische Platte zusammen. Die Erdbeben an der Oberfläche (grün) und die Tiefenbeben (rot) sind selbst in der statischen Ausgabe recht gut zu erkennen.
Listing 3
$fn=100;
$vpd=5500; // Kameradistanz
$vpr=[88,0,300]; // Kameraorientierung
r=1000; // Radius
// Die Datei eq03.scad enthält zwei Arrays mit den
// mit den Positionen (eqlock) und den abgeleiteten
// Größen für Erdbebenstärke und -tiefe (eqspec).
include <eq03.scad>
// Koordinaten einiger ausgewählter Punkte
plock=[
[52, 13, 0], // Berlin
[48, 11, 0], // München
[35, 139, 0], // Tokyo
[21, -157, 0] // Honolulu
];
// Bezeichnung der ausgewählten Punkte
plockname=["Berlin", "München", "Tokyo", "Honolulu"];
// Ausgabe von eqlock und eqspec
for (i=[0:len(eqlock)-1]){
translate(ku2ka(eqlock[i])) color([eqspec[i][0],1-eqspec[i][0],0]) sphere(eqspec[i][1]);
}
// Ausgabe der ausgewählten Punkte
for (i=[0:len(plock)-1]){
translate(ku2ka(plock[i])) color("black") sphere(10);
translate(ku2ka(plock[i])) color("black") text(text=plockname[i], size=30);
}
sphere(450); //zeichnet innere Kugel
grid(15); //zeichnet Gitternetz
// Wandelt Kugelkoordinaten um in kartesische
function ku2ka(v)= [
cos(v.y) * (r-v.z) * sin(90-v.x),
sin(v.y) * (r-v.z) * sin(90-v.x),
(r-v.z) * cos(90-v.x)];
// Zeichnet ein Längen- und Breitennetz
module grid(d=30){
mirrorc()
rotate_extrude(){
for (i=[0:d:85]){
a= ku2ka([0,i,0]);
translate(a) circle(5);
};
};
for (i=[0:d:185])
rotate([0,0,i])
rotate([90,0,0])
rotate_extrude()
translate([r,0,0]) circle(5);
}
// Hilfsmodul, um einen Block zu spiegeln
module mirrorc(v=[0,0,1]){
children();
mirror(v) children();
};
Fehlersuche
Das wichtigste Dokument zu OpenSCAD findet sich unter Help | Cheat_sheet: eine vollständige Liste aller Befehle, die die Software kennt [5]. Fehlermeldungen beim Übersetzen eines Skripts erscheinen in der Konsole.
Ein vergessenes Semikolon erkennen Sie nur dadurch, dass das Programm in der Abgrenzung zu den nachfolgenden Befehlen stolpert. Der eigentliche Fehler liegt deshalb vor der Zeile, in der das Programm abbricht. Mühsamer zu finden sind syntaktisch korrekte, aber logisch falsche Semikola: Schließen Sie eine Transformation wie translate([0,0,1]) mit dem Zeichen ab, ist das kein Fehler, liefert aber auch keinen Output.
Um beim Verschneiden geometrischer Objekte den Überblick zu behalten, welcher Anteil von welchem Objekt kommt, stellen Sie einem Befehl für das Objekt eine Raute (#) voran. So gibt die Software das Objekt halbtransparent aus. Ein vorangestellter Stern (*) blockt eine Befehlszeile. Ein Ausrufezeichen (!) sperrt alle anderen Zeilen, was die Auswirkungen lediglich der betrachteten Zeile anzeigt. Der Befehl echo schreibt in die Werte von Variablen oder auch Ergebnisse von Berechnungen (echo(3 * 4)) in die Konsole.
Fazit
Wenige Zeilen genügen, um mit OpenSCAD komplexe geometrische Strukturen zu erzeugen. Dank der STL-Transformation verstehen auch andere Programme die Ergebnisse. Die meisten Slicer-Programme setzen sie für einen 3D-Druck korrekt um, sofern Sie die Dimensionen für die Längen angeben. Der 3D-Renderer Blender verschönert STL-Modelle durch Lichteffekte und Reflexionen, wobei er von der Maßhaltigkeit der Modelle profitiert. Um OpenSCAD zunächst einmal online auszuprobieren, ohne es zu installieren, schauen Sie doch einmal bei Openjscad [6] vorbei.
Glossar
-
CSG
-
Constructive Solid Geometry. Aufbau dreidimensionaler Strukturen durch Verschmelzen und Verschneiden von geometrischen Grundstrukturen.
-
STL
-
Abgeleitet vom Begriff “Stereolithografie”. Ein Standardformat für die Ausgabe von Oberflächen.
-
CGAL
-
Computational Geometry Algorithms Library. Bibliothek zum Rendern dreidimensionaler Oberflächen.
Infos
[1] OpenSCAD herunterladen: http://www.openscad.org/downloads.html
[2] Bibliothek für Lego-Steine: http://www.thingiverse.com/thing:178627
[3] Foto eines Schlüssels: https://commons.wikimedia.org/wiki/File:Zwei_gleiche_Schl%C3%BCssel_von_Abus.JPG?uselang=de
[4] Erdbebendaten: http://earthquake.usgs.gov/earthquakes/
[5] Befehlsübersicht: http://www.openscad.org/cheatsheet/index.html?version=2015.03
[6] Online-Version: http://openjscad.org









