Factura
A study of the monolithic and minute
— By Mathias Isaksen
A brief history of cuts
Two years ago, in July 2020, I started my journey into generative art and creative coding. Some of my earliest work explored the process of cutting shapes along a line, producing two or more smaller shapes. While this is a very simple (and unoriginal) idea, I was deeply fascinated by the complex and intricate behaviour it produced, and the number of ways it could be expanded upon. This is demonstrated in "Tunneling Into the Structure Until It Falls", a 2020 piece that features circles recursively cut into smaller shapes. It starts with a large, plain circle, and ends with a small circle cut so many times that the lines blend into a solid fill. Despite utilising only straight lines and flat fill, this process produces an unexpected illusion of depth.
Eventually, I placed shape cutting on the shelf and moved on to new ideas. A year or so later, in October 2021, I decided to take a sabbatical from work. Around the same time, I started experimenting with 3D rendering, initially exploring three.js and Blender. While these tools are fantastic, they offered many features that I simply didn't need, and I arrived at a naive assumption: "What I want to accomplish essentially boils down to drawing a bunch of lines and shapes onto a canvas, that can't be too hard?" With unlimited free time on my hands, I was primed to discover how wrong this would turn out to be.
What followed was a lengthy and challenging process that would culminate in "Factura". To begin with, I focused strictly on the technical aspects, like figuring out how an isometric projection works and trying out 50 different ways of computing the face rendering order. Once the foundation was solid, I started experimenting with abstract three-dimensional structures. An early iteration of this exploration is represented in "The Refinement of my Decline" from late 2021. It features a variety of tiling methods, like Voronoi diagrams, honeycomb patterns, and isometric grids. Included are also two tilings based on shape cutting.
Balancing opposites
The development of "Factura" can be described as a an act of balancing pairs of opposing qualities: Monolithic and minute. Structure and disorder. Intricate and plain. Subtle and explicit. This is a difficult task, with many interconnected parts that interact in unpredictable ways. A few of these are so essential that they deserve a closer examination:
Subdivision methods: To construct the blocks that make up the structure, we first generate their base tiles. This is done by dividing the entire extent into regions, which again are divided into smaller tiles. The subdivision methods and their parameters are selected in a way that ensures variation across the canvas.
Surface shape:The general shape of the structure is determined by a surface function. More precisely, when a block is constructed, its height is determined by sampling the value of a 2D function in the center of its base tile. In areas with a high density of tiles, the structure will follow the shape of the surface closely. Large blocks, on the other hand, cause erratic protrusions.
Block type: The shape of a block is determined by three pieces of information: its base tile, its height, and its type. The last determines whether the block looks like a pyramid, a piston, a Moka pot, or a plain old box.
Colour: The palettes have, through endless iterations, been refined to express a wide range of moods while maintaining a sense of cohesion. The colours are applied to the structures using one of several rules, ranging from entirely random to highly organised.
Texture: The last component added to a block. These are decorative elements, like embellishments seen on the exteriors of buildings.
Process
Divide base shape into regions
The subdivision method and its parameters (e.g. density and rotation) are randomly selected
Determine processing order
The regions must be processed in a certain order for the final render to turn out correct, roughly from top to bottom
Divide each region into tiles, construct 3D blocks and render with colour
By processing one region at the time, the output can be rendered while being generated. The height of the blocks is determined by a random surface function