4. Zylinder
Bereits bekannte Befehle:
union() {...}
difference() {...}
color("#800000")
translate([20,20,0])
cube([10,20,1]);
Zylinder
Es gibt neben 3D-Objekten wie cube() auch 2D-Objekte ohne z-Wert – also ohne Höhe. Diese Objekte müssen erst mit einem z-Wert versehen werden.
Dazu verwenden wir hier gleich zwei neue Befehle: circle() und linear_extrude().
4.1 Einfacher Zylinder
Beim Befehl cube() werden die Abmessungen für x, y und z definiert – dieser Befehl erzeugt direkt einen 3D-Körper. Es gibt aber auch 2D-Befehle wie circle(). Bei circle(7) wird nur ein Wert angegeben: die 7 steht für den Radius des Kreises.
Der zweite Befehl, den wir dafür benötigen, ist linear_extrude(). Extrudieren bedeutet: „Der grundlegende Prozess besteht darin, einer flachen, zweidimensionalen Form eine gewisse Tiefe (Höhe) zu verleihen – und so eine 2D-Form in eine 3D-Form umzuwandeln.“ Genau das macht linear_extrude(6): Aus dem Kreis wird ein Zylinder mit einer Höhe von 6 mm.
linear_extrude(6)
circle(7);
Als zweite Variante könnte das Beispiel auch wie folgt geschrieben werden:d = 14 steht für Durchmesser = 14 – was dem Radius von 7 entspricht.
linear_extrude(6)
circle(d=14);
In der 3D-Ansicht sehen wir, dass der Zylinder zentriert positioniert ist – die z-Achse verläuft genau durch seine Mitte.

4.2 Zylinder verschieben
Das Verschieben von Körpern kennen wir bereits. Setzen wir einfach ein translate() vor das linear_extrude() und verschieben den Zylinder in x- und y-Richtung jeweils um 7 mm – also um den Radius.
translate([7,7,0])
linear_extrude(6)
circle(7);
Die x- und y-Achse der Ansicht berühren nun den Zylinder jeweils in einem Punkt – sie bilden also eine Tangente an seine Außenkante.

Eine Tangente (von lateinisch: tangere ‚berühren‘) ist in der Geometrie eine Gerade, die eine gegebene Kurve in einem bestimmten Punkt berührt. Beispielsweise ist die Schiene für das Rad eine Tangente, da der Auflagepunkt des Rades ein Berührungspunkt der beiden geometrischen Objekte, Gerade und Kreis, ist.
4.3 Zwei Zylinder
translate([7,7,0])
linear_extrude(6)
circle(7);
circle(7);

Warum ist der zweite Zylinder so dünn? Und warum ist er nicht verschoben?
Hier kommen wieder die geschweiften Klammern ins Spiel.Der zweite circle(7) „weiss“ nichts von linear_extrude(6) und translate() des ersten circle(7) – er erhält daher weder Höhe noch Positionierung.
Das bedeutet: OpenSCAD weist 2D-Objekten ohne linear_extrude() standardmässig eine minimale Höhe von 1 mm zu und platziert sie bei 0,0.
⚠️ Achtung: Wo setzen wir die geschweifte Klammer? Versuchen wir es mal mit translate() { ... } – aber Achtung: Das funktioniert nur, wenn der Inhalt innerhalb der Klammern steht und richtig verschachtelt ist.
translate([7,7,0]) {
linear_extrude(6)
circle(7);
circle(7);
}
Das Problem scheint gelöst zu sein: Beide Zylinder befinden sich nun am gleichen Ort und haben dieselbe Höhe.

Machen wir noch einen Check mit Farben: Der eine circle() ist rot, der andere blau.
translate([7,7,0]) {
linear_extrude(6)
color("red")
circle(7);
color("blue")
circle(7);
}
Was ist hier los? Kippen wir die Ansicht, damit wir die Nulllinie sehen.

Oh, der circle() in blau liegt „unter Null“ und scheint immer noch keine Höhe zu haben. Der Grund ist einfach: Der zweite circle() hat immer noch kein linear_extrude().
Und noch etwas: Der circle() in rot ist gar nicht rot! Tatsächlich ignoriert OpenSCAD einen color()-Befehl, der direkt vor einem linear_extrude() steht – er wird nicht angewendet.
Probieren wir es mit color("red") vor dem linear_extrude() – und löschen die beiden nicht beachteten color()-Befehle bei den einzelnen circle()-Aufrufen.
translate([7,7,0])
color("red")
linear_extrude(6) {
circle(7);
circle(7);
}

