Steuere die Rundungsqualität in OpenSCAD mit $fn, $fa und $fs. Vergleiche Vorschau und Rendering und optimiere einen parametrischen Drehknopf.
Voraussetzungen
Du brauchst OpenSCAD und die Grundlagen aus Teil 16. Die Beispiele verwenden die klassische OpenSCAD-Syntax; eine Ausführung mit einer konkreten Softwareversion wurde hier nicht geprüft. Wir behandeln eine Modelleinheit als einen Millimeter.
Kapitel 4 – Von 2D zu 3D
Runde Geometrien wie Kreise, Zylinder oder Kugeln sehen auf dem Bildschirm zwar rund aus, bestehen intern aber aus vielen geraden Segmenten.
Wie fein diese Segmente sind, beeinflusst sowohl:
-
die sichtbare Qualität
-
die Renderzeit
-
die Komplexität des Modells
-
die Größe exportierter Mesh-Dateien
OpenSCAD stellt dafür insbesondere drei spezielle Variablen bereit:
$fn
$fa
$fs
Lernziel:
Nach dieser Lektion kannst du die Auflösung runder Geometrien kontrollieren und zwischen Vorschauqualität und finaler Modellqualität unterscheiden.
Warum sind Rundungen polygonal?
Ein Kreis wird intern nicht als mathematisch unendlich glatte Kontur dargestellt.
Stattdessen wird er durch viele kurze Geraden angenähert.
Ein Zylinder mit:
$fn=8
besitzt daher nur acht Seiten.
Beispiel:
cylinder(
h=20,
d=30,
$fn=8
);
Qualität mit $fn beeinflussen
Erhöhen wir den Wert:
cylinder(
h=20,
d=30,
$fn=32
);
wird der Körper deutlich runder.
Mit:
cylinder(
h=20,
d=30,
$fn=96
);
ist die Rundung sehr fein.
Was bedeutet $fn?
$fn definiert die Anzahl der Fragmente einer Rundung.
Vereinfacht:
$fn |
Wirkung |
|---|---|
| 8 | sehr grob |
| 16 | grob |
| 32 | mittel |
| 64 | fein |
| 96+ | sehr fein |
Die tatsächlich sinnvolle Zahl hängt immer von Größe und Einsatzzweck des Modells ab.
$fn global setzen
Statt $fn an jedem Körper anzugeben, kann ein globaler Wert definiert werden:
$fn = 64;
cylinder(
h=20,
d=30
);
sphere(
d=30
);
Damit verwenden beide Geometrien denselben Wert.
Lokale Werte überschreiben
Ein einzelner Körper kann trotzdem einen anderen Wert verwenden:
$fn = 32;
cylinder(
h=20,
d=30
);
translate([
50,
0,
0
])
cylinder(
h=20,
d=30,
$fn=96
);
Warum ein fixer $fn-Wert nicht immer ideal ist
Ein sehr kleiner Kreis benötigt normalerweise weniger Segmente als ein großer Kreis.
Werden beide mit:
$fn=64
erzeugt, kann der kleine unnötig komplex und der große möglicherweise noch sichtbar kantig sein.
Für solche Situationen stehen:
$fa
$fs
zur Verfügung.
$fa – Winkelauflösung
$fa definiert den Mindestwinkel für die automatische Segmentberechnung.
Beispiel:
$fa = 30;
circle(
d=40
);
erzeugt eine relativ grobe Kontur.
Mit:
$fa = 5;
circle(
d=40
);
wird die Kontur feiner.
Ein kleinerer $fa-Wert führt im Allgemeinen zu mehr Segmenten.
$fs – Segmentgröße
$fs beeinflusst die Mindestgröße der Segmente für die automatische Auflösung.
Beispiel:
$fs = 2;
Bei größeren Rundungen werden dadurch automatisch mehr Segmente verwendet als bei kleinen.
Das macht $fs besonders interessant für Modelle mit sehr unterschiedlich großen Kreisen und Radien.
Zusammenspiel von $fa und $fs
Wenn $fn nicht ausdrücklich vorgegeben ist, kann OpenSCAD die Anzahl der Segmente aus $fa und $fs bestimmen.
Damit passt sich die Auflösung stärker an die jeweilige Geometrie an.
Für parametrische Modelle kann das sinnvoller sein als ein starrer $fn-Wert.
Höhere Qualität bedeutet mehr Geometrie
Eine feinere Rundung erzeugt mehr Polygone.
Das kann bedeuten:
-
längere Vorschauzeit
-
längere Renderzeit
-
größere STL-Dateien
-
mehr Speicherbedarf
-
langsamere boolesche Operationen
Besonders bei:
-
vielen Bohrungen
-
Kugeln
-
komplexen Rotationskörpern
-
großen Schleifen
kann sich das deutlich bemerkbar machen.
Mehr Polygone bedeuten nicht automatisch besseren 3D-Druck
Die tatsächliche Druckqualität hängt auch vom Druckverfahren ab.
Beim FDM-Druck beispielsweise von:
-
Düsendurchmesser
-
Layerhöhe
-
Druckgeschwindigkeit
-
Maschinenmechanik
-
Slicer-Einstellungen
Eine extrem hoch aufgelöste STL-Datei kann daher deutlich komplexer sein, ohne dass der Ausdruck sichtbar besser wird.
Sinnvolle Qualität wählen
Ein universeller Wert existiert nicht.
Für viele kleine bis mittelgroße technische Bauteile kann beispielsweise:
$fn=48
oder:
$fn=64
bereits gut funktionieren.
Bei größeren sichtbaren Rundungen können höhere Werte sinnvoll sein.
Bei internen oder kaum sichtbaren Geometrien häufig niedrigere.
Qualität parametrisch machen
Eine einfache Strategie:
qualitaet = 64;
Danach:
cylinder(
h=20,
d=30,
$fn=qualitaet
);
Damit wird die Auflösung zentral steuerbar.
Vorschau und Rendering unterscheiden
Während der Konstruktion benötigt man häufig keine extrem hohe Qualität.
OpenSCAD stellt dafür:
$preview
zur Verfügung.
Damit kann beispielsweise geschrieben werden:
qualitaet =
$preview
? 24
: 96;
Das bedeutet:
Vorschau → 24 Segmente
Finales Rendering → 96 Segmente
Praxisprojekt: Drehknopf optimieren
Wir verwenden den Drehknopf aus Teil 15.
Qualitätsparameter
qualitaet_vorschau = 24;
qualitaet_final = 96;
qualitaet =
$preview
? qualitaet_vorschau
: qualitaet_final;
Geometrie
radius_unten = 15;
radius_oben = 13;
hoehe = 12;
achsen_d = 6;
ueberstand = 1;
profil = [
[0, 0],
[radius_unten, 0],
[radius_oben, hoehe],
[0, hoehe]
];
difference() {
rotate_extrude(
$fn=qualitaet
)
polygon(profil);
translate([
0,
0,
-ueberstand
])
cylinder(
h=hoehe + 2 * ueberstand,
d=achsen_d,
$fn=qualitaet
);
}
Globale Alternative mit $fa und $fs
Statt $fn fest vorzugeben, kann beispielsweise mit:
$fa = 5;
$fs = 1;
gearbeitet werden.
Dadurch kann OpenSCAD die benötigte Segmentzahl abhängig von der jeweiligen Geometrie bestimmen.
Welche Variante besser ist, hängt vom Modell und vom gewünschten Workflow ab.
Mitmach-Aufgabe
Erstelle einen Zylinder mit:
| Parameter | Wert |
|---|---|
| Durchmesser | 50 mm |
| Höhe | 20 mm |
| Vorschauqualität | 16 |
| finale Qualität | 96 |
Verwende:
$preview
um automatisch zwischen beiden Qualitätsstufen umzuschalten.
Musterlösung
durchmesser = 50;
hoehe = 20;
qualitaet =
$preview
? 16
: 96;
cylinder(
h=hoehe,
d=durchmesser,
$fn=qualitaet
);
Was haben wir gelernt?
Die wichtigsten Qualitätsparameter für Rundungen sind:
$fn
$fa
$fs
Dabei gilt:
-
$fndefiniert direkt die Segmentanzahl -
$fabegrenzt den Winkel eines Segments -
$fsbeeinflusst die Segmentgröße -
hohe Werte beziehungsweise feine Einstellungen erhöhen die Modellkomplexität
-
eine hohe Polygonzahl bedeutet nicht automatisch bessere Druckqualität
-
mit
$previewkönnen unterschiedliche Einstellungen für Konstruktion und finales Rendering verwendet werden
Damit können wir Qualität und Performance unserer OpenSCAD-Modelle deutlich bewusster steuern.
Im nächsten Teil
Im nächsten Teil geht es um die Organisation größerer OpenSCAD-Projekte.
Wir lernen:
include
use
Damit können wir:
-
Funktionen auslagern
-
Module in eigene Dateien verschieben
-
wiederverwendbare Bibliotheken aufbauen
-
den Hauptcode deutlich übersichtlicher gestalten
Das ist ein wichtiger Schritt vom einzelnen OpenSCAD-Modell hin zu größeren, strukturierten Projekten.
Wie arbeiten $fa und $fs zusammen?
Bei $fn=0 verwendet OpenSCAD für einen Kreis näherungsweise ceil(max(min(360/$fa, 2*PI*r/$fs), 5)) Segmente. Die kleinere der beiden Auflösungen begrenzt also die Segmentzahl; mindestens fünf Segmente bleiben erhalten. Eine positive Vorgabe für $fn hat Vorrang. Deshalb reicht es nicht immer, nur einen der beiden Werte zu verkleinern.
Weiterlernen
- Teil 16: vorherige Lektion
- Teil 18: Projekte strukturieren mit include und use
- OpenSCAD-Kurs und Cheatsheets
- Schleifen, Bedingungen und Module
Referenz
Die OpenSCAD-Sprachreferenz verlinkt die Dokumentation der verwendeten Befehle.
