OpenSCAD Benutzerhandbuch/3D-Objekte
cube
[Bearbeiten]Erzeugt einen Würfel oder Quader (also eine „Box“) im ersten Oktanten. Wenn "center" auf "true" gesetzt ist, wird der Würfel am Ursprung zentriert. Die Parameternamen sind optional, wenn die Argumente in der hier gezeigten Reihenfolge übergeben werden.
cube(size = [x,y,z], center = true/false);
cube(size = x , center = true/false);
- Parameter:
- size
- Einzelwert → Würfel mit dieser Kantenlänge
- 3-Werte-Array "[x,y,z]" → Quader mit den Abmessungen x, y und z
- center
- false (Standard): Der Quader liegt im 1. Oktanten, eine Ecke bei (0,0,0)
- true: Der Quader ist am Punkt (0,0,0) zentriert
- size
Standardwert:
cube(); // entspricht: cube(size = [1, 1, 1], center = false);
- Beispiele:
Äquivalente Schreibweisen für dieses Beispiel:
cube(size = 18);
cube(18);
cube([18,18,18]);
cube(18,false);
cube([18,18,18],false);
cube([18,18,18],center=false);
cube(size = [18,18,18], center = false);
cube(center = false,size = [18,18,18]);
Äquivalente Schreibweisen für dieses Beispiel:
cube([18,28,8],true);
box=[18,28,8];cube(box,true);
sphere
[Bearbeiten]Erzeugt eine Kugel am Ursprung des Koordinatensystems. Der Parametername "r" ist optional. Möchtest du stattdessen den Durchmesser ("d") angeben, muss dieser explizit benannt werden.
Parameter
- r
- Radius der Kugel
- d
- Durchmesser der Kugel
Die Auflösung der Kugel hängt von ihrer Größe und den Variablen $fa, $fs und $fn ab. Mehr dazu findest du unter Kreisauflösung: $fa, $fs und $fn.
Standardwert:
sphere(); // entspricht: sphere($fn = 0, $fa = 12, $fs = 2, r = 1);
Beispiele
sphere(r = 1);
sphere(r = 5);
sphere(r = 10);
sphere(d = 2);
sphere(d = 10);
sphere(d = 20);
// Erzeugt eine hochauflösende Kugel mit 2 mm Radius
sphere(2, $fn=100);
// Auch eine 2-mm-Kugel, aber mit weniger kleinen Dreiecken an den Polen
sphere(2, $fa=5, $fs=0.1);
cylinder
[Bearbeiten]Erzeugt einen Zylinder oder Kegel um die Z-Achse. Ist "center = true", wird er zusätzlich vertikal zentriert.
Parameternamen sind optional, wenn die Argumente in der hier gezeigten Reihenfolge stehen. Sobald ein Parameter benannt wird, müssen alle folgenden ebenfalls benannt sein.
cylinder(h = höhe, r1 = untern_radius, r2 = oberer_radius, center = true/false);
Hinweise: Die 2. und 3. Positionsparameter sind "r1" und "r2". Werden stattdessen "r", "d", "d1" oder "d2" verwendet, müssen sie benannt werden.
Ist einer der Radien null, entsteht ein Kegel. Sind beide Radien ungleich null und unterschiedlich, ergibt sich ein Kegelstumpf (Conical Frustum). "r1"/"d1" definieren die Basis bei [0,0,0], "r2"/"d2" die Oberseite.
- Parameter
- h : Höhe des Zylinders oder Kegels
- r : Radius (gilt für beide Enden: r1 = r2 = r)
- r1 : Radius der Unterseite
- r2 : Radius der Oberseite
- d : Durchmesser (r1 = r2 = d/2) Vorlage:Requires
- d1 : Durchmesser unten (r1 = d1/2) Vorlage:Requires
- d2 : Durchmesser oben (r2 = d2/2) Vorlage:Requires
- center
- false (Standard): z reicht von 0 bis h
- true: z reicht von -h/2 bis +h/2
Die Auflösung richtet sich nach dem größeren Radius und den Variablen $fa, $fs, $fn.
Standardwert:
cylinder(); // entspricht: cylinder($fn = 0, $fa = 12, $fs = 2, h = 1, r1 = 1, r2 = 1, center = false);
cylinder(h=15, r1=9.5, r2=19.5, center=false);
cylinder( 15, 9.5, 19.5, false);
cylinder( 15, 9.5, 19.5);
cylinder( 15, 9.5, d2=39 );
cylinder( 15, d1=19, d2=39 );
cylinder( 15, d1=19, r2=19.5);
cylinder(h=15, r1=10, r2=0, center=true);
cylinder( 15, 10, 0, true);
cylinder(h=15, d1=20, d2=0, center=true);
-
center = false
-
center = true
Äquivalente Schreibweisen:
cylinder(h=20, r=10, center=true);
cylinder( 20, 10, 10,true);
cylinder( 20, d=20, center=true);
cylinder( 20,r1=10, d2=20, center=true);
cylinder( 20,r1=10, d2=2*10, center=true);
- Verwendung von $fn
Größere Werte von "$fn" erzeugen glattere, kreisförmigere Oberflächen – kosten aber Rendering-Zeit. Viele nutzen mittlere Werte während der Entwicklung (für schnelle Vorschau) und erhöhen "$fn" erst vor dem finalen Rendern (F6).
Kleine Werte erzeugen interessante nicht-runde Formen:
Beispielskripte:
cylinder(20,20,20,$fn=3);
cylinder(20,20,00,$fn=4);
cylinder(20,20,10,$fn=4);
- Zu kleine Bohrungen
Wenn du mit "difference()" Löcher mittels "cylinder()" erzeugst, werden diese oft zu klein. Grund: Kreise werden durch ein einbeschriebenes Polygon approximiert – die Eckpunkte liegen auf dem Kreis, die Kanten aber innen drin. Damit das Loch überall größer als der Sollradius ist, brauchst du ein umgeschriebenes Polygon. Dazu gibt es spezielle Module: Module für übergroße Bohrungen.
Beispielskript:
poly_n = 6;
color("blue") translate([0, 0, 0.02]) linear_extrude(0.1) circle(10, $fn=poly_n);
color("green") translate([0, 0, 0.01]) linear_extrude(0.1) circle(10, $fn=360);
color("purple") linear_extrude(0.1) circle(10/cos(180/poly_n), $fn=poly_n);
Allgemein gilt: Ein regelmäßiges Polygon mit Radius hat am Mittelpunkt einer Seite den Abstand . Kennst du nur diesen Innenradius (z. B. für einen Innensechskant), berechnest du den benötigten Polygonradius als .
polyhedron
[Bearbeiten]Ein Polyeder ist der allgemeinste 3D-Grundkörper. Damit kannst du jede beliebige Form – konvex oder konkav – bauen. Gekrümmte Flächen werden durch viele ebene Flächen angenähert.
Vor Version 2014.03:
polyhedron(points = [[x₀,y₀,z₀], [x₁,y₁,z₁], ...], triangles = [[p₀,p₁,p₂], ...], convexity = N);
Ab Version 2014.03:
polyhedron(points = [[x₀,y₀,z₀], [x₁,y₁,z₁], ...], faces = [[p₀,p₁,p₂,p₃,...], ...], convexity = N);
- Parameter
- points
- Liste von 3D-Punkten. Jeder Punkt ist ein Vektor "[x,y,z]".
- Die Reihenfolge ist beliebig. Auf die Punkte wird per Index (0 bis N-1) verwiesen.
- points
- triangles Vorlage:OpenSCAD User Manual/Deprecated
- Liste von Dreiecksflächen. Jede Fläche enthält drei Indizes aus "points".
- triangles Vorlage:OpenSCAD User Manual/Deprecated
- faces Vorlage:Requires
- Liste von Flächen mit mindestens drei Punkten.
- Die Punkte einer Fläche müssen im Uhrzeigersinn angeordnet sein, wenn man die Fläche von außen betrachtet.
- Liegen die Punkte nicht in einer Ebene, wird die Fläche automatisch in Dreiecke zerlegt.
- faces Vorlage:Requires
- convexity
- Ganzzahl. Gibt an, wie oft ein Strahl das Objekt maximal durchdringen kann.
- Wichtig nur für die korrekte Darstellung im OpenCSG-Vorschaumodus (F5).
- Standardwert 10 reicht meist aus.
- convexity
Standardwert:
polyhedron(); // entspricht: polyhedron(points = undef, faces = undef, convexity = 1);
Wichtig zur Orientierung: Die Punkte jeder Fläche müssen im Uhrzeigersinn aufgelistet werden, wenn du die Fläche von außen anschaust. Für die Unterseite schaust du also von unten, für die Rückseite von hinten usw.
Alternativ merk dir die Linke-Hand-Regel: Streck deinen linken Daumen vom Körper weg und krümme die Finger – die Punktfolge muss der Krümmungsrichtung deiner Finger folgen. (Achtung: STL-Dateien nutzen die *rechte*-Hand-Regel!)
- Beispiel 1 – Würfel mit "polyhedron" (entspricht "cube([10,7,5])")


