Zum Inhalt springen

OpenSCAD Benutzerhandbuch/3D-Objekte

Aus Wikibooks

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

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);

Beispiel für Kugeln unterschiedlicher Größe.

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);

Äquivalente Schreibweisen:

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);

Äquivalente Schreibweisen:

cylinder(h=15, r1=10, r2=0, center=true);
cylinder(  15,    10,    0,        true);
cylinder(h=15, d1=20, d2=0, 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.
triangles Vorlage:OpenSCAD User Manual/Deprecated
Liste von Dreiecksflächen. Jede Fläche enthält drei Indizes aus "points".
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.
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.

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])")
Punktnummern für den Würfel
Aufgefalteter Würfel
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:
Pyramide als Polyeder
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:
Dreiecksprisma als Polyeder; aufgefaltet zur Veranschaulichung
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:

Nur zwei Flächen sichtbar
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]
    ]
);
Polyeder mit falsch orientierten Flächen (rosa)

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!

Annotierter Polyeder mit Orientierungsfehlern

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]]);