Objekte gruppieren mit OpenSCAD hull()

Die hull() Funktion ist definitiv meine bevorzugte OpenSCAD-Funktion. Ihre Vielseitigkeit ermöglicht es, sie für verschiedenste Anwendungen zu nutzen, sei es zum Abrunden von Formen, zum Verbinden von Elementen oder sogar zum Modellieren kompletter Objekte.

Ich habe kürzlich ein Regal zum Aufbewahren meiner Filamentrollen entworfen, die Regalhalter sind mit dem 3D-Drucker gedruckt, und möchte nun die einzelnen Schritte und den Nutzen der hull() Funktion, vorstellen.

Zu Beginn werden die Objekte definiert, die den äußeren Umriss der Regalhalter repräsentieren sollen. Zwei dieser Objekte sind Zylinder, während das dritte ein Würfel ist. Die Form dieser Objekte beeinflusst das Ergebnis der durch die hull() Funktion erstellten Hülle. Eckige Objekte erzeugen auch eckige Kanten, während abgerundete Ecken sehr leicht mit Zylindern oder Kugeln geschaffen werden können.

Es ist erwähnenswert, dass die hull() Funktion im Vergleich zu minkowski(), welche ebenfalls zum Verbinden von komplexen Formen verwendet werden kann, bei weitem nicht so rechenintensiv ist und dabei nur einen Bruchteil der Zeit benötigt – was die Arbeitsgeschwindigkeit erheblich verbessert und den Spaß erhöht. (Die Funktion berechnet die Minkowski-Summe von zwei oder mehr 3D-Objekten: Diese Summe eines Paares von geometrischen Objekten A und B wird definiert, indem man jedes Punkt-Paar in A und B addiert und das Ergebnis als neues 3D-Objekt erhält. Dies kann je nach Menge der Punkte eine erhebliche Zeit in Anspruch nehmen.)

$fn=24;

module frame() {
    translate([-1, 0, 0])  cube([15, 15, 15]);
    translate([120, 5, 0]) cylinder(15, 5, 5);
    translate([5, 200, 0]) cylinder(15, 5, 5);
}
frame();
Code-Sprache: OpenSCAD (openscad)

Jetzt kann die hull() Funktion genutzt werden um die konvexe Hülle der drei Objekte zu berechnen. Die konvexe Hülle ist die kleinste konvexe Form, die alle gegebenen Punkte oder Objekte umschließt:

$fn=24;

module frame() {
    hull() {
        translate([-1, 0, 0])  cube([15, 15, 15]);
        translate([120, 5, 0]) cylinder(15, 5, 5);
        translate([5, 200, 0]) cylinder(15, 5, 5);
    }
}
frame();
Code-Sprache: OpenSCAD (openscad)

Das was aussieht wie ein Pizzastück ist die Grundform eines Regalhalters. Auch gut zu sehen sind die beiden abgerundeten und die eine spitze Kante. Ich denke es wird schon offensichtlich wie das Regal später einmal aussehen soll. Die Berechnung war sehr schnell und das Objekt ist über die drei Punkte(Objekte) gut in Größe und Ausrichtung zu ändern, falls gewünscht.

Im nächsten Schritt wird mithilfe von difference() der innere Bereich des Objektes ausgehöhlt indem die Differenz zwischen zwei oder mehr geometrischen Objekten gebildet wird. Das Ergebnis ist ein neues 3D-Objekt, das durch das Entfernen der Volumen des zweiten und darauf folgenden Objekts aus dem ersten Objekt entsteht.

Der Regalhalter wird zwei mal erzeugt, das zweite mal allerdings um den Faktor 0.8 auf der X und Y Achse skaliert, also verkleinert. Danach wird die Differenz dieser beiden Objekte gebildet:

$fn=24;

module frame() {
    hull() {
        translate([-1, 0, 0])  cube([15, 15, 15]);
        translate([120, 5, 0]) cylinder(15, 5, 5);
        translate([5, 200, 0]) cylinder(15, 5, 5);
    }
}

difference() {
    frame();
    translate([10, 10, 0]) {
        scale([0.8, 0.8, 1]) { 
            frame();
        }
    }
}
Code-Sprache: OpenSCAD (openscad)

Der Regalhalter nimmt Form an. Jetzt fehlen noch Löcher für die Schrauben, um den Regalhalter auch an der Wand zu halten. Dazu wird wieder die Differenz mit einem Zylinder gebildet. Hier sind es zwei Zylinder um einen Senkung für den Schraubenkopf zu erstellen (Siehe Detailbild).

$fn=24;

module frame() {
    hull() {
        translate([-1, 0, 0])  cube([15, 15, 15]);
        translate([120, 5, 0]) cylinder(15, 5, 5);
        translate([5, 200, 0]) cylinder(15, 5, 5);
    }
}

module screw(x, y, z) {
    translate([x, y, z]) {
        rotate([90, 0, 0]) {
            cylinder(20, 2.1, 2.1); // screw
            cylinder(2, 4, 2.1); // sink
        }
    }   
}

difference() {
    frame();
    translate([10, 10, 0]) {
        scale([0.8, 0.8, 1]) { 
            frame();
        }
    }
    
    screw(25, 10, 7.5);
    screw(80, 10, 7.5);
}
Code-Sprache: OpenSCAD (openscad)

Nun fehlt noch der letzte Schritt: Eine Vertiefung für die Holzstange auf der später einmal die Filamentrollen liegen sollen. Dies ist ganz ähnlich zu den Schraubenlöchern mit difference() und einem Zylinder möglich.

$fn=24;

module frame() {
    hull() {
        translate([-1, 0, 0])  cube([15, 15, 15]);
        translate([120, 5, 0]) cylinder(15, 5, 5);
        translate([5, 200, 0]) cylinder(15, 5, 5);
    }
}

module screw(x, y, z) {
    translate([x, y, z]) {
        rotate([90, 0, 0]) {
            cylinder(20, 2.1, 2.1); // screw
            cylinder(2, 4, 2.1); // sink
        }
    }   
}

difference() {
    frame();
    translate([10, 10, 0]) {
        scale([0.8, 0.8, 1]) { 
            frame();
        }
    }
    
    screw(25, 10, 7.5);
    screw(80, 10, 7.5);

    translate([-2, 175, -1]) {
        rotate([0, 0, 90]) {
            cylinder(20, 10, 10);
        }
    }
}
Code-Sprache: OpenSCAD (openscad)

Somit reichen wenige Zeilen in OpenSCAD aus um so ein nützliches Objekt zu modellieren.

Und so sieht das fertige Ergebnis dann aus:


Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Cookie Consent mit Real Cookie Banner