OpenSCAD: 3D-Körper

Akademie

OpenSCAD: 3D-Körper

Primitive, Transformationen, boolesche Operationen, Hüllen und Rundungen.

3D-Primitive: cube, sphere, cylinder, polyhedron

Begriffe vorab

  • Primitive: Grundkörper, aus denen alles zusammengesetzt wird.
  • center: Gibt an, ob ein Körper um den Ursprung zentriert wird.
  • r und d: Radius und Durchmesser (d nur als benannter Parameter).
  • Fragment: Ein Segment der Kreisannäherung; Anzahl steuern $fn, $fa, $fs.
  • Manifold: Geschlossene, saubere Oberfläche ohne Lücken – Bedingung für gültige 3D-Modelle.

cube()

Signatur: cube(size, center). size ist eine Zahl (Würfel) oder ein Vektor [x, y, z]; Standard ist [1, 1, 1]. Mit center = false (Standard) liegt der Körper im positiven Oktanten mit einer Ecke im Ursprung, mit center = true sitzt der Mittelpunkt im Ursprung.

sphere()

sphere(r) oder sphere(d = …); Standard ist Radius 1. Der Durchmesser d muss als benannter Parameter angegeben werden. Die Glätte hängt von $fn, $fa und $fs ab (eigene Lektion).

cylinder()

Parameter: h (Höhe, Standard 1), r für beide Enden oder r1 (unten) und r2 (oben), dazu d, d1, d2 als Durchmesser-Varianten und center. Ist r1 ungleich r2, entsteht ein Kegelstumpf; bei r2 = 0 ein Kegel. Standard: cylinder(h = 1, r1 = 1, r2 = 1, center = false).

Wichtige Warnung der Doku: Wer mit cylinder() und difference() Löcher macht, erhält zu kleine Löcher, weil das Polygon innerhalb des Kreises liegt. Dazu mehr in „Auflösung“.

polyhedron()

polyhedron(points, faces, convexity) baut beliebige Körper aus Eckpunkten und Flächen. points ist eine Liste von [x, y, z] (Index ab 0), faces eine Liste von Flächen mit je mindestens drei Punktindizes. Kernregel: Die Punkte jeder Fläche müssen im Uhrzeigersinn angeordnet sein, wenn man von außen auf die Fläche blickt. Zudem muss das Ergebnis geschlossen sein: An jeder Kante treffen genau zwei Flächen aufeinander. Zum Prüfen empfiehlt die Doku, das Polyhedron mit einem Würfel zu vereinigen und zu rendern (F6) – verschwindet es, ist die Reihenfolge falsch. In der Vorschau helfen die „Thrown Together“-Ansicht (F12) und die rosa Darstellung falsch herum liegender Flächen.

// Vier Grundkörper nebeneinander
cube([10, 20, 5]);
translate([20, 0, 0]) cube(8, center = true);
translate([40, 0, 0]) sphere(d = 12);
translate([60, 0, 0]) cylinder(h = 15, r1 = 6, r2 = 2);

// Eine Pyramide als polyhedron (Flächen im Uhrzeigersinn von außen)
translate([0, 40, 0])
polyhedron(
    points = [[0,0,0],[10,0,0],[10,10,0],[0,10,0],[5,5,10]],
    faces  = [[0,1,4],[1,2,4],[2,3,4],[3,0,4],[3,2,1,0]]
);

Die Pyramide hat fünf Punkte (vier Grundpunkte, eine Spitze) und fünf Flächen: vier Dreiecke und die Grundfläche. Die Grundfläche steht als [3,2,1,0] in umgekehrter Reihenfolge, damit sie von außen (also von unten) im Uhrzeigersinn läuft.

Merke dir den Standard „Ecke im Ursprung“ – wer mittig rechnen will, setzt center = true.

