OpenSCAD-Render eines Puppenhaus-Schornsteins mit ausgeschnittener Dachschräge

Schornstein fürs Puppenhaus

Ein Schornstein mit parametrierbarer Dachneigung — inklusive etwas Trigonometrie und einem ersten Ausflug in die polyhedron()-Funktion und den OpenSCAD-Customizer.

Beitrag komplett (.zip)

„Beitrag komplett“ liefert den OpenSCAD-Quelltext als fertige .scad-Dateien plus eine druckbare Kopie — ein Vorteil für CARECOM.united-Mitglieder. Die Mitgliedschaft ist kostenlos und unverbindlich. Zur Mitgliedschaft →

OpenSCAD-Render des Puppenhaus-Schornsteins

Diesen Schornstein braucht so kaum jemand — aber er zeigt zwei OpenSCAD-Werkzeuge, die für eigene Projekte richtig nützlich sind.

Der Customizer: Parameter ohne Code-Änderung

Der OpenSCAD-Customizer erlaubt das Anpassen von Parametern bzw. Variablenwerten ohne Änderung der Programm-Datei. Als Beschreibung der Parameter werden die Kommentare aus dem Programm übernommen — aus // inclination of roof (in degrees) über der Variablen wird ein beschriftetes Eingabefeld, und a=40; // [0:89] macht daraus einen Schieberegler von 0 bis 89. So kann auch jemand ohne OpenSCAD-Kenntnisse das Teil anpassen; mit /* [Hidden] */ blendet man Hilfsvariablen aus dem Customizer aus.

polyhedron() und etwas Mathematik

Um die Dachneigung in Grad vorzugeben, war tatsächlich etwas Mathematik nötig (siehe die hroof-Berechnung — aus dem Winkel a wird die passende Firsthöhe). Der schräge Dachausschnitt selbst entsteht mit polyhedron(): Man gibt eine Liste von Eckpunkten (points) und die sie verbindenden Flächen (faces) an. Damit lassen sich Formen bauen, die sich nicht aus Quadern und Zylindern zusammensetzen lassen — hier der Giebel, mit dem der Schornstein passgenau auf dem Dach sitzt.

// height chimney (mm)
h=70;

// width chimney (mm)
b=80;

// depth chimney (mm)
t=60;

// thickness chimney wall (mm)
d=5;

// inclination of roof (in degrees)
a=40; // [0:89]

/* [Hidden] */
// sin a = h / c
// c = sqrt((b/2)^2+h^2)
// solve h=sin(a)*sqrt(b^2/4+h^2) for h
hroof = b * sin(a)/(2 *sqrt(1 - sin(a)*sin(a)));

difference() {
    // chimney
    cube([b, t, h]);

    union() {
        // inner cube to remove
        translate([d, d, 0])
        cube([b-2*d, t-2*d, h]);

        roof(b, t, hroof);
    }
}

module roof(b, t, h){
   polyhedron(
       points=[[0,0,0], [0,t,0], [b,t,0], [b,0,0], [b/2,0,h], [b/2,t,h]],
       faces=[[0,1,2,3],[5,4,3,2],[0,4,5,1],[1,5,2],[0,3,4]]
   );
}
Es ist ein Fehler aufgetreten. Neu laden 🗙

Verbindung wird wiederhergestellt …

Wieder­verbindung fehl­geschlagen – nächster Versuch in Sekunden.

Wieder­verbindung fehl­geschlagen.
Bitte erneut versuchen oder die Seite neu laden.

Die Sitzung wurde vom Server pausiert.

Sitzung konnte nicht fort­gesetzt werden.
Bitte erneut versuchen oder die Seite neu laden.