Nun sehen wir beide circle(7) in rot – aber das macht keinen Sinn, da es sich um zwei identische Zylinder handelt.
4.4 Zwei Zylinder übereinander
Behandeln wir nun den zweiten circle() aus dem Beispiel als eigenständiges Objekt und positionieren ihn auf den ersten Zylinder.Dabei färben wir die beiden Kreise unterschiedlich: den ersten in Rot color("red"), den zweiten in Blau color("blue").Der zweite Kreis soll kleiner sein – also circle(5) – aber die gleiche Höhe erhalten wie der erste.
translate([7,7,0])
color("red")
linear_extrude(6)
circle(7);
translate([7,7,6])
color("blue")
linear_extrude(6)
circle(5);

Das Code-Beispiel enthält keine geschweiften Klammern, aber die Befehle, die zusammengehören, sind jeweils um zwei Leerzeichen eingerückt.Der Strichpunkt nach circle(7); schließt jeweils einen Zylinder ab.
Die Einrückung ist optional – sie verbessert aber die Lesbarkeit erheblich.
Natürlich könnten auch geschweifte Klammern für jedes translate(), color() und linear_extrude() verwendet werden – im vorliegenden Fall würde das Ergebnis jedoch identisch bleiben.
translate([7,7,0]) {
color("red") {
linear_extrude(6) {
circle(7);
}
}
}
translate([7,7,6])
color("blue")
linear_extrude(6)
circle(5);
4.4.1 Warum und wann {} oder Strichpunkt ;
OpenSCAD benötigt Strichpunkte und geschweifte Klammern, um die Struktur des Codes beim Interpretieren zu erkennen.
Befehle wie circle() oder cube() benötigen einen Strichpunkt ;, da sie keine Unterstrukturen („child modules“) besitzen – sie erzeugen direkt ein Objekt.
Dagegen haben Befehle wie translate(), color() oder linear_extrude() Unterstrukturen, da sie allein keinen Sinn ergeben – sie verändern oder umschließen andere Objekte.
Wir können die Befehle auch in einer Zeile schreiben – dann wird die Struktur durch die Reihenfolge und die Klammern definiert.
circle(7); cube(7);
Kreis; Würfel;
translate([7,7,0]) linear_extrude(6) circle(7);
schieben -> extrudieren -> Kreis;
translate([7,7,0]) linear_extrude(6) {circle(7); circle(7);}
schieben -> extrudieren -> (Kreis; Kreis;)
translate([7,7,0]) {linear_extrude(6) circle(7);} circle(7);
schieben -> (extrudieren -> Kreis;) Kreis;
translate([7,7,0]) {linear_extrude(6) {circle(7);} circle(7);}}
schieben -> (extrudieren -> (Kreis, Kreis))
4.5 Kreisauflösung
Nun stört etwas die Auflösung des Kreises: Es handelt sich nicht um einen echten Kreis, sondern um ein Vieleck.
OpenSCAD bietet dafür sogenannte Special Variables – darunter $fn, was für „number of fragments“ steht: die Anzahl der Segmente, aus denen der Kreis aufgebaut wird. Je höher der Wert, desto glatter der Kreis – und desto länger dauert die Berechnung.
Wir können am Anfang des Programms folgende Zeile hinzufügen:
$fn=60; // Auflösung von Kreisen

Nun wird der Kreis deutlich feiner dargestellt. Ohne explizite Angabe verwendet OpenSCAD standardmäßig $fn = 22 – also 22 Segmente pro Kreis.
Auch direkt im circle()-Befehl kann $fn überschrieben werden z.B. circle(10, $fn=4);
Das Ergebnis überrascht vielleicht: Der Kreis wird nur an dieser Stelle feiner – alle anderen Kreise im Code bleiben bei der globalen Einstellung.Auf diese Weise können sogar beliebige Vielecke erzeugt werden – einfach mit niedrigen $fn-Werten wie circle(7, $fn=6) → ein Sechseck. 😉
translate([0,0,0])
linear_extrude(6)
circle(10, $fn=4);
Das werden wir bestimmt noch bei anderen Gelegenheiten benötigen...

