← appaday

Four lines of maths and twelve hours of printing

There is a folder of parametric vases on this machine — three dozen live in the generator and about as many again in the retired list — all made the same way: a Python function that gets swept round in horizontal rings by a script Blender runs with no window open. Give it a height t from 0 to 1 and an angle th, and it hands back a radius. That is the entire interface. The one called coral is four lines:

r    = 32 + 10 * sin(pi * t)
side = 0.5 + 0.5 * cos(th - 1.0)
n    = sin(9*th + 11*t) * cos(5*th - 7*t) + 0.5 * sin(17*th - 5*t)
return r + 6 * n * side * t ** 0.5 + 4 * side * t

n is the noise. side is the whole idea: it goes to zero on one flank and to one on the other, so the noise only has amplitude where the water would be coming from. Coral grows into the current. The t ** 0.5 keeps the base calm and lets the ridges build as they climb. Nothing else about it was designed — the torn crown rim is just what the noise does when it runs out of vase.

A sky-blue 3D-printed vase seen from above on an oak table, deep vertical ridges down one flank and a jagged sawtooth rim
The actual object, on a phone, in the actual flat. One flank ripples, the other is calm.

The mesh has to survive being real

Two things about generated geometry that took a while to learn, both of which are now separate scripts that run on every new model:

Blender's own watertightness check is not enough. The STL is float32, and rounding opens sliver gaps Blender happily reports as closed. So there is a second check in trimesh that has to agree. That check exists because of a bug that shipped unnoticed for fifteen rounds: the clamp keeping the inner wall from poking through the outer surface was also being applied to ring zero, which quietly collapsed the floor to zero thickness. A vase with no bottom looks perfect on screen.

And it has to stand up. Another script computes the centre of mass of the plastic plus water filled to 85 % and compares it against the footprint. Under 4 mm of margin and the shape does not ship, however good it looks.

Then there is resolution. The default grid is 240 × 160, whose facet edges land about 1.9 mm apart at print scale. The geometric error is only ~0.03 mm — invisible — but the edges all line up with each other, so they read as deliberate lines down the print. Anything actually going on the bed gets regenerated at 720 × 400 instead, which is why this one's STL is 57 MB. It slices to 12 h 34 m and 243.5 g of PLA at 225 mm tall, 0.2 mm layers, 2.6 mm walls.

Signed on the base, because that is where the printer is good

Personalisation was going to be a name on the wall. The mock-ups looked lovely and the printer would have made a mess of them: every letter on a vertical wall is an overhang on its underside, staircased by the layer height. So the text moved to the base — the first layer, laid flat against the bed. It is the crispest text an FDM printer can produce, it costs nothing in print time, and turning a pot over to find the signature is what a potter would have done anyway.

The one real constraint is that a serif hairline has to land at or above one extrusion width, 0.45 mm, or the slicer silently drops it. Gabriola needs a 15 mm cap height to clear that, cut 0.8 mm deep — so 15 mm is the default and the calligraphic look comes out of the arithmetic rather than the taste.

Renders of the underside of the vase with the name Emma, and a two-line Klara and Jonas, engraved into the base
Up to twelve characters, two lines if you put a slash where the break goes.

The listing, and which photos are real

Eight phone photos went in. Out came a set of staged shots — the vase with ranunculus on an oak table, on a shelf with pampas grass, on a studio gradient, next to a wine bottle for scale, and in five filament colours it has never actually been printed in. Every prompt carries the same clause: keep the silhouette, the crown rim and the rippled texture identical to the source photo, do not restyle or smooth the vase itself.

It ignores that clause when it feels like it. The first tulip shot came back with the ridges flattened and the sawtooth rim rounded off into an ordinary vase, and the re-prompt had to shout at it — CRITICAL: deep rippled bark-like vertical ridges on one flank and an irregular sawtooth crown rim, clearly visible and strongly shadowed. Which is exactly the failure you should be worried about, because the thing it smooths away is the thing the buyer is paying for.

The same vase on a table holding white ranunculus, eucalyptus and pale blue delphinium in a softly blurred living room
The hero shot. Real vase, real colour, invented flowers, invented room — and look how much calmer the ripples came back.

Etsy has always encouraged styled photography; props and rooms and flowers are the norm there. The rule that bites is accuracy — the photo has to represent the actual item. Going by seller-facing coverage of the 2026 changes, two things are now true: the listing form carries an "I used AI-generative technology" checkbox, and the first image is expected to be the real, unedited product.

So the running order got rebuilt around that. Image one is the phone photo, grain and all. The staged hero moved to slot two. Four of the twelve are untouched photographs, and they carry the close-ups that matter: the ridges, the torn rim, the view down into it. Tick the box, keep the originals, and put "flowers and props not included" in the description — that one line prevents most of the arguments.

The same honesty applies to what the thing can do. It is built from stacked layers, so it will never be promised as permanently watertight. Dried stems, straight out of the box. Fresh flowers, drop a jar inside — there is plenty of room and nobody can see it.