Skip to builds

Animated 3D world

A real-time ocean + whirlpool (Charybdis) from the Odyssey, everything drawn in code.

  • Kimi K3
  • Fable 5
  • GPT-5.6 Sol

The prompt

# Build Prompt — Charybdis: The Whirlpool

A single build. A real-time, controllable open-sea scene from *The Odyssey*: Odysseus'
galley caught at the edge of **Charybdis, the great whirlpool**, with **Scylla's** cliff
looming on the far side of the strait. This is a graphics-and-feel showpiece. It has to
look like a **2026 AAA video game** — real dynamic lighting, real materials, real depth —
not a tech demo. Everything is generated in code.

---

You are a world-class real-time graphics engineer working in the browser. Build a
production-quality, full-screen, interactive ocean-and-whirlpool scene using **WebGPU via
Three.js (WebGPURenderer + TSL)**, native ES modules, no build step.

**Ground rule on assets:** build ALL geometry and ALL materials procedurally, in code —
no pre-made 3D model files, no downloaded image textures, no HDRIs. You MAY use Three.js
and its official addons, plus open-source *libraries* for simulation, physics, and
post-processing (e.g. a physics engine like `@dimforge/rapier3d` or `cannon-es`, an FFT
ocean reference such as the technique in `jbouny/fft-ocean`, `lil-gui` for controls). The
point is that YOU build the ship, the figure, the whirlpool, and every texture from math —
libraries are for the hard rendering/physics plumbing, not for the content.

## The single most important thing: it has to look REAL

The last version of a scene like this failed in one specific way: **the ocean was okay,
but the ship read as a flat, dimensionless blob and the figure on it looked like a stick
figure.** That cannot happen again. The ship and the figure have to hold up in a close-up.
Hit the realism bar below on every element, and do not stop until they all clear it.

### Ocean (physically-based, FFT-driven)
- Drive the surface with an **FFT / Tessendorf ocean spectrum**, ideally **multi-cascade**
  (2–3 frequency bands: long swell + chop + capillary ripples) rather than a handful of
  Gerstner waves. Derive correct normals and the **Jacobian** for foam.
- **Persistent, rolling whitecap foam** that accumulates where waves steepen and break, and
  lingers/streaks off the crests. **Spray and mist** off the tops in wind.
- **Physically-based water optics:** color absorbs with depth (bright over shallows, deep
  saturated blue-green in the trough), **Fresnel** reflectance, **subsurface scattering**
  glow through backlit crests, **sun glitter**, and **screen-space reflections (SSR)** so
  the ship, cliff, and sky land on the water. Fog to the horizon.

### Charybdis — the whirlpool (the hero effect)
- A genuine, physically-suggestive **vortex**: the ocean surface spirals down into a
  **funnel** that punches below sea level, water accelerating and stretching toward the
  throat, with a dark churning core and a ring of breaking foam around the rim.
- Downdraft **spray/particle** system pulled inward and down. The whole thing is **live and
  animated**, with a `whirlpoolStrength` control that grows it from a swirl to a
  ship-swallowing maelstrom.
- The galley responds to it: buoyancy plus the vortex's inward/rotational pull, so the ship
  **lists, spins, and gets dragged** toward the throat as strength rises.

### The galley (this is where it must not be a blob)
Build a believable **Homeric-era Greek galley** as real 3D geometry with volume and correct
proportion, close-up-worthy:
- **Hull:** loft it from spline cross-sections (a keel line + ribs + a smooth planked
  skin), a **high curved sternpost and prow**, a painted **oculus (eye)** on the bow. Real
  thickness — you should be able to orbit it and see a solid, hollow-decked ship, not a
  slab.
- **Materials (PBR):** use `MeshPhysicalMaterial`-equivalent with **procedural wood-grain**
  (albedo + roughness + normal generated from noise), plank seams, tar/pitch darkening at
  the waterline, salt/wetness sheen (**clearcoat**), and weathering. Bronze fittings with
  proper metalness.
- **Rig:** mast + yard (TubeGeometry), a **square sail** as a real subdivided cloth that
  **billows and luffs** via position-based / spring cloth sim driven by wind, ropes/rigging
  as thin tubes, banks of **oars** along both sides.
- **Ambient occlusion** in the crevices so it reads as solid.

### Odysseus and the crew (no stick figures)
- A **properly-proportioned humanoid** figure — real head, torso, arms, legs with correct
  scale — braced at the helm, plus a few crew at the oars. Segmented or lightly skinned
  bodies with **PBR skin and cloth (tunic/cloak)**, simple believable poses that react to
  the pitch and roll. Stylized is fine; **stick-figure or featureless-blob is a fail.**

### Lighting & rendering pipeline (name-checked, all required)
- **Image-based lighting:** generate a procedural HDR sky and turn it into an environment
  map with **PMREM** for real reflections/ambient. **Physically-correct sun** as the key
  light.
- **Cascaded shadow maps (CSM)** so the ship and cliff cast crisp shadows on the water and
  themselves. **SSAO** for contact shadowing. **ACES filmic tone mapping** + **bloom** on
  the sun/foam/spray. Optional **depth-of-field** for the cinematic beats.
- Run a real **post-processing pipeline** (TSL/EffectComposer): SSAO → SSR → bloom → DoF →
  ACES output. Correct **linear/sRGB** color management throughout.

## Scylla (the far side)
On the opposite cliff of the strait, suggest **Scylla** — a rock-bound, many-necked
silhouette that occasionally lunges. It doesn't need to be the focus; it frames the danger.

## Feel & interactivity (make it play like a game)
- Free-orbit camera **and** a cinematic "follow the ship" rig with slight shake near the
  vortex. Smooth, damped, no snapping.
- A clean control panel (`lil-gui`): `whirlpoolStrength`, sea state / wind, time of day,
  camera mode, and a live **FPS** readout. Let the viewer crank the whirlpool and feel the
  ship get taken.
- Steering: let the player nudge the galley (rudder/oars) to fight the pull — it should
  *feel* like you're losing a battle with the sea as strength climbs.

## Runtime handling (required)
WebGPU detection with a graceful message, loading and failure states, resize, touch,
capped DPR, hidden-tab pause, `prefers-reduced-motion`, accessibility, and performance
safeguards (LOD / throttling so it holds a smooth frame rate). Live FPS readout.

## Standards & iteration — do not stop early
This is judged on how real and how alive it looks. **Do not consider it done until every
element above clears the realism bar.** After you build it, **render it, screenshot your
own output, and inspect it** — the ocean, the whirlpool, and especially the ship and the
figure in close-up. If the ship reads flat, if the figure reads like a stick, if the water
looks like noise instead of a real sea — **fix it and go again.** Do a minimum of **three
full self-review-and-improve passes**, more if it's not there yet. No placeholders, no
invented APIs, no console errors, no hidden fallback rendering.

## Deliverable
Complete, directly runnable code (index.html + JS modules, and any pinned library imports)
plus brief launch instructions. It must run at a smooth frame rate and look like a modern
game.

The exact prompt from the published test.

The builds

Kimi K3 · Screenshot of the buildRuns in your browser

The full write-upKimi K3 vs Fable 5 vs GPT-5.6Read the article

Written by

Pat Simmons. Pat tests AI models and tools on the AI for Mortals YouTube channel.

AI FOR MORTALS.

Your daily AI edge that will make everyone wonder how you do it all.

Every weekday, the practical AI updates that matter, and exactly what to do with them.

The latest in AI, in plain English. Free, every weekday.