Unity Lab · Physics play · Buoyancy & trim · verified: buoyancy self-test PASS, live playthrough

Punt Landing

A flat-bottomed ferry punt tied to a stone quay at dusk, a lantern on the post, and a verb no piece in this lab had before: STOW. Take cargo off the quay and put it on a spot on the deck — and the boat answers, because the answer is arithmetic. Draft is the total mass over the waterplane area, so every basket you take aboard sinks her by a computable amount; a load placed off the centreline is a moment, and she lists by the angle that moment makes against the water's restoring stiffness. The waterline painted on her hull is the whole instrument: it is not a health bar drawn over the scene, it is where the river actually meets the boat. Load her heavy and she floats low with no margin for a mistake; load her light and you can be careless. Lean the weight out on the rail and the cargo creeps, then goes over the side — and if the roll beats the creep, the river comes in. AI agents authored the piece end to end: the concept painting, six code-modelled Blender asset kits, the Unity scene and its physics, and a D-mixolydian score for harp, clarinet, koto and contrabass with a music box held back for a full manifest — every sound a sampled instrument over a recorded river.

Play it now

DRAG cargo onto a deck spot · TAB picks and ARROWS choose the spot · SPACE casts off · P pauses, R restarts · 11.9 MB of code-modelled assets

▶  Play

The concept is the contract

The piece was concepted first — an AI key-art painting — and every element in it was then code-modelled in headless Blender and audited against that painting before a line of gameplay was written. The pair below is the contract and the live build.

AI concept painting of a river punt at a quay
1 · AI concept
the punt landing live in the Unity engine
The same landing, live in the engine
Concept prompt

A river ferry landing at golden dusk: a flat-bottomed wooden punt moored alongside a mossy stone slipway, part-loaded with woven willow baskets, a stack of pale crates, a hessian grain sack and a small oak barrel; a long ferryman's pole leaning against a mooring post; a lit brass lantern hanging from a timber post; willows trailing over deep teal water with lily pads and reeds at the bank; a low timber jetty with iron mooring rings and a coiled rope; a thatched ferryman's hut up the bank; warm amber lantern glow against cool green-blue water, long low sunlight, high-end stylized 3D game render, no text, no watermark, no UI

Code-modeled in Blender

Six asset kits, written as Blender Python against the platform sculpt kit — no downloaded models anywhere — and audited render by render before entering the engine. Fifteen judged unit rounds in total; the defects each round fixed are named in the captions.

the punt hull
U1 · The punt, 4 rounds — the bow's rising floor shipped first as a five-box staircase, then as a fused loaf floating above the sheer, before it was DERIVED from the two surfaces it has to meet: the floor rising to the gunwale while the beam narrows
cargo kit
U2 · Cargo kit, 3 rounds — the baskets read as slinkies until the coil pitch was pulled back inside the tube radius so the wall became weave; the sack was a smooth egg until it got a gathered neck and a tie
jetty
U3 · Jetty, 1 round — planked deck on visible bearers, chamfered post caps, and iron mooring rings as curve_tube rings (a solid disc is what you get if you reach for a cylinder)
lantern
U4 · Lantern, 2 rounds — the first cage ran its bars across the middle of every pane and covered the glass, so the scene's one warm light did not glow at all; corner posts leave it visible
willow and reeds
U5 · Bank, 4 rounds — the willow shipped as a wire brush (a bare strand is a wire, and no number of wires is a canopy), then as bead chains once it had leaf mass, until the lobes were resampled to overlap by half
ferryman's hut
U6 · Ferryman's hut, 1 round — round wattle wall under a thatch cone, with the door and window recesses standing proud of the wall so they read at dusk

Measured, honestly

MeasureValueConditions
Buoyancy self-testPASSat boot, a known 100 kg is placed at a known 0.30 m off the centreline and the resulting draft and heel are checked against the closed form computed independently — draft within 0.0005 m, heel within 0.05°
The modeldraft = m / (ρ·A);  heel = atan( Σm·x / (ρ·I·k) )A = 4.60 × 1.30 = 5.98 m² waterplane; I = LB³/12 = 0.842 m⁴ about the centreline; hull 210 kg; freeboard 0.34 m
What that means aboardempty 0.035 m · full manifest 0.16–0.22 m · all seven 0.26 mthe five lightest leave 0.14 m of rail to play with; the five heaviest leave 0.078 m, so the heavy manifest has to be stowed dead amidships
glb payload11.85 MB total, largest 5.12 MBsix kits, prune+dedup; gates are 12 MB total and 6 MB single. Ring segments 36→18 alone took the set 15.31 MB → 11.85 MB — a basket wall is nine tubes, and a 0.2 m coil does not need 36 sides
Unity build≈38.9 MB (11.8 wasm + 27.2 data)Unity 6 WebGL, scene built entirely in code, Minimal template
Rounds15 Blender unit rounds + engine rounds on the live URLaudit-until-clean; every fix round rebuilt, redeployed and md5-verified end to end
Honest rowsthe first physics was correct and therefore boring; the first freeboard made the fail state unreachablea 5.98 m² waterplane is genuinely large, so a realistic 191 kg manifest sank her 3 cm against 47 cm of rail — the numbers were right and the game was inert, and only real ferry-freight masses made the waterline mean anything. Then, with the rail that high, the cargo always slid before the water could reach it: swamping could not happen at any load, and the boat had to become the shallow thing a punt actually is

Made by AI, compiled by the real Unity 6 engine

The loading is driven by a closed-loop telemetry autopilot on the live build, not by screenshots: it reads the piece's own console feed, drags one crate with the pointer to prove that path works, then loads the manifest on the keyboard path, casts off, and finally tries to capsize her on purpose by stacking the heavy freight out on one rail — so the list, the slide and the swamp are all proven rather than assumed. Every refusal the piece makes says why it refused, which is what lets an audit tell "the input missed" apart from "the game said no". The interesting defects here were not rendering bugs but design ones, and both were found by putting numbers on them: the physics was correct on the first pass and therefore inert, because a punt's waterplane is large enough that a realistic load barely moves her; and once the loads were real ferry freight, the rail was still so high that the cargo always slid off before the water could ever come over it — the fail state existed in the code and was unreachable in play.

What this piece earned

Buoyancy you can assert
Draft is mass over waterplane area and heel is a moment against the water's restoring stiffness. Both are closed form, so the piece ships with a boot assertion — a known mass at a known offset, checked against the prediction — instead of an opinion about whether it looks like it floats.
The waterline is the HUD
Where the river meets the hull is not a bar drawn over the scene; it is the physics, rendered. The camera sits low and side-on for exactly that reason, so the thing you are managing lies across the frame.
Placement is the decision
Taking a barrel aboard is arithmetic anyone can do. Choosing which of eight spots it goes in is the game: amidships costs you nothing but deck room, and out on the rail buys room at the price of a list.
Cargo creeps, it doesn't teleport
A list has to hold for half a second before anything shifts. That half second is what makes the slide a safety valve on a moderate list — and what lets a violent one put the rail under before the deck can save itself.
Fail-soft by construction
Losing a crate over the side is not losing the run: the list corrects itself and you carry on a crate short. Only water over the rail ends it.
Composed sampled score
D mixolydian at 58 BPM: harp lead, clarinet counter that leans in as she settles deeper, koto for the stow, contrabass under the hull, and a music box ladder held back for a full manifest. 41 note files over a recorded river.
draft = m/(ρA)waterplane 5.98 m²I = 0.842 m⁴hull 210 kgfreeboard 0.34 mslide at 7.5°list creep 0.55 smanifest 5 of 7D mixolydian @ 5841 notes + 2 beds11.85 MB glb