Unity Lab · Characters · Limb IK · verified: IK self-test 4/4, live playthrough

Crag Line

A lone climber on a limestone sea-cliff at golden hour, and a verb no piece in this lab had before: REACH. Drag a hand or a foot to a hold and two-bone inverse kinematics puts it exactly there — the shoulder and elbow solve by trigonometry onto the rock, not by an animation that approximately fits. GRIP is the pressure and it is spent by every pull, drained faster by crimps than by jugs and slower when your weight is on your feet, which is the thing real climbing actually teaches. Rest on a good hold and it comes back; post protection into a crack and a fall becomes a swing instead of the ground. AI agents authored the whole piece end to end: the concept painting, six code-modelled Blender asset kits, the Unity scene, and an F-lydian score for cello, english horn, pizzicato strings, acoustic bass and a vibraphone ladder held back for the top-out — every sound a sampled instrument over recorded ocean and wind.

Play it now

DRAG a limb to a hold · TAB picks a limb and ARROWS reach · rest on jugs · P pauses, R restarts · 11.3 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
1 · AI concept
live in the engine
The same crag, live in the engine
Concept prompt

A lone climber halfway up a sun-warmed limestone sea-cliff at golden hour: pale ochre and bone-white limestone with deep horizontal strata, cracks and jug ledges tufted with sea-pink and heather, a slim figure in a rust-red top and slate trousers reaching up for a chalk-marked hold, chalk dust drifting in the light, a taut climbing rope running down to a rope bag and a small green canvas tent on the grassy ledge below, brass protection gear racked on the harness, gulls wheeling over a deep blue-green sea far beneath, warm low sun raking across the rock face, 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. Twenty judged unit rounds in total; the defects each round fixed are named in the captions.

the climber
U1 · The climber, 8 rounds — palette re-authored at half value against the studio lift, a jeans pelvis so the top stopped reading as briefs, neck and collar, and face features re-seated off the MEASURED face surface after they shipped buried inside the skull
harness and rack
U2 · Harness + rack, 2 rounds — the belt and leg loops became curve_tube rings after kit.cyl built them as solid discs
cliff module
U3 · Crag module, 4 rounds — tidy masonry, then see-through gaps, then re-derived as a solid mass carrying relief, then long low strata that finally read as limestone
vegetation
U4 · Thrift cushions + grass, 1 round — stemmed blooms and tapered blades, no sphere-blob vegetation
camp
U5 · Camp, 3 rounds — the tent's end wall was a cone rotated into a dome, then both roof planes leaned outward before the gable-sign rule fixed them
gull
U6 · Gull, 2 rounds — three stepped plates per wing became one swept tapered planform

Measured, honestly

MeasureValueConditions
Limb IK accuracy4/4 limbs, worst error 0.091 mboot self-test: solve each limb onto its hold, then measure where the hand/foot MESH actually ended up (not the joint), tolerance 0.25 m
Measured bone lengthsupper arm 0.296 m, forearm 0.263 m; thigh 0.389 m, shin 0.419 mread from the glb's own rig markers at load; the first build shipped a 0.173 m upper arm and every hand fell 1.8 m short
glb payload11.32 MB total, largest 5.40 MBsix kits, prune+dedup; gates are 12 MB total and 6 MB single. Texture resolution 512→256 alone took the set 17.39 MB → 12.70 MB
Unity build≈47.7 MB (11.8 wasm + 26.4 data)Unity 6 WebGL, scene built entirely in code, Minimal template
Rounds20 Blender unit rounds + 10 engine roundsaudit-until-clean on the live URL; every fix round rebuilt, redeployed and md5-verified end to end
Boot to first frame19–32 sSwiftShader (CPU) audit rig; GPU browsers are far faster
Honest rowsthe audit driver was the defect in three consecutive rounds; the grip economy shipped unwinnable oncethe driver aimed at holds 20 m up, then moved feet where hands belong, then drifted sideways and lost height — each reported as "the piece stalled". And r8 measured resting as NON-recovering (grip 0.31→0.07 while resting), so the pitch could not be finished by anyone until the recovery rule was re-derived

Made by AI, compiled by the real Unity 6 engine

The climb is driven by a closed-loop telemetry autopilot on the live build, not by screenshots: it reads the piece's own console feed, drags a limb with the pointer to prove that path, then climbs the pitch on the keyboard path, resting when the grip bar falls and posting protection into the cracks. The shipped run topped out at 7 m of body height after 80 reaches, then proved the pause from a terminal state, the R restart, and a fall with no protection placed resolving honestly into the lose state — 0 console errors across 40 telemetry lines. Getting there took fourteen engine rounds, and the interesting half of them were the instrument rather than the piece: the driver aimed at holds twenty metres overhead, then tried to move feet where hands belong, then drifted sideways losing the height it had gained — each time reporting the game as stalled. The piece's own defects were real too, and each was found by a number rather than a hunch: a 0.17 m upper arm that made every hold unreachable, a rig origin at the feet that hoisted the shoulders 1.42 m too high, a grip economy in which resting did not recover, and a four-limb constraint that could deadlock with no legal move — fixed by letting the feet follow the hands, which is what climbers do anyway.

What this piece earned

Two-bone limb IK
Law-of-cosines solve onto a measured hold, with a pole vector that drops elbows away from the rock and pushes knees out. Deterministic trig — so it ships with an assertion instead of an opinion.
A rig measured, never assumed
Joints are built from the glb's own marker positions, and the shoulder/hip heights above the rig origin are measured at load — the origin sits at the climber's feet, and assuming otherwise put every hold out of reach.
Grip as the only pressure
One scalar surfaces in the tremor in the body, the chalk puff, the rising wind, the bar and the fall. Crimps cost more than jugs; weight on the feet costs least.
Fail-soft by construction
Falling is not losing: you swing onto your last piece of protection and climb on with the height above it gone. Only falling with nothing placed puts you on the deck.
Two input paths, both audited
Drag with a pointer, or TAB a limb and reach with the arrows. The keyboard path exists for accessibility and turned out to be the more reliable audit instrument as well.
Composed sampled score
F lydian at 66 BPM: cello lead, english-horn counter, pizzicato taps for hands and feet, acoustic bass for the drop, vibraphone reserved for the top-out. 41 note files over recorded ocean and wind that rise with your height.
IK tolerance 0.25 mreach hand 0.78 m × 1.25drain 0.019/sjug recovery 0.075/spitch 8.5 mF lydian @ 6641 notes + 4 bedssky renderQueue 2900textures 256 px