Zum Inhalt springen

OpenSCAD Benutzerhandbuch/BOOLSCHE Kombinationen

Aus Wikibooks

Boolesche Operationen – Überblick

[Bearbeiten]
2D-Beispiele
[Bearbeiten]
union()       {square(10); circle(10);}       // Quadrat ODER Kreis
difference()  {square(10); circle(10);}       // Quadrat UND NICHT Kreis
difference()  {circle(10); square(10);}       // Kreis UND NICHT Quadrat
intersection(){square(10); circle(10);}       // Quadrat UND Kreis
3D-Beispiele
[Bearbeiten]
union()       {cube(12, center=true); sphere(8);} // Würfel ODER Kugel
difference()  {cube(12, center=true); sphere(8);} // Würfel UND NICHT Kugel
difference()  {sphere(8); cube(12, center=true);} // Kugel UND NICHT Würfel
intersection(){cube(12, center=true); sphere(8);} // Würfel UND Kugel

union

[Bearbeiten]

Erzeugt die Vereinigung aller Kind-Objekte – also die Summe aller Teile (logisches ODER). Funktioniert sowohl mit 2D- als auch mit 3D-Objekten – aber nicht gemischt!

Vereinigung (union)

// Beispiel:
union() {
	cylinder(h = 4, r=1, center = true, $fn=100);
	rotate([90,0,0]) cylinder(h = 4, r=0.9, center = true, $fn=100);
}

Hinweis: "union()" ist oft implizit vorhanden – du musst ihn aber explizit schreiben, wenn du z. B. in einer "difference()" mehrere Objekte zu einem einzigen „Werkstück“ zusammenfassen willst.

Wichtig: Bei allen Vereinigungen – ob explizit oder implizit – dürfen sich äußere Flächen nicht exakt berühren. Liegen zwei Flächen perfekt aufeinander, entsteht ein undefiniertes Verhalten: Das Modell kann dann nicht-mannigfaltig werden (z. B. mit Volumen = 0 oder „verdrehten“ Flächen), was zu Warnungen führt oder dazu, dass Teile im gerenderten Ergebnis verschwinden. In der Vorschau kann es außerdem zu flimmernden Artefakten kommen.

Das liegt nicht an einem Bug, sondern an den Grenzen der Gleitkomma-Arithmetik: Irrationale Zahlen (z. B. aus Drehungen) lassen sich nie exakt darstellen.

Beispiel für ungültigen Code (führt meist zu Warnungen):

// Ungültig!
size = 10;
rotation = 17;
union() {
    rotate([rotation, 0, 0])
        cube(size);
    rotate([rotation, 0, 0])
        translate([0, 0, size])
        cube([2, 3, 4]);
}

Lösung: Verwende immer einen kleinen Überlappungswert – das sogenannte Epsilon ("eps") – um sicherzustellen, dass sich die Objekte wirklich überschneiden:

// Korrekt!
size = 10;
rotation = 17;
eps = 0.01;
union() {
    rotate([rotation, 0, 0])
        cube(size);
    rotate([rotation, 0, 0])
        translate([0, 0, size - eps])
        cube([2, 3, 4 + eps]);
}

Beachte: Das "eps" wird an zwei Stellen verwendet, damit das Endergebnis dem ursprünglichen Design entspricht.

difference

[Bearbeiten]

Subtrahiert das zweite und alle weiteren Kind-Objekte vom ersten (logisches UND NICHT). Auch hier: Nur 2D oder 3D – niemals mischen!

Differenz (difference)

// Beispiel:
difference() {
	cylinder(h = 4, r=1, center = true, $fn=100);
	rotate([90,0,0]) cylinder(h = 4, r=0.9, center = true, $fn=100);
}

Wichtig: Das zu entfernende Objekt muss vollständig über die zu schneidende Fläche hinausragen – sonst entstehen dieselben Probleme wie bei "union": Flickern in der Vorschau, Warnungen oder fehlende Geometrie im Endmodell. Die Lösung ist wieder das Epsilon – siehe Beispiel oben.

difference mit mehreren Kind-Objekten
[Bearbeiten]

Beachte beim zweiten Beispiel: Hier wird zuerst eine "union()" aus dem ersten und zweiten Objekt gebildet – erst danach erfolgt die Subtraktion.

// Beispiel: Mehrere Objekte subtrahieren
$fn=90;
difference(){
                                            cylinder(r=5,h=20,center=true);
    rotate([00,140,-45]) color("LightBlue") cylinder(r=2,h=25,center=true);
    rotate([00,40,-50])                     cylinder(r=2,h=30,center=true);
    translate([0,0,-10])rotate([00,40,-50]) cylinder(r=1.4,h=30,center=true);
}
   
// Zweites Beispiel: Erst vereinigen, dann subtrahieren
translate([10,10,0]){
    difference(){
      union(){        // 1. und 2. Objekt zusammenfassen
                                                cylinder(r=5,h=20,center=true);
        rotate([00,140,-45]) color("LightBlue") cylinder(r=2,h=25,center=true);
      }
      rotate([00,40,-50])                       cylinder(r=2,h=30,center=true);
      translate([0,0,-10])rotate([00,40,-50])   cylinder(r=1.4,h=30,center=true);
    }
}

intersection

[Bearbeiten]

Behält nur den gemeinsamen Überlappungsbereich aller Kind-Objekte (logisches UND). Nur der Teil bleibt erhalten, der von allen Objekten geteilt wird. Wieder gilt: Entweder 2D oder 3D – keine Mischung!

Schnittmenge (intersection)

// Beispiel:
intersection() {
	cylinder(h = 4, r=1, center = true, $fn=100);
	rotate([90,0,0]) cylinder(h = 4, r=0.9, center = true, $fn=100);
}

render

[Bearbeiten]

Achtung: Der "render()"-Befehl berechnet immer das vollständige CSG-Modell – auch in der schnellen Vorschau (F5)! Das kann die Vorschau extrem verlangsamen oder OpenSCAD zum „Einfrieren“ bringen.

// Beispiel:
render(convexity = 1) { ... }
convexity Ganzzahl. Gibt an, wie oft ein Strahl das Objekt maximal durchdringen kann. Dieser Parameter ist nur für die korrekte Darstellung im OpenCSG-Vorschaumodus relevant und hat keine Auswirkung auf das finale Rendering.

Das Bild zeigt eine 2D-Form mit "convexity = 4": Der rote Strahl durchquert die Form maximal viermal (außen→innen→außen→innen→außen). Bei 3D-Objekten funktioniert das analog. In den meisten Fällen reicht ein Wert von 10 völlig aus.