Zum Selbermachen

  1. Baue einen Kegel (r2 = 0) und einen Kegelstumpf und vergleiche beide.
  2. Ändere in der Pyramide die Reihenfolge einer Fläche und beobachte die rosa Darstellung in der Vorschau.

Verwandte Themen

OpenSCAD → Die übrigen Lektionen dieser Themenwelt; Informatik: Grundlagen → „Algorithmen und Berechenbarkeit“ für das Denken in Schritten.

Prüfstatus: Belegt (Stand 1. Oktober 2026): Signaturen, Parameter und Standardwerte von cube, sphere und cylinder, die Warnung zu zu kleinen Löchern sowie die Face-Reihenfolge, die Geschlossenheitsbedingung und die Prüfmethoden von polyhedron wurden gegen die Seite „Primitive Solids“ geprüft. Alle Codebeispiele dieser Lektion wurden mit OpenSCAD 2026.09.18 (lokale Installation) ausgeführt und liefen ohne Fehler und Warnungen. Nicht einzeln belegt: die Erklärungen in eigenen Worten, die Beispiele als solche (konstruiert) und die Wertungen.

Quellen

  • OpenSCAD User Manual – Primitive Solids (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Primitive_Solids)
  • OpenSCAD Cheat Sheet (openscad.org/cheatsheet, bezieht sich auf Version 2021.01)

Boolesche Operationen: union, difference, intersection

Begriffe vorab

  • CSG: Constructive Solid Geometry: Körper entstehen durch Verknüpfung einfacher Körper.
  • union: Vereinigung aller Kinder.
  • difference: Das erste Kind minus alle weiteren.
  • intersection: Nur der gemeinsame Bereich aller Kinder.
  • Epsilon: Winzige Überlappung (z. B. 0,01), die Flächen-Zusammenfall verhindert.

Die drei Operationen

  • union() bildet die Summe aller Kinder (logisches Oder). Die Vereinigung ist implizit, wenn man sie nicht hinschreibt – aber zwingend nötig, zum Beispiel in difference(), um mehrere erste Kinder zu einem zu gruppieren.
  • difference() zieht das zweite und alle weiteren Kinder vom ersten ab („und nicht“).
  • intersection() behält nur den Bereich, den alle Kinder gemeinsam haben.

Die wichtigste Regel: keine deckungsgleichen Flächen

Die Doku sagt es klar: Bei Vereinigungen dürfen die äußeren, zu verschmelzenden Flächen nicht deckungsgleich sein. Die Lösung ist eine kleine Überlappung (Epsilon, typisch 0,01). Ohne sie entstehen flackernde Flächen in der Vorschau (Z-Fighting) und im Export unsaubere, nicht geschlossene Oberflächen. Beim Abziehen gilt dasselbe: Der abziehende Körper soll deutlich über die Fläche hinausragen, aus der er etwas herausnimmt.

// Platte mit durchgehendem Loch und Senkung
difference() {
    cube([40, 40, 10]);

    // Loch: 1 mm länger in beide Richtungen (Epsilon-Prinzip)
    translate([20, 20, -1])
        cylinder(h = 12, r = 5, $fn = 64);

    // Senkung von oben
    translate([20, 20, 6])
        cylinder(h = 5, r1 = 5, r2 = 9, $fn = 64);
}

// Schnitt: Kugel mit Würfel
translate([60, 0, 0])
intersection() {
    sphere(r = 14, $fn = 48);
    cube(20, center = true);
}

render()

render(convexity) erzwingt die vollständige Berechnung eines Teilbaums, auch in der Vorschau. Die Doku warnt, dass das die Vorschau sehr langsam machen kann. Der Parameter convexity gibt an, wie viele Flächen ein Strahl höchstens durchdringt – 10 funktioniert laut Doku in den meisten Fällen.

Denkweise

Zerlege jedes Bauteil in „Material hinzufügen“ (union) und „Material wegnehmen“ (difference). Die Reihenfolge bei difference ist wichtig: Das erste Kind ist immer das, wovon abgezogen wird.

