Experimenten met plotterkunst

De afgelopen weken heb ik geprobeerd meer te leren over generatieve (procedurele) kunst. Ik ben van plan dit bericht voortdurend bij te werken wanneer ik meer zaken heb om op te schrijven en te delen.

Hardware

Ongeveer vijf jaar geleden kocht ik een Ender 3 3D-printer. Deze is capabel, maar frustrerend om te configureren en kieskeurig wat betreft het filament. Tweedehands zijn ze verkrijgbaar voor ongeveer €60. De afgelopen couple jaren heeft de printer stof gevangen, veilig opgeborgen in de originele kartonnen doos.

Ik heb twee kleine neodymiummagneten gelijmd aan een 0,2 mm fineliner-pen. De behuizing van de printkop is van metaal, waardoor de magneten er stevig genoeg aan hechten. De positie van de pen moet ten opzichte van de nozzle worden verschoven, hetzij in de configuratie, hetzij bij het voorbereiden van de gcode.

Software

Ik gebruik Inkscape om gcode te genereren uit vectorpaden (via ExtensiesGccodetoolsPath to Gcode). Dit draait zonder aanpassingen op de printer. Inkscape wordt ook geleverd met enkele op lijnen gebaseerde (graveer)lettertypen, waaronder Hershey-lettertypen (via ExtensiesTextHershey Text). Bij normale lettertypen zou de plotter de contouren van de tekens tekenen, wat niet erg goed werkt.

Inkscape ondersteunt van zichzelf geen scripting, maar er is een extensie genaamd Simple Inkscape Scripting van Scott Pakin, die erg leuk is om te gebruiken. Deze is zeer goed gedocumenteerd; de API voelt vergelijkbaar aan met p5.js, maar is gebaseerd op SVG-paradigma's. Omdat het Python is, kan het worden gebruikt in combinatie met Pillow of NumPy, wat veel mogelijkheden opent.

Omdat de set-up zo soepel verloopt, kan ik meer tijd besteden aan experimenteren en het leren van nieuwe technieken. Zo heb ik veel plezier gehad bij het maken van vloeiende abstracte vormen, waar ik via een artikel over heb geleerd. De auteur van dat artikel gebruikt andere tools, maar het algoritme is vrijwel hetzelfde als in mijn Python-implementatie:

import math
for shape in selected_shapes():
    for i in range(150):
        copy = duplicate(shape)
        copy.rotate(i * math.sin(math.radians(i)), "center")
        copy.scale((i + 1) / 100)
        copy.translate((0, i * 0.2))
        shape.remove()

In Inkscape teken ik een vorm, selecteer ik deze en voer ik het script uit (via ExtensiesRenderSimple Inkscape Scripting). Ik vind het erg interessant dat de input voor het script met de hand getekend kan worden; dat voelt heel natuurlijk en intuïtief.