Zum Inhalt springen

OpenSCAD Benutzerhandbuch/2D zu 3D

Aus Wikibooks

Extrusion ist der Prozess, bei dem ein Objekt mit einem festen Querschnitt erzeugt wird. OpenSCAD bietet zwei Befehle, um aus einer 2D-Form ein 3D-Volumen zu erstellen: "linear_extrude()" und "rotate_extrude()".

Die lineare Extrusion ähnelt dem Durchpressen von Knetmasse (Play-Doh) durch eine Form – das Ergebnis hat überall denselben Querschnitt.

"linear_extrude()" funktioniert wie eine Play-Doh-Extrusionspresse

Die rotationssymmetrische Extrusion hingegen entspricht dem Drechseln oder „Töpfern“ auf einer Töpferscheibe.

"rotate_extrude()" ahmt das Formen eines Gefäßes nach

Beide Extrusionsmethoden arbeiten mit einer (auch nicht zusammenhängenden) 2D-Form, die sich in der X-Y-Ebene befindet. Obwohl Transformationen 2D-Formen auch außerhalb dieser Ebene platzieren können, wird beim Extrudieren jede Z-Koordinate ignoriert – es erfolgt also implizit eine Projektion auf die X-Y-Ebene. Daher solltest du Extrusionen stets nur auf Formen anwenden, die strikt in der X-Y-Ebene liegen.

linear_extrude

[Bearbeiten]

Die lineare Extrusion nimmt eine 2D-Form als Eingabe und erzeugt daraus ein 3D-Objekt.

Die Extrusion erfolgt standardmäßig entlang des Z-Vektors. Ab Version > 2021.01 kannst du mit dem Parameter "v" eine benutzerdefinierte Richtung angeben.

Wichtig: Die Extrusion basiert immer auf dem Schatten (der Projektion) der 2D-Form auf die X-Y-Ebene. Wenn du die Form vor der Extrusion drehst oder verschiebst, wird nur ihr projizierter Umriss extrudiert.

Obwohl die Extrusion gerade verläuft, gibt es zwei zusätzliche Parameter:

  • "twist": dreht die Form während der Extrusion (z. B. für spiralförmige Säulen),
  • "scale": vergrößert oder verkleinert die Form entlang der Extrusionshöhe (z. B. für konische oder trichterförmige Objekte).

Verwendung

[Bearbeiten]
linear_extrude(height = 5, v = [0, 0, 1], center = true, convexity = 10, twist = -fanrot, slices = 20, scale = 1.0, $fn = 16) {...}

Aufgrund von Abwärtskompatibilität müssen alle Parameter namentlich angegeben werden.

height : Extrusionshöhe (muss positiv sein).
center : Bei "true" wird das Objekt um den Ursprung zentriert (Z von "-height/2" bis "+height/2").
twist : Drehung in Grad während der Extrusion (linkshändige Regel).
scale : Skalierungsfaktor am oberen Ende (Skalar oder Vektor "[x,y]").
slices : Anzahl der Zwischenschritte entlang der Höhe (ähnlich wie "$fn", wirkt aber nicht auf die 2D-Form).
segments : Fügt zusätzliche Punkte auf Polygonkanten hinzu – besonders nützlich bei gedrehten Formen. Muss ein Vielfaches der Kantenzahl sein, um Wirkung zu zeigen.
convexity : Hilft bei der korrekten Darstellung komplexer Formen in der Vorschau. Bei transparent wirkenden Stellen probiere z. B. "convexity = 10".

Der Parameter "v" ist ein 3D-Vektor, der in positive Z-Richtung zeigen muss Vorlage:Requires. "$fn" ist optional und steuert die Feinheit der Extrusion (höher = glatter, aber langsamer).

Falls die Extrusion bei komplexen 2D-Formen fehlschlägt, hilft oft das Setzen von "convexity = 10".

Twist (Verdrillung)

[Bearbeiten]

Der "twist"-Parameter gibt an, um wie viele Grad die Form während der Extrusion gedreht wird. "twist = 360" bedeutet eine volle Umdrehung. Die Drehrichtung folgt der Linkshänder-Regel.