Faustregel: Schneidkörper immer länger machen als das Bauteil und um mindestens 0,01 überlappen lassen.

Zum Selbermachen

  1. Bohre vier Löcher in eine Platte und prüfe in F5, dass an den Lochrändern nichts flackert.
  2. Vereinige zwei Würfel, die sich genau an einer Fläche berühren, und dann mit 0,01 Überlappung – vergleiche das Ergebnis.

Verwandte Themen

OpenSCAD → Die übrigen Lektionen dieser Themenwelt; Informatik: Grundlagen → „Algorithmen und Berechenbarkeit“ für das Denken in Schritten.

Prüfstatus: Belegt (Stand 1. Oktober 2026): Definitionen von union (implizit), difference und intersection, die Regel gegen deckungsgleiche Flächen mit Epsilon 0,01 sowie render() inklusive Convexity-Wert und Geschwindigkeitswarnung wurden gegen die Seiten „CSG Modelling“ und „FAQ“ geprüft. Alle Codebeispiele dieser Lektion wurden mit OpenSCAD 2026.09.18 (lokale Installation) ausgeführt und liefen ohne Fehler und Warnungen. Nicht einzeln belegt: die Erklärungen in eigenen Worten, die Beispiele als solche (konstruiert) und die Wertungen.

Quellen

  • OpenSCAD User Manual – CSG Modelling (en.wikibooks.org/wiki/OpenSCAD_User_Manual/CSG_Modelling)
  • OpenSCAD User Manual – FAQ (en.wikibooks.org/wiki/OpenSCAD_User_Manual/FAQ)
  • OpenSCAD Cheat Sheet (openscad.org/cheatsheet, bezieht sich auf Version 2021.01)

Hüllen, Minkowski-Summe und Rundungen

Begriffe vorab

  • hull: Konvexe Hülle: kleinste konvexe Form, die alle Kinder umschließt.
  • minkowski: Minkowski-Summe: Eine Form wird an der Oberfläche einer anderen entlanggeführt.
  • offset: Verbreitert oder verkleinert eine 2D-Form.
  • fill: Entfernt Löcher aus 2D-Formen.
  • Fillet: Rundung einer Innenkante.

hull()

hull() berechnet die konvexe Hülle seiner Kinder – wie ein Gummiband, das um alle Teile gespannt wird. Die Doku nennt eine Besonderheit: Die Hülle von 2D-Objekten nutzt deren Projektionen (Schatten) auf die xy-Ebene und liefert ein Ergebnis in dieser Ebene. Effizienztipp: Wenn möglich, erst 2D-Formen hüllen und dann extrudieren, statt 3D-Körper zu hüllen. Ein klassisches Rezept sind abgerundete Quader: vier Zylinder in den Ecken, darum hull().

minkowski()

minkowski() bildet die Minkowski-Summe der Kinder; für die Addition wird der Ursprung des zweiten Objekts verwendet. Praktisch: Eine Kugel mit Radius r an einem Körper entlangzuführen, rundet alle Außenkanten und -ecken ab (das Rezept minkowski() { children(); sphere(r); } steht auf der Seite „Tips and Tricks“). Die Doku warnt: Bei hohen $fn-Werten können Rechenzeit und Speicher stark wachsen, weil jedes Kind mit allen Teilen der anderen kombiniert wird. Zusammengesetzte Eingaben kann OpenSCAD getrennt behandeln – fasse sie vorher mit union() zusammen.

offset() (2D)

offset(r = …) verbreitert eine 2D-Form mit gerundeten Ecken, offset(delta = …) mit spitzen Ecken; mit chamfer = true werden Ecken bei delta abgeschrägt. Negative Werte verkleinern. Zwei Kombinationen aus der Doku: Fillet (Innenecken runden): offset(r = -3) offset(delta = +3); Round (Außenecken runden): offset(r = +3) offset(delta = -3).