CubePoints = [
[ 0, 0, 0 ], //0
[ 10, 0, 0 ], //1
[ 10, 7, 0 ], //2
[ 0, 7, 0 ], //3
[ 0, 0, 5 ], //4
[ 10, 0, 5 ], //5
[ 10, 7, 5 ], //6
[ 0, 7, 5 ]]; //7
CubeFaces = [
[0,1,2,3], // unten
[4,5,1,0], // vorn
[7,6,5,4], // oben
[5,6,2,1], // rechts
[6,7,3,2], // hinten
[7,4,0,3]]; // links
polyhedron(CubePoints, CubeFaces);
Äquivalente Beschreibungen der Unterseite:
[0,1,2,3],
[0,1,2,3,0],
[1,2,3,0],
[2,3,0,1],
[3,0,1,2],
[0,1,2],[2,3,0], // zwei Dreiecke ohne Überlapp
[1,2,3],[3,0,1],
[1,2,3],[0,1,3],
- Beispiel 2 – Pyramide mit quadratischer Basis:

polyhedron(
points=[ [10,10,0],[10,-10,0],[-10,-10,0],[-10,10,0], // Basis
[0,0,10] ], // Spitze
faces=[ [0,1,4],[1,2,4],[2,3,4],[3,0,4], // Seiten (Dreiecke)
[1,0,3],[2,1,3] ] // Basis (zwei Dreiecke)
);
- Beispiel 3 – Dreiecksprisma:

