OpenSCAD: Qualität & Fehlersuche

Akademie

OpenSCAD: Qualität & Fehlersuche

Auflösung, Modifier-Zeichen, Z-Fighting und saubere Geometrie.

Auflösung steuern: $fn, $fa, $fs

Begriffe vorab

  • $fn: Feste Segmentzahl für Kreise und Kugeln (überschreibt $fa und $fs).
  • $fa: Mindestwinkel pro Segment in Grad.
  • $fs: Mindestlänge eines Segments.
  • Fragment: Gerades Teilstück der Kreisannäherung.
  • Facette: Kleine ebene Fläche an gekrümmten Körpern.

Kreise sind Vielecke

OpenSCAD zeichnet keine echten Kreise, sondern Vielecke. Wie fein, steuern drei Spezialvariablen mit den Standardwerten $fa = 12 (Grad), $fs = 2 (Einheiten) und $fn = 0. Ist $fn größer als 0, überschreibt es die anderen beiden.

Die Formel

Die Doku gibt die Berechnung als Code an:

int get_line_segments_from_r(double r, double fn, double fs, double fa)
{
  if (r < GRID_FINE) return 3;
  if (fn > 0.0) return (int)(fn >= 3 ? fn : 3);
  return (int)ceil(fmax(fmin(360.0 / fa, r*2*M_PI / fs), 5));
}

Das heißt: Mit $fn gilt exakt dieser Wert (mindestens 3). Ohne $fn nimmt OpenSCAD den kleineren der beiden Werte 360/$fa und Umfang/$fs, mindestens aber 5 Segmente. Beim Standard ergeben sich also höchstens 30 Segmente (360/12).

Empfehlungen der Doku

  • Werte über 128 werden nicht empfohlen.
  • Werte unter 50 sind für die Leistung ratsam.
  • Vielfache von 4 liefern Begrenzungsboxen mit ganzzahligen Achsenmaßen.

Warum Löcher zu klein werden

Das Vieleck liegt innerhalb des idealen Kreises. Ein Loch mit r = 5 hat deshalb an den Seitenmitten einen etwas kleineren Durchmesser. Bei Passungen (Schrauben, Lager) rechnest du das ein: größerer Radius, höheres $fn oder ein Vieleck, das umschließt.

// Gleicher Radius, verschiedene Auflösung
translate([0, 0, 0])  cylinder(h = 5, r = 10);                  // Standard ($fa=12, $fs=2)
translate([30, 0, 0]) cylinder(h = 5, r = 10, $fn = 8);
translate([60, 0, 0]) cylinder(h = 5, r = 10, $fn = 96);

// Globale Voreinstellung für alles danach
$fn = 48;
translate([90, 0, 0]) sphere(r = 10);

// Loch mit Aufmaß: die Seitenmitten werden sonst zu eng
function aufmass(r, n) = r / cos(180 / n);
echo(aufmass(5, 32));     // ~5.0242

Mit $fn = 8 erkennt man das Achteck deutlich. Die Aufmaßfunktion rechnet vom Radius der Seitenmitten auf den Eckradius um: r / cos(180/n).

Setze $fn nicht pauschal hoch: Für die Vorschau reichen kleine Werte, für den Export erhöhst du gezielt (z. B. in einer Variable).

Zum Selbermachen

  1. Vergleiche in der Console die Dauer eines Renders mit $fn = 32 und $fn = 128 für eine Kugel.
  2. Miss den Durchmesser eines Lochs mit $fn = 8 in der Vorschau und vergleiche ihn mit dem Sollwert.

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): Standardwerte (12, 2, 0), die Fragment-Formel (inkl. Mindestwert 5), die Empfehlungen (über 128 nicht empfohlen, unter 50 ratsam, Vielfache von 4) und die Warnung zu zu kleinen Löchern wurden gegen die Seiten „Other Language Features“ und „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 Aufmaßformel r / cos(180/n) (eigene geometrische Herleitung, nicht aus der Doku) und der Wert 5,0242. Außerdem nicht einzeln belegt: die Erklärungen in eigenen Worten, die Beispiele als solche (konstruiert) und die Wertungen.