fill()

fill() entfernt Löcher aus Polygonen, ohne den Umriss zu ändern. Bei konvexen Polygonen entspricht das Ergebnis hull().

// 1) Abgerundete Platte per hull() aus vier Zylindern
module runde_platte(b, t, h, r) {
    hull()
        for (x = [r, b - r], y = [r, t - r])
            translate([x, y, 0]) cylinder(h = h, r = r, $fn = 48);
}
runde_platte(40, 25, 4, 5);

// 2) Rundungen per offset(): Rechteck mit gerundeten Außenecken, dann extrudiert
translate([0, 40, 0])
linear_extrude(4)
    offset(r = 4, $fn = 48) offset(delta = -4) square([40, 25]);

// 3) Abgerundeter Würfel per minkowski()
translate([60, 0, 0])
minkowski() {
    cube([14, 14, 14]);
    sphere(r = 3, $fn = 24);
}

Das hull() bekommt mehrere Zylinder aus einer for-Schleife; die Schleife erzeugt die vier Eckpositionen, hull() verbindet sie zu einer Platte mit runden Ecken.

Rundungen sind keine Eigenschaft einzelner Kanten, sondern entstehen durch Operationen auf der ganzen Form – plane sie früh ein.

Zum Selbermachen

  1. Baue eine Platte mit vier gerundeten Ecken per hull() und danach per offset() – vergleiche die Anzahl der Zeilen.
  2. Probiere minkowski() mit unterschiedlichen $fn-Werten und beobachte die Rechenzeit.

Verwandte Themen

OpenSCAD → Die übrigen Lektionen dieser Themenwelt; Informatik: Grundlagen → „Algorithmen und Berechenbarkeit“ für das Denken in Schritten.

Prüfstatus: Belegt (Stand 1. Oktober 2026): Beschreibung und Warnungen zu hull, minkowski (Ursprung des zweiten Objekts, Rechenaufwand, union-Hinweis), fill sowie offset (r, delta, chamfer, Fillet- und Round-Rezepte) wurden gegen die Seiten „Transformations“ und „Tips and Tricks“ geprüft. Alle Codebeispiele dieser Lektion wurden mit OpenSCAD 2026.09.18 (lokale Installation) ausgeführt und liefen ohne Fehler und Warnungen. Nicht einzeln belegt: die Erklärungen in eigenen Worten, die Beispiele als solche (konstruiert) und die Wertungen.

Quellen

  • OpenSCAD User Manual – Transformations (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations)
  • OpenSCAD User Manual – Tips and Tricks (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Tips_and_Tricks)
  • OpenSCAD Cheat Sheet (openscad.org/cheatsheet, bezieht sich auf Version 2021.01)

Transformationen: translate, rotate, scale, mirror, color

Begriffe vorab

  • Transformation: Operation, die ihre Kind-Objekte verschiebt, dreht, skaliert oder färbt.
  • Kind-Objekt: Objekt, das direkt nach der Transformation folgt.
  • Rechte-Hand-Regel: Daumen entlang der positiven Achse, die Finger zeigen die Drehrichtung.
  • Affine Matrix: Matrix, die Verschiebung, Skalierung und Scherung vereint.
  • Alpha: Deckkraft einer Farbe von 0 bis 1.

Wirkung und Reihenfolge

Eine Transformation steht vor den Objekten, auf die sie wirkt. Mehrere Transformationen werden laut Doku von rechts nach links angewendet: Die der Geometrie nächste wirkt zuerst. Deshalb liefert translate(...) rotate(...) cube(...) etwas anderes als rotate(...) translate(...) cube(...).

translate und rotate