4.6 Einen Zylinder aushölen
Hier kombinieren wir difference(), translate() mit linear_extrude() und circle().Das gesamte Objekt verschieben wir um x = 20 und y = 10.
- Der erste Zylinder (rot) hat einen Radius von 7 mm.
- Der zweite Zylinder (blau) hat einen Radius von 5 mm.
💡 Hinweis: Da difference() das erste Objekt als „Grundkörper“ und alle folgenden als „Abzuziehende“ behandelt, wird der kleinere blaue Zylinder aus dem roten herausgeschnitten – jedoch nur die überschneidenden Teile.
$fn=60; // Auflösung von Kreisen
translate([20,10,0]) {
difference() {
color("red") {
linear_extrude(6)
circle(7);
}
color("blue") {
linear_extrude(6)
circle(5);
}
}
}
Das Ergebnis ist nicht ganz wie gewünscht – es wurde wieder vergessen, dass bei difference() ein kleines Übermass (z. B. 0,1 mm) berücksichtigt werden muss, um numerische Ungenauigkeiten zu vermeiden.
Der zweite Zylinder (der abzuziehende) muss daher:
- in z = -0.1 positioniert werden,
- und eine Höhe von 6.2 mm erhalten – also 0,1 mm darüber und darunter hinausragen.
✅ Warum? Ohne Übermaß kann OpenSCAD die Schnittfläche nicht korrekt berechnen – das führt zu unerwarteten Ergebnissen oder gar keinem Schnitt.

Der Code kann nun auf verschiedene Weisen gestaltet werden.
Zum Beispiel, indem du einen difference()-Block um zwei translate()-Aufrufe legst. Dabei muss jedes translate() relativ zum Ursprung (0,0,0) des Koordinatensystems berechnet werden – also nicht relativ zum vorherigen Objekt.
Der zweite Kreis (der abzuziehende) muss dann:
- in z = -0.1 positioniert sein,
- und mit linear_extrude(6.2) extrudiert werden – um das nötige Übermaß zu gewährleisten.
💡 Tipp: So bleibt die Struktur übersichtlich – und du vermeidest unerwartete Verschiebungen durch verschachtelte Transformationen.
difference() {
translate([20,10,0]) {
color("red") {
linear_extrude(6)
circle(7);
}
}
translate([20,10,-0.1]) {
color("blue") {
linear_extrude(6.2)
circle(5);
}
}
}
Hier verwenden wir ein verschachteltes translate():
Der gesamte difference()-Block wird um [20, 10, 0] verschoben. Innerhalb des difference()-Blocks wird der zweite Kreis (der abzuziehende) zusätzlich um translate([0, 0, -0.1]) verschoben – also nur in z-Richtung um -0,1 mm.
✅ Wichtig: Die zusätzliche Verschiebung in z erfolgt relativ zum aktuellen Koordinatensystem – also innerhalb des verschobenen Blocks.So bleibt der zweite Zylinder exakt unter dem ersten, aber mit dem nötigen Übermaß für difference().
translate([20,10,0]) {
difference() {
color("red") {
linear_extrude(6)
circle(7);
}
translate([0,0,-0.1]) {
color("blue") {
linear_extrude(6.2)
circle(5);
}
}
}
}

Das Ergebnis ist bei beiden Varianten identisch. Bei der zweiten Variante lässt sich die gesamte Struktur jedoch viel einfacher verschieben – du musst nur an einer Stelle die Werte ändern (z. B. translate([20,10,0])), und die gesamte Röhre bewegt sich mit.
💡 Vorteil der verschachtelten Struktur: Du koppelst alle Teile an einen gemeinsamen Ursprung – das macht das Design flexibler und wartbarer.
translate([-14,10,10]) {
difference() {
color("red") {
...
Ändern wir translate([-14, 10, 10]) – und schon „schwebt“ die Röhre im Minus-Bereich. Die gesamte Röhrenstruktur wird korrekt und konsistent verschoben.
📌 Wichtig: Diese Struktur – ein übergeordnetes translate() um den gesamten difference()-Block – wird später bei Löchern in Brettern oder ähnlichen Bauteilen sehr nützlich sein. So kannst du ganze Bohrungen oder Aussparungen einfach verschieben, ohne jede Einzelkomponente anzupassen.

4.7 Übungen zum Kapitel
4.7.1 Löcher in Bretter bohren
Mit den bis hierhin gelernten Befehlen können wir nun endlich Löcher in Bretter bohren.
- Das Brett soll die Farbe color("burlywood") haben und die Abmessungen cube([40, 80, 5]).
- Die Löcher sind circle(3) – also mit Radius 3 mm – und jeweils 3 mm von den Außenkanten des Brettes entfernt.
- Das Brett ist in diesem Beispiel um x = 10 und y = 10 verschoben.
✅ Strukturziel: Das gesamte Objekt – Brett mit Löchern – soll wie im vorherigen Rohrbeispiel einfach verschiebbar sein:→ Ein einziges translate() um den gesamten difference()-Block reicht aus.
