Die OpenSCAD Bibliothek pointsandfaces

von Philipp Klostermann

Einführung

Die meisten Module, die einfache Objekte erstellen, wie cylinder() oder cube(), erstellen sie nur, und jegliche weitere Veränderung kann nur durch einfache Operationen wie das Abschneiden von Teilen mittels intersection() oder difference() bewerkstelligt werden. Es gibt zum Beispiel keine Möglichkeit, einem Würfel zu sagen, dass er eine schmalere Oberseite haben soll, oder einem Zylinder, sich um 90° zu biegen.

Ich dachte, es wäre nett, mehr Einfluss auf die Form von zu entwerfenden Objekten zu haben, und ich fand in dem OpenSCAD Modul polyhedron() einen Weg, dies zu erreichen. Wenn Du polyhedron() nicht kennst, schaue jetzt nach.

Das Modul polyhedron ist das mächtigste in OpenSCAD und daher auch das schwierigste in der Benutzung.

Die meisten Designs oder Module, die polyhedron() benutzen, tun dies in einer eher statischen Weise. Die Faces, also die Dreiecke und seit OpenSCAD Version 2014.03 auch Polygone, die aus Punkten die Oberfläche eines Objektes definieren, werden manuell hartkodiert, und in vielen Fällen werden aus vielen Instanzen der resultierenden Form komplexere Objekte per union() zusammengesetzt.

Ohne entsprechende Funktionen, die die Datenmenge, die polyhedron() benötigt, um komplexere Objekte als Pyramieden oder Kuboide zu erstellen, ist mit polyhedron() ein Chaos absehbar. Während es meistens vergleichbar einfach ist, die Positionen der Punkte zu berechnen, kann es frustrierend sein, die richtigen Indizes für den faces-Parameter zu finden.

So schrieb ich meine eigenen Daten generierende Funktionen für verschiedene Objekte, und fand mich bald meinen eigenen Code kopierend. Die Erfahrung als Programmierer sagt mir, dass sich hier Modularisierung aufdrängt, und ich erstellte sehr einfache atomare Funktionen, um Teile von Objekten zu erstellen, die zu ganzen Feldern von faces zusammengesetzt werden, und ich implementierte die verschiedenen Objekte mittels dieser atomaren Funktionen.

So gibt es atomare Funktionen um eigene Objekttypen zu kreieren und höhere Funktionen, um einfach Objekte von vordefinierten Typen zu erstellen.
Ich habe mich dabei auf die Verwendung von Dreiecken als Faces beschränkt. Dafür habe ich hauptsächlich zwei Gründe: Erstens möchte ich ein paar Probleme, die damit zu tun haben, dass alle Punkte eines Face auf einer Ebene im Raum liegen müssen, vermeiden, und zweitens möchte ich alles leicht zu alten OpenSCAD-Versionen, die zum Beispiel auf Debian-Kisten vorhanden sein könnten, portierbar halten.

Daher bedeutet im Kontext von pointsandfaces das Wort Face einen Vektor aus drei positive Ganzzahlen, die Indizes in einem gegebenen Feld von Punkten sind.
(Im deutschen Text habe ich auf die Übersetzung “Gesicht” verzichtet und belasse es beim englischen Original. Wenn es im Genitiv verwendet wird, verzichte ich auf den Postfix “s” (des/eines Face statt des/eines Faces), um Verwechslungen mit dem Plural zu vermeiden.)
Die Bedeutung des Wortes Punkt hängt vom Kontext ab. Wenn wir über ein Polygon reden, befinden wir uns im 2-dimensionalen Raum und es bezieht sich auf einen Vektor mit zwei reellen Zahlen, einer x- und einer y-Koordinate. Wenn wir über ein Polyhedron reden, sind wir im 3-dimensionalen Raum und das Wort Punkt bezieht sich auf einen Vektor mit drei reellen Zahlen, einer x-, einer y- und einer z-Koordinate.

Das Prinzip bei der Nutzung der höheren Funktionen ist meistens gleich:

  • Man ruft die entsprechende Funktion aus der pointsandfaces Bibliothek auf, und erhält einen Vektor, der ein Feld mit den Punkten, ein Feld mit den Faces, und in einigen Fällen ein drittes Element, einen Wert für den Parameter convexity-Parameter, enthält.
    Man erkennt diese Funktionen an dem Postfix _pnf_v im Namen.

  • Optional kann man eine modifizierte Version der Positionen der Punkte im ersten Elements des Vektors erstellen, um die Form des Objektes zu verändern.

  • Man ruft mit desen Daten als Parameter polyhedron() auf.

    Das erste Beispiel stellt die einfachste höhere Funktion tube_pnf_v() vor.