twist = 0 0° Verdrehung

linear_extrude(height = 10, center = true, convexity = 10, twist = 0)
translate([2, 0, 0])
circle(r = 1);

twist = -100 –100° Verdrehung

linear_extrude(height = 10, center = true, convexity = 10, twist = -100)
translate([2, 0, 0])
circle(r = 1);

twist = 100 100° Verdrehung

linear_extrude(height = 10, center = true, convexity = 10, twist = 100)
translate([2, 0, 0])
circle(r = 1);

twist = -500 –500° Verdrehung

linear_extrude(height = 10, center = true, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

Zentrierung ("center")

[Bearbeiten]

Wie beim "cylinder":

  • "center = false" → Z reicht von 0 bis "height"
  • "center = true" → Z reicht von "-height/2" bis "+height/2"

center = true center = true

linear_extrude(height = 10, center = true, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

center = false center = false

linear_extrude(height = 10, center = false, convexity = 10, twist = -500)
translate([2, 0, 0])
circle(r = 1);

Netzverfeinerung

[Bearbeiten]

"slices" legt die Anzahl der Zwischenstufen entlang der Z-Achse fest. Der Standardwert steigt mit "twist". Explizites Setzen verbessert oft das Ergebnis.

"segments" fügt zusätzliche Punkte auf den Kanten des Polygons hinzu – besonders bei verdrehten Geometrien sinnvoll. Beispiel: Für "circle($fn=3)" wirken nur Vielfache von 3 (z. B. 6, 9…); für "square()" Vielfache von 4 (8, 12…).

slices = 100

linear_extrude(height = 10, center = false, convexity = 10, twist = 360, slices = 100)
translate([2, 0, 0])
circle(r = 1);

Die Spezialvariablen "$fn", "$fs" und "$fa" beeinflussen ebenfalls die Auflösung. Ohne "slices" wird der Wert von "$fn" übernommen.

$fn = 100

linear_extrude(height = 10, center = false, convexity = 10, twist = 360, $fn = 100)
translate([2, 0, 0])
circle(r = 1);

Skalierung ("scale")

[Bearbeiten]

"scale" kann ein Skalar oder ein 2D-Vektor "[x,y]" sein:

linear_extrude(height = 10, center = true, convexity = 10, scale=3)
translate([2, 0, 0])
circle(r = 1);

Beispiel: skalare Skalierung

linear_extrude(height = 10, center = true, convexity = 10, scale=[1,5], $fn=100)
translate([2, 0, 0])
circle(r = 1);

Beispiel: vektorielle Skalierung

Achtung: Bei vektoriellem "scale" können die Seitenwände nicht eben sein. Um Asymmetrien zu vermeiden (siehe [[1]]), verwende "twist=0" und setze "slices" explizit:

linear_extrude(height=10, scale=[1,0.1], slices=20, twist=0)
polygon(points=[[0,0],[20,10],[20,-10]]);

Verwendung mit importiertem SVG

[Bearbeiten]

Häufig wird "linear_extrude()" genutzt, um 2D-SVG-Dateien in 3D-Modelle zu verwandeln:

linear_extrude(height = 10, center = true)
import("knight.svg");

rotate_extrude

[Bearbeiten]

Die rotationssymmetrische Extrusion dreht eine 2D-Form um die Z-Achse, um ein rotations­symmetrisches Volumen zu erzeugen.

Stell dir eine Töpferscheibe in der X-Y-Ebene vor, deren Achse nach +Z zeigt. Die 2D-Form ist der Querschnitt des zu erstellenden Objekts – aber nur der Teil mit X ≥ 0 (rechte Hälfte). Diese Form wird um die Z-Achse gedreht.

Alternativ: Die Form wird um die Y-Achse gedreht, und das Ergebnis wird so platziert, dass seine Rotationsachse entlang der Z-Achse liegt.

Wie bei "linear_extrude" wird auch hier nur die Projektion auf die X-Y-Ebene berücksichtigt. Transformationen vor der Extrusion beeinflussen diese Projektion:

  • Verschiebung in Z: keine Wirkung
  • Verschiebung in X: vergrößert den Durchmesser
  • Verschiebung in Y: verschiebt das Objekt in Z-Richtung
  • Drehung um X/Y: verzerrt den Querschnitt

Wichtig: Die 2D-Form muss vollständig auf einer Seite der Y-Achse liegen – also entweder alle Punkte mit "x ≥ 0" oder alle mit "x ≤ 0". Berührt die Form die Y-Achse ("x = 0"), muss es eine Linie, nicht nur ein Punkt sein – sonst entsteht ein Objekt mit Dicke 0, was ungültig ist.

Verwendung

[Bearbeiten]
rotate_extrude(angle = 360, start=0, convexity = 2) {...}
Rechte-Hand-Regel

In Versionen bis 2021.01 müssen Parameter namentlich angegeben werden.

angle Vorlage:Requires : Standardwert 360°. Gibt an, wie weit gedreht wird (von der positiven X-Achse aus, im Gegenuhrzeigersinn gemäß Rechte-Hand-Regel). Negative Werte drehen im Uhrzeigersinn.
start Vorlage:Requires : Startwinkel (Standard: 0°, wenn "angle" gesetzt ist; sonst 180°).
convexity : Wie bei "linear_extrude" – bei Darstellungsproblemen "convexity = 10" probieren.

Die Kreisauflösung wird wie üblich über "$fa", "$fs" und "$fn" gesteuert.

Beispiele

[Bearbeiten]

Einfacher Torus:

rotate_extrude(convexity = 10)
    translate([2, 0, 0])
        circle(r = 1);

Netzverfeinerung

[Bearbeiten]

Höhere Fragmentanzahl = bessere Qualität, aber längere Renderzeit:

rotate_extrude(convexity = 10)
    translate([2, 0, 0])
        circle(r = 1, $fn = 100);

Oder erhöhe die Auflösung der Extrusion selbst:

rotate_extrude(convexity = 10, $fn = 100)
    translate([2, 0, 0])
        circle(r = 1, $fn = 100);

Extrusion eines Polygons

[Bearbeiten]

Auch benutzerdefinierte Polygone lassen sich extrudieren:

// Nur zur Ansicht (gedreht):
rotate([90,0,0]) polygon(points=[[0,0],[2,1],[1,2],[1,3],[3,4],[0,5]]);

// Rotationsextrusion:
rotate_extrude($fn=200) polygon(points=[[0,0],[2,1],[1,2],[1,3],[3,4],[0,5]]);

Mehr zu Polygonen findest du unter 2D-Grundformen: Polygon.

Kombinierte Extrusionen

[Bearbeiten]

Mit dem "angle"-Parameter (ab 2019.05) lässt sich z. B. ein Haken modellieren:

eps = 0.01;
translate([eps, 60, 0])
    rotate_extrude(angle=270, convexity=10)
        translate([40, 0]) circle(10);
rotate_extrude(angle=90, convexity=10)
    translate([20, 0]) circle(10);
translate([20, eps, 0])
    rotate([90, 0, 0]) cylinder(r=10, h=80+eps);

Ausrichtung

[Bearbeiten]

Bei vollständiger Rotation ("angle = 360") spielt der Startpunkt normalerweise keine Rolle – außer, du nutzt "$fn", um ein Prisma mit fester Kantenzahl zu erzeugen.

  • Ohne "angle"-Angabe (bzw. in Versionen ≤ 2021.01 mit "angle=360"): Start entlang der negativen X-Achse → bei ungerader Kantenzahl liegt eine Ecke links.
  • Mit expliziter "angle=360" (ab Development Snapshot): Start entlang der positiven X-Achse → konsistent mit anderen runden Grundformen.

In Zukunft könnte sich das Verhalten ändern, sodass der Start immer auf der positiven X-Achse liegt.

Der Parameter "start" (Vorlage:Requires) gibt den Startwinkel direkt an.