module prism(l, w, h) {
polyhedron(
points=[[0,0,0], [0,w,h], [l,w,h], [l,0,0], [0,w,0], [l,w,0]],
faces=[[0,1,2,3], // obere schräge Fläche
[2,1,4,5], // senkrechte Rechteckfläche
[0,3,5,4], // untere Fläche
[0,4,1], // hintere Dreiecksfläche
[3,2,5]] // vordere Dreiecksfläche
);
}
prism(10, 10, 5);
Debugging von Polyedern
[Bearbeiten]Häufige Fehler:
- Flächen nicht im Uhrzeigersinn (von außen gesehen!)
- Überlappende oder fehlende Flächen
- Nicht-mannigfaltige Geometrie
Ein gültiger Polyeder muss mannigfaltig sein:
- An jeder Kante stoßen genau zwei Flächen zusammen.
- Haben zwei Flächen einen gemeinsamen Punkt, müssen sie Teil desselben Zyklus um diesen Punkt sein.
Prüfung in OpenSCAD:
- Aktiviere „Thrown Together“ (Ansicht → Thrown Together) und drücke F5.
- Falsch orientierte Flächen erscheinen rosa.
- Drehe das Objekt, um alle Seiten zu prüfen.
- Rosa-Ansicht abschalten mit F10.
Du kannst auch Teile der "faces"-Liste temporär auskommentieren, um einzelne Flächen zu prüfen:

CubeFaces = [
/* [0,1,2,3], // unten
[4,5,1,0], // vorn */
[7,6,5,4], // oben
/* [5,6,2,1], // rechts
[6,7,3,2], // hinten */
[7,4,0,3]]; // links
Wichtig: Selbst wenn die Vorschau (F5) gut aussieht, kann der Polyeder beim Rendern (F6) verschwinden – dann ist er nicht gültig. Um das zu testen, vereinige ihn mit einem Würfel ("union()") und rendere ihn. Verschwindet er? Dann stimmt die Orientierung nicht!
Falsch orientierte Flächen
[Bearbeiten]- Beispiel 4 – Komplexer Polyeder mit falscher Orientierung
Im Modus „Thrown Together“ + F5 werden falsch orientierte Flächen rosa markiert:
// Schlechter Polyeder
polyhedron(
points = [
[0, -10, 60], [0, 10, 60], [0, 10, 0], [0, -10, 0],
[60, -10, 60], [60, 10, 60], [10, -10, 50], [10, 10, 50],
[10, 10, 30], [10, -10, 30], [30, -10, 50], [30, 10, 50]
],
faces = [
[0,2,3], [0,1,2], [0,4,5], [0,5,1], [5,4,2], [2,4,3],
[6,8,9], [6,7,8], [6,10,11], [6,11,7], [10,8,11],
[10,9,8], [0,3,9], [9,0,6], [10,6, 0], [0,4,10],
[3,9,10], [3,10,4], [1,7,11], [1,11,5], [1,7,8],
[1,8,2], [2,8,11], [2,11,5]
]
);

Korrekte Version:
polyhedron(
points = [ /* dieselben Punkte */ ],
faces = [
[0,3,2], [0,2,1], [4,0,5], [5,0,1], [5,2,4], [4,2,3],
[6,8,9], [6,7,8], [6,10,11], [6,11,7], [10,8,11],
[10,9,8], [3,0,9], [9,0,6], [10,6, 0], [0,4,10],
[3,9,10], [3,10,4], [1,7,11], [1,11,5], [1,8,7],
[2,8,1], [8,2,11], [5,11,2]
]
);
- Tipp für Einsteiger
Verstehst du „Orientierung“ noch nicht ganz? Dann such die rosa Flächen, und kehr die Reihenfolge der Punkte einfach um, bis sie grün wird. Beispiel: Aus "[0,4,5]" wird "[4,0,5]". Merke: Die Punktliste ist zyklisch – "[4,0,5]", "[0,5,4]" und "[5,4,0]" sind alle korrekt (Uhrzeigersinn!). Hilfreich: Aktiviere „Show Edges“ (Ansicht-Menü), mache einen Screenshot und nummeriere Punkte (schwarz) und Flächen (blau).
- Uhrzeigersinn-Technik
Schau dir die Fläche von außen an. Die Punktreihenfolge muss im Uhrzeigersinn verlaufen.
- "[4,0,5]" → Uhrzeigersinn → gut
- "[0,4,5]" → gegen den Uhrzeigersinn → schlecht
Denk an die Linke-Hand-Regel: Lege deine linke Hand auf die Fläche, Finger in Pfeilrichtung der Punkte – dein Daumen muss nach außen zeigen. Zeigt er nach innen? Dann umdrehen!

Kurzfassung „Polyeder“
- Points: Liste aller Eckpunkte (jeweils "[x,y,z]").
- Faces: Liste aller Flächen (jeweils Indizes aus "points").
- Jede Fläche muss von außen gesehen im Uhrzeigersinn aufgelistet sein.
Wiederholte Punkte in der Point-Liste
[Bearbeiten]Die Punktliste darf Duplikate enthalten. Gleiche Koordinaten gelten als derselbe Eckpunkt. Folgender Polyeder:
points = [[ 0, 0, 0], [10, 0, 0], [ 0,10, 0],
[ 0, 0, 0], [10, 0, 0], [ 0,10, 0],
[ 0,10, 0], [10, 0, 0], [ 0, 0,10],
[ 0, 0, 0], [ 0, 0,10], [10, 0, 0],
[ 0, 0, 0], [ 0,10, 0], [ 0, 0,10]];
polyhedron(points, [[0,1,2], [3,4,5], [6,7,8], [9,10,11], [12,13,14]]);
…beschreibt denselben Tetraeder wie:
points = [[0,0,0], [0,10,0], [10,0,0], [0,0,10]];
polyhedron(points, [[0,2,1], [0,1,3], [1,2,3], [0,3,2]]);
