Ink Rings

A suminagashi marbling tray, and a VFX piece where the effect does nothing at all until you touch it. Rest a loaded brush on still water and a ring of ink spreads from where it lands. Touch again and the new ring pushes every older ring outward into a nest of bands — because ink floats as a film of fixed area, and adding area anywhere displaces everything else. Fan the surface to draw the rings sideways, rake a comb through to feather them, then lay a sheet and lift the print. Every band on that water is ink you placed, and every print you hang is a record of your own hand. Modelled, composed and coded end to end by AI agents.

Play it now

CLICK drops a ring · 1/2/3 pick the pigment · F fans · C rakes the comb · SPACE lifts the print · P pauses, R restarts

▶  Play

The displacement is the real one

Nothing here fades a ring out or scripts a swirl. Ink on water is a film of fixed area, so a drop of area A at a point pushes every existing point outward along its own radius from that point by d′ = √(d² + A/π) — exactly area conservation in the plane. That single law is why real suminagashi rings nest instead of blurring together, and the piece asserts it at boot two ways: against the closed form, and by checking that the annulus between two displaced radii keeps its area. Ink pushed past the rim is gone from the tray for good.

the tray before any ink
Still water — the effect is doing nothing, by design
nested rings of ink
Six touches later — each ring displaced by the ones after it

The contract this piece was built against

Every piece in this lab is authored against a contract and audited against it. The image account was out of credits this cycle, so the contract stayed in words — written and saved before generation was attempted — and each element it names still got its own modelled unit.

The written contract. A suminagashi floating-ink marbling table in a quiet paper workshop at morning: a shallow black-lacquered water tray, its surface perfectly still, with concentric rings of sumi-black and indigo floating on the water; a low ash work table, a stepped rack of glazed pigment pots in sumi, indigo and madder, two bamboo-handled brushes on a ceramic rest, a folded paper fan, a long wooden comb with fine teeth, a stack of cream washi under a smooth grey river stone, and a bamboo drying rack holding one finished print.

the marbling table live in the engine
The same table, live in the engine

Code-modeled in Blender

Eight units, one per element the contract names, written as Blender code against the platform sculpt kit — no downloaded models. The tray ships named rim nodes so the engine sizes the ink film to the measured vessel rather than to a number typed twice.

lacquer tray, code-modeled
The lacquer tray — dark by reflectance, not by being crushed to black
pigment pots, code-modeled
The pot rack — sumi, indigo and madder, with lidded spares
folded fan, code-modeled
The folded paper fan
marbling comb, code-modeled
The comb, whose teeth feather the bands

Measured

The lab's signature numbers for this piece, including the ones that are not flattering.

MeasurementValueCondition
Displacement error vs the closed form0.00000000asserted at boot: d′ = √(d² + A/π)
Annulus area drift under displacement0.00000001the film conserves area, so rings never thin away
Points per ring / rings held on the film96 / 26every point displaced by every drop
Film area added per touch0.0125 m²born at a 0.028 m radius
Tray bounds1.140 × 0.760 mmeasured from the tray's own rim nodes, 5/5 resolved
Audited playthrough3 / 3 printsdrops, pigment changes, fan, comb, lift
In-fiction refusals proven3 / 3fanning, combing and lifting a clear tray
Sampled note files shipped47koto, harp, cello, clarinet, marimba, celesta
Blender units modelled8one per element in the written contract
Streamed asset payload4.0 MBthe eight units, nothing else
Console errors, desktop and mobile0 / 0boot, six drops, fan, comb, three prints, pause, restart
Mobile horizontal overflownonescrollWidth == clientWidth at 390 px

What the piece earned

Engine and craft features this piece genuinely used, with the constants it settled on.

An effect that does nothing on its own

Most VFX pieces perform at you. This one is inert until touched: no ink appears that the player did not place, and every band moves only because other ink displaced it.

0 autonomous emitters96 pts/ring

Area conservation, asserted

The displacement law is checked at boot against its closed form and against the area of an annulus, so the claim that rings nest rather than blur is verified rather than asserted.

err 0.0drift 1e-8

The tray measures itself

The ink film's bounds come from the tray model's own rim nodes, and the lookup reports how many it resolved — so a silent miss becomes a logged warning instead of a wrong-sized film.

5/5 nodes1.14 × 0.76 m

Refusals that cost nothing

Fanning, combing or lifting a clear tray are each refused in the craft's own language and cost only the moment. The only thing that can ever be lost is ink pushed over the rim.

3 refusalsno fail state

Made by AI, compiled by the real Unity 6 engine

The tray, table, pot rack, brushes, fan, comb, paper stack and drying rack are eight code-modeled Blender exports; the water, the ink film and every ring on it are the piece's own code. Contract, models, score, engine code and audit were authored end to end by AI agents, then compiled by Unity 6 to WebGL.