Quellen

  • OpenSCAD User Manual – Other Language Features (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Other_Language_Features)
  • 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)

Fehlersuche: Modifier-Zeichen, Z-Fighting und saubere Geometrie

Begriffe vorab

  • Modifier-Zeichen: Zeichen vor einem Objekt, das seine Behandlung ändert: * ! # %.
  • Z-Fighting: Flackern, wenn zwei Flächen exakt aufeinanderliegen.
  • Non-manifold: Geometrie mit Löchern oder Kanten, an denen nicht genau zwei Flächen zusammentreffen.
  • Konvexität: Hinweis für die Vorschau, wie komplex ein Objekt ist.
  • echo: Ausgabe von Werten in die Console zur Fehlersuche.

Die vier Modifier-Zeichen

Vor jedes Objekt oder jeden Teilbaum kannst du ein Zeichen setzen:

Zeichen Name Wirkung
* Disable Teilbaum wird ganz ignoriert – wie auskommentiert, ohne Klammern zählen zu müssen.
! Root Nur dieser Teilbaum wird gezeigt; alles andere wird ignoriert. Transformationen außerhalb des Teilbaums gelten nicht.
# Debug Teilbaum wird normal verwendet und zusätzlich unverändert in transparentem Rosa gezeigt. Nur in der Vorschau, nicht im Export.
% Background Teilbaum erscheint transparent grau, wird aber nicht in CSG-Operationen verwendet. Nur in der Vorschau, nicht im Export.

Die Doku warnt: Steht % am ersten Objekt von difference(), wird es ignoriert – das hat oft unerwartete Folgen.

difference() {
    cube([30, 30, 10]);
    #translate([15, 15, -1]) cylinder(h = 12, r = 6, $fn = 48);  // zeigt, WAS abgezogen wird
}
%translate([40, 0, 0]) cube(10);                                  // nur als Hintergrund-Maß
translate([60, 0, 0]) *sphere(r = 8);                             // deaktiviert

Z-Fighting und deckungsgleiche Flächen

Das FAQ rät: Bei Flächen, die abgezogen werden, immer eine klare Überlappung vorsehen – mit einem kleinen Epsilon wie cube_size + 0.01. Sonst flackern Flächen in der Vorschau.

Löcher, die nicht stimmen

Erscheint ein Loch falsch, erhöhe convexity (meist genügt 10), das gibt die maximale Zahl der Vorder- (oder Rück-)seiten an, die ein Strahl durchdringt.

Nicht-manifold

Importierte STL-Dateien, die sich nicht mit F6 rendern lassen, haben meist fehlerhafte Geometrie. Das FAQ empfiehlt MeshLab oder Blender zur Reparatur: Das Modell muss manifold sein. Achte auf Nullflächen (kollineare Dreieckspunkte).

Ausgabe zur Fehlersuche

echo() gibt Werte in der Console aus, assert() bricht bei verletzten Annahmen ab. Ein bewährtes Muster aus „Tips and Tricks“ ist ein echo-Wrapper, der den Wert ausgibt und zurückliefert.

Ein # vor dem abziehenden Körper zeigt dir sofort, wo er wirklich sitzt – das spart viele Rechnungen.

Zum Selbermachen

  1. Setze # vor alle abziehenden Körper deines letzten Projekts und prüfe, ob sie überall herausragen.
  2. Provoziere Z-Fighting mit zwei bündigen Würfeln und löse es mit 0,01 Überlappung.

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): Wirkung der vier Modifier (inkl. Vorschau-/Render-Verhalten und der %-Warnung) sowie die FAQ-Antworten zu Z-Fighting, convexity und nicht-manifolden STL wurden gegen die Seiten „Modifier Characters“ 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 – Modifier Characters (en.wikibooks.org/wiki/OpenSCAD_User_Manual/Modifier_Characters)
  • OpenSCAD User Manual – FAQ (en.wikibooks.org/wiki/OpenSCAD_User_Manual/FAQ)
  • 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)