translate(v = [x, y, z]) verschiebt entlang eines Vektors. rotate([ax, ay, az]) dreht um die Achsen in Grad. Die Doku legt fest: Werden mehrere Achsen angegeben, dreht OpenSCAD erst um x, dann um y, dann um z. Zusätzlich gibt es rotate(a = Winkel, v = [x, y, z]) für eine beliebige Achse, und in 2D genügt rotate(45) – das dreht um die Z-Achse. Es gilt die Rechte-Hand-Regel.

scale, resize, mirror

  • scale([sx, sy, sz]) multipliziert die vorhandenen Maße mit Faktoren.
  • resize(newsize = [x, y, z]) setzt die Zielmaße. Eine 0 lässt die Dimension unverändert, auto = true skaliert Nullmaße proportional mit. Achtung: resize ist eine CGAL-Operation und rechnet auch in der Vorschau mit voller Geometrie.
  • mirror(v) spiegelt an einer Ebene durch den Ursprung mit Normalenvektor v. Es verdoppelt nichts, sondern spiegelt das Objekt.

multmatrix

multmatrix(m) wendet eine 4×3- oder 4×4-Matrix an (Skalierung, Scherung, Verschiebung in einer Matrix). Die vierte Zeile wird auf [0,0,0,1] gesetzt und darf fehlen.

color

Formen: color([r, g, b, a]) mit Werten von 0.0 bis 1.0, color([r, g, b], alpha = 1.0), color("#hexwert") (Formate #rgb, #rgba, #rrggbb, #rrggbbaa) und color("name", alpha) mit SVG-Farbnamen (Groß-/Kleinschreibung egal), dazu "transparent". Die Doku rät, transparente Formen nach den undurchsichtigen zu zeichnen, damit diese hindurch sichtbar bleiben.

// Reihenfolge zählt: rechts nach links
color("tomato")    cube(10);
color("steelblue") translate([20, 0, 0]) rotate([0, 0, 45]) cube(10);
color("seagreen")  rotate([0, 0, 45]) translate([20, 0, 0]) cube(10);

// Spiegeln und Skalieren
color("gold") translate([0, 40, 0]) {
    cube([10, 5, 5]);
    mirror([1, 0, 0]) cube([10, 5, 5]);
}
color("#8a2be2", 0.5) translate([30, 40, 0]) scale([1, 2, 0.5]) sphere(r = 8);

Das blaue Quadrat wird erst gedreht und dann verschoben (die Drehung wirkt zuerst um den Ursprung und dann um die Würfelecke), das grüne umgekehrt: erst verschieben, dann um den Ursprung drehen – es landet an einer ganz anderen Stelle.

Wenn ein Objekt „an der falschen Stelle“ landet, ist meist die Reihenfolge von translate und rotate vertauscht.

Zum Selbermachen

  1. Vertausche translate und rotate im Beispiel und beschreibe, was sich ändert.
  2. Färbe ein Objekt halbtransparent und lege ein undurchsichtiges dahinter.

Verwandte Themen

OpenSCAD → Die übrigen Lektionen dieser Themenwelt; Informatik: Grundlagen → „Algorithmen und Berechenbarkeit“ für das Denken in Schritten.

Prüfstatus: Belegt (Stand 1. Oktober 2026): Wirkungsreihenfolge von rechts nach links, die Drehreihenfolge x, y, z, die Formen von rotate, scale, resize (inkl. CGAL-Hinweis), mirror, multmatrix (vierte Zeile) und color (Formate, Hex, SVG-Namen, transparent, Zeichenreihenfolge) wurden gegen die Seite „Transformations“ geprüft. Alle Codebeispiele dieser Lektion wurden mit OpenSCAD 2026.09.18 (lokale Installation) ausgeführt und liefen ohne Fehler und Warnungen. Nicht einzeln belegt: die Erklärungen in eigenen Worten, die Beispiele als solche (konstruiert) und die Wertungen.

Quellen

  • OpenSCAD User Manual – Transformations (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations)
  • OpenSCAD Cheat Sheet (openscad.org/cheatsheet, bezieht sich auf Version 2021.01)