Graphics Lab

Technical record · updated

Graphics Lab, a technical record

The rendering and simulation experiments behind the homepage’s coastal home, one technique at a time: what each does in the scene now and which files and functions hold it, the papers it adapts, what it cannot do yet, and newer papers that would take it further, each with what it would add and a rough effort.

Each experiment adapts a published method in a small, bounded form for a browser scene, and each entry says where it simplifies. Thumbnails are frames of the live scene captured on October 16 and 17, 2026; the light well, the steam and the onsen are dated in late August, when the noon sun reaches the shaft and the bath runs in daylight. Measurements come from one Windows desktop unless an entry says otherwise. Shader warmup and loading are in the coastal home record.

  • 6 systems
  • 21 techniques
  • 47 papers to try
  • 2 design moves
  • 3 open problems
  • 105 sources

Each system lists its techniques: what each one does, how it works, the files that hold it, the research it borrows from, what it cannot do yet, and the next moves worth trying. The design history keeps every move in order, with what the result said back.

Next papers to try are newer work that would advance a technique, each with what it would add and a rough effort: small is days inside one module and its tests, medium is a new module or render pass, large is a new pipeline such as GPU compute, ray tracing or learned motion.

Programs can read the same record as JSON. In the repository, python bin/design_record_brief.py graphics-lab turns it into a brief for the next pass, and new work is appended to _data/design_records/graphics-lab.yml.

Light

Light that has to be traced rather than rasterized: down a drilled shaft, around the house’s walls, into the creases where things touch, and through rippled water in a lab page of its own.

Light paths through the onsen

Experimental · Oct 14, 2026

A plain-JavaScript renderer races path tracing against Metropolis light transport on the sunlight the light well bends through the onsen’s water.

Its own page: Light Paths in the Onsen

How it works, files and sources

createRenderer in core.mjs builds one path sampler that reads every random decision from a fixed coordinate of a sample vector. PathTracer feeds it fresh numbers and MetropolisRenderer feeds it Kelemen and colleagues’ small and large mutations, so the two estimators share every line of path construction. Both use next-event estimation to the sun and sky with power-heuristic multiple importance sampling, after Veach, and water hits use safeguarded Newton iteration on seven frozen ripples. The page runs each estimator in a module worker for the same wall time, and make_light_lab_reference.mjs splits path space at the first hit for a 24-minute reference.

Files
Known limits
  • A simplified scene. A box grotto, frozen ripples, no steam, a round opening instead of the tilted shaft, and a sun three times its real size by default.
  • Metropolis takes its total brightness from independent samples that usually miss the sun, and its chains start in skylight.
Next papers to try
  • Medium Zeltner, Georgiev and Jakob 2020, SIGGRAPH 2020Solves for the path through the water from a point on the pool floor to the sun, so even plain path tracing could aim at the sun. The lab’s pool has a single refracting surface, the method’s simplest case.
  • Medium Loubet et al. 2020, SIGGRAPH Asia 2020Integrates the light arriving through each facet of a triangulated water surface in closed form, a next-event estimator for caustics under water.
  • Large Jakob and Marschner 2012, SIGGRAPH 2012Moves a chain along the family of paths that stay connected through the water instead of hoping a random change does, so the race’s caustic paths would mix much faster.
  • Medium Müller, Gross and Novák 2017, EGSR 2017Learns which directions reach the sun from each region and samples them, an unbiased alternative to Metropolis whose independent samples also give the image’s brightness.
Next moves
  • Needs research Add the pool light to the lab scene and render its caustics on the vault.

A light well with traced shaft light

Shipped · Oct 14, 2026

A shaft drilled from the clifftop brings sun into the onsen, and its beam, its sun patch, its skylight and the lit steam share one visibility function.

How it works, files and sources

bin/coastal_lightwell.py drills a shaft of 0.42 m radius through 1.67 m of rock, leaning 28° toward the noon sun. createLightWell in light-well.mjs follows four light paths. The sun’s shadow map carries the patch on the floor or the water. Dust and humid air in the beam are single scattering with a forward Henyey–Greenstein phase, marched only inside the shaft’s elliptic cylinder, after Wronski. shaftExitRadiance path-traces the drilled cylinder on a fixed Halton sequence for the radiance leaving the aperture, and the aperture and the sun patch then light the bath as two small area lights in closed form (wellIrradianceGLSL).

Files
Sources
Known limits
  • The shaft passes 5.5 % of the sky, so outside midday the grotto is darker than an open bath. The beam needs a high sun; the October 16 noon frame shows none, the August 20 frame does.
  • The two area lights are Lambertian, so the wet rim and the water show no glossy reflection of the aperture.
  • The beam’s scattering sees only the shaft’s own visibility, not the bather or the screens.
Next papers to try
  • Medium Heitz et al. 2016, SIGGRAPH 2016Shades polygonal area lights with rough specular lobes in closed form, so the aperture and the sun patch would gleam on the wet rim and the water instead of only lighting them diffusely.
  • Medium Chen et al. 2011, I3D 2011Computes single scattering with shadows from a shadow map, one slice of rays at a time, so the beam and the steam could show the bather’s shadow.
Implementation and history

Traced sky and lamp bounce

Shipped · Oct 2, 2026

A CPU ray tracer bakes sky visibility and one diffuse bounce into probe cages once, then relights them from the actual sky and lamp powers without tracing again.

How it works, files and sources

createStaticLightField builds a triangle BVH over the house’s static opaque meshes (createTriangleBVH), traces eight cosine-weighted sky rays per primary hit, and stores irradiance as first-order spherical harmonics (accumulateL1, evaluateL1) in 56 probes with octahedral distance moments, after Ramamoorthi and Hanrahan and the probe visibility of Majercik and colleagues. Unit sky and lamp bases let a change of hour recombine the cache with zero rays. The field replaces three.js’s ambient terms once; direct light, reflections and refraction stay native. The bake runs in yielded slices and frees its accelerator afterwards.

Files
Known limits
  • Static and one bounce. People, props and swaying plants do not shade it.
  • Four coefficients lose directional contrast, and sparse probes can leak at thin walls.
Next papers to try
  • Medium Iwanicki and Sloan 2017, EGSR 2017A basis of twelve lobes on an icosahedron’s vertices with close to third-order quality from fewer reads, which would restore the directional contrast four coefficients flatten.
  • Large Silvennoinen and Lehtinen 2017, SIGGRAPH Asia 2017Precomputes, for each receiver, which few probes it can see, so the bounce would stop leaking through thin walls.
  • Large Rodriguez et al. 2020, SIGGRAPH Asia 2020Stores multi-bounce glossy light in probes and reprojects it, so the glass, the water and the polished wood would reflect the lit house rather than the environment map.
Implementation and history

Horizon-based contact light

Shipped · Oct 1, 2026

A visibility buffer computed before the beauty pass darkens only indirect diffuse light near contacts, with the closed-form horizon integral of ground-truth ambient occlusion.

How it works, files and sources

contact-occlusion.mjs projects the geometric normal into four fixed view-aligned slices and integrates the cosine-weighted visibility above each slice’s two horizons in closed form (horizonIntegral), Jimenez and colleagues’ inner integral, with at most 32 depth probes per pixel. A 3 × 3 reconstruction keeps neighbours on the same tangent plane (bilateralWeight), and the paper’s cubic fit adds back the light a pale neighbourhood bounces (bounceVisibility). bindContactLighting scales only each material’s indirect diffuse term, so sunlight, emission and reflections are untouched, and a still composes the same way every time.

Files
Known limits
  • Screen-space, so it cannot see hidden or offscreen geometry and overestimates thin occluders.
  • Four fixed slices keep a directional bias, and there are no bent normals or specular occlusion.
Next papers to try
  • Medium Therrien, Levesque and Gilet 2023, The Visual ComputerReplaces the two horizons with a bitmask of occluded sectors, so light passes behind thin shelves and chair legs and nearby surfaces add one bounce of their colour.
Implementation and history
Next moves
  • Needs research Specular occlusion and bent normals from the same report (its GTSO), so reflections dim in creases too.

Moves in this system: Two renderers, one minute

Water, air and sky

Two bodies of water with different models, bath steam carried by its own heat, one breeze from the Pacific through the house, and a sun placed by La Jolla’s clock.

A Pacific of Gerstner waves

Shipped · Oct 1, 2026

Ten Gerstner waves displace the sea and its normals together, with a wind sea that grows with the breeze, gusty ripples and whitecaps, a lit shoreline and a live mirror of the cliff.

How it works, files and sources

sampleOcean in ocean-spectrum.mjs sums ten choppy Gerstner components from 24.7 m to 6.1 cm with gravity–capillary dispersion and analytic tangents, after Finch, and keeps the steepness sum under 0.3 so the surface never folds. Each amplitude fades with the pixel’s footprint, and the slope energy it loses widens the GGX lobe, a scalar version of Bruneton, Neyret and Holzschuch’s transition from geometry to BRDF. Since October 16 the seven shorter components are a wind sea that turns and grows with the coast’s breeze under a Pierson–Moskowitz cut (windSeaScale), pixel ripples follow the local gusty wind by the Cox–Munk slope law (rippleScale), and whitecaps cover Monahan and Ó Muircheartaigh’s fraction (whitecapCoverage). createPacific adds swash, wet sand and lit foam, and createSeaReflection renders a mirror with exact water Fresnel.

Files
Known limits
  • A sparse authored spectrum on a finite 400 m surface, with no FFT, cascades, bathymetry or weather.
  • The roughness widening is a scalar isotropic fit, not the paper’s anisotropic slope statistics.
  • Waves run straight through the shore and the rocks; nothing reflects, refracts or breaks.
  • Close up, the swell components draw a faint diamond pattern on the near water.
Next papers to try
  • Medium Jeschke et al. 2020, SCA 2020Keeps procedural waves but makes them respect the terrain’s boundary, so swells would slow, turn toward the beach and wrap around the rocks.
  • Medium Dupuy and Bruneton 2012, SIGGRAPH Asia 2012 Technical BriefsDerives whitecap coverage from a wave-deformation criterion that filters with distance, so foam would form where waves steepen without the tenfold exaggeration.
  • Large Jeschke et al. 2018, SIGGRAPH 2018Stores wave amplitude by position, direction and wavelength, so waves could reflect off the cliff and bend around the headlands.
  • Large Horvath 2015, DigiPro 2015Empirical directional spectra, including a shallow-water spectrum and a swell parameter, to drive an FFT ocean if the spectral-ocean move goes ahead.

A height-field onsen

Shipped · Oct 2, 2026

The onsen is a 40 × 40 shallow-water height field whose waves carry water between cells, reflect off the rim and the bather, and start from the bather’s hand.

How it works, files and sources

createHeightfieldWater follows section 2.1 of Chentanez and Müller: staggered heights and face velocities, conservative upwind depth fluxes, pressure from the free-surface gradient and reflecting solid faces, at fixed 1/120 s ticks with CFL subdivision; total volume holds to about 10⁻¹⁴. measurePoolGeometry measures the real basin, about 0.127 m deep. createPoolStroke drives a slow hand skim, and the palm’s submerged velocity relaxes nearby face velocities inside each step, so a resting hand adds no energy. createOnsenWater packs elevation, slopes and wet weight into a texture for the pool’s material and runs only when the camera can see the pool.

Files
Known limits
  • Shallow-water waves travel at the wrong speed when their wavelength nears the 12.7 cm depth or is shorter, so the hand’s ripples are off.
  • One-way coupling, with no wet and dry cells, splashes, buoyancy or caustics.
Next papers to try
  • Medium Jeschke and Wojtan 2023, SIGGRAPH 2023Splits each step into shallow-water bulk flow and Airy surface waves, so the hand’s short ripples would travel at their true speed in this shallow basin.
  • Large Chentanez, Müller and Kim 2015, IEEE TVCG (SCA 2014)Couples a height field to a 3D grid and particles where the surface breaks, for splashes when someone steps in or the spout drips.
Implementation and history
Next moves
  • Ready A steady drip from the bamboo spout into the solver at the spout’s mouth.

Thermal steam

Shipped · Oct 2, 2026

Bath mist is two transported fields, droplet concentration and temperature, rendered with single scattering that composes in order around the glass and the water.

How it works, files and sources

createSteamDensity advects an 18³ concentration and temperature field at a fixed 30 Hz with midpoint semi-Lagrangian backtracing, after Stam, and lets warmer cells rise faster, after Fedkiw, Stam and Jensen’s separate smoke density and temperature; diffusion and cooling use exact exponential factors, and since October 16 the drift follows the house’s share of the coast’s breeze (setWind). createSteamVolume marches up to 40 samples with Beer–Lambert extinction and a Henyey–Greenstein phase (integrateSteamSamples, steamPhase), after Wronski, and splits each ray once at the nearest glass or water (steamRayIntervals) so the gas in front and behind composes in order.

Files
Known limits
  • A prescribed buoyant rise with no pressure solve; semi-Lagrangian transport blurs the field and does not conserve its mass exactly.
  • Single scattering only, with no shadow from opaque geometry beyond the light well’s mask.
Next papers to try
  • Medium Qu et al. 2019, SIGGRAPH 2019Advects along forward and backward maps for about the cost of two semi-Lagrangian steps, so the 18³ field would keep its wisps instead of blurring them away.
  • Medium Kim et al. 2008, SIGGRAPH 2008Synthesizes the turbulence a coarse grid misses with wavelet noise, detail far finer than 18 cells at shader cost.
  • Large Zehnder, Narain and Thomaszewski 2018, SIGGRAPH 2018If the steam ever gains a pressure solve, a reflection at mid-step keeps its swirls far longer than projection alone.
Implementation and history

One wind for the coast

Shipped · Oct 16, 2026

One breeze, measured at Scripps Pier and carried by gust fronts that travel downwind, moves the sea, the clifftop planting, the room plants, the curtains, the steam and the particles.

How it works, files and sources

createCoastWind in wind-field.mjs runs a periodic cubic Hermite through the October hourly means at Scripps Pier (NDBC LJPC1, 2023–2025) and writes every gust as a function of retarded time t − x·d/c, so a front reaches each place in turn at the mean wind’s speed, Taylor’s frozen turbulence. An exact integer hash makes the shader chunk (coastWindGLSL) and the CPU agree on every gust. Indoors, a six-mode curl-noise field adds the house’s own eddies (sampleWind), exactly divergence-free, after Bridson, Hourihan and Nordenstam. patchFloraSway bends the planting by a lean that grows like U^1.4, as streamlining leaves’ drag does, and a sway at each species’ own frequency phased by retarded time, so gusts roll across the bluff; the room plants bend around their real stems.

Files
Known limits
  • Frozen turbulence over flat ground. There is no shelter or speed-up from the bluff, the house or the cliff, and no change with height.
  • The outdoor field is not divergence-free; only the indoor eddies keep the curl field’s guarantee.
  • October’s daily cycle all year.
  • Trunks and branches stay rigid; only leaves, needles and fronds move.
Next papers to try
  • Medium Diener et al. 2009, Eurographics 2009Projects the wind onto a few precomputed modal stresses per tree, so the Torrey pines and the palm would sway as whole structures, evaluated on the GPU.
  • Medium Habel, Kusternig and Wimmer 2009, Eurographics 2009Precomputes branch responses to turbulent wind in a motion texture read by one vertex shader, so branches would bend by their own stiffness.
  • Large Jahrmann and Wimmer 2017, I3D 2017Draws grass blades as geometry with gravity, wind and collisions on any surface, so the bluff’s grass could part around the rabbits.
Next moves
  • Ready Follow the station’s monthly cycles, so summer afternoons blow harder than October’s.

Sun position and sky

Shipped · Oct 1, 2026

The sun, its shadows and the sun’s disc follow NOAA’s solar equations for La Jolla on the scene’s Pacific clock; the sky’s colours are authored.

How it works, files and sources

coastalDaylight in daylight.mjs uses NOAA’s fractional-year approximation at 32.83° N, 117.27° W, with Pacific daylight saving. In environment.mjs, setPalette sets the sky shader’s zenith and horizon colours by time of day and points its sun from the daylight model, and makeEnvironment captures the sky into a prefiltered environment map at twenty-minute steps with one generator for the home’s lifetime. On the coast the sun’s shadow map follows the camera, snapped to whole texels. Night’s key light is an authored moon.

Files
Known limits
  • Not an atmospheric scattering model. The sky’s colours and the haze are chosen by hand, so a sunset does not redden by physics.
  • Reflections can lag the sun within a twenty-minute step, and there is no lunar astronomy.
Next papers to try
  • Small Hosek and Wilkie 2012, SIGGRAPH 2012An analytic sky-dome model fitted to radiative-transfer simulations, a few coefficients per colour band, the quickest step to a sky gradient and sunset that follow the sun.
  • Medium Hillaire 2020, EGSR 2020A physically based sky and aerial perspective from small lookup tables, with multiple scattering, cheap per frame, so sunsets and the coast’s haze would come from scattering.
  • Medium Bruneton and Neyret 2008, EGSR 2008Precomputed multiple scattering for every view and sun direction, the method the 2020 work builds on, in case per-frame tables cost too much.
Implementation and history

Cloth, skin and motion

Fabric that moves in the breeze or drapes over a sleeper, skin and hair that take light like skin and hair, and bodies and animals posed on the house’s real geometry.

Sheer curtains in the breeze

Shipped · Oct 16, 2026

Four sheer panels inside the glass front, a position-based cloth in the coast’s breeze, with a weave whose openness, glow and shadow change with the angle.

How it works, files and sources

createCurtainCloth steps 29 × 25 particle panels with small-step extended position-based dynamics: colour-batched structural, shear and bend constraints, long-range tethers, and a kinematic heading of carrier rings whose sine folds gather or spread. Air acts per triangle from the wind relative to the cloth, a flat-plate normal force plus skin friction applied semi-implicitly, and createFacadeDraft feeds jets through an open door from the coast’s onshore breeze. weaveOpenness treats the voile as a plain weave of round yarns, so its gaps close toward grazing angles; back light passes as a thin Lambertian sheet plus a forward Henyey–Greenstein lobe, and a dithered shadow pass leaves a partial pool of light. createCurtainRig steps panels on screen at 30 Hz, and curtainSchedule draws them against the low sun.

Files
Known limits
  • No self-collision, so gathered stacks can pass through themselves in strong gusts.
  • The air has no shielding or wake, so a stack’s inner folds feel the full wind.
  • Depth shadow maps cannot colour the light the yarn lets through.
  • The fabric is authored, not measured; there is no yarn-level or microcylinder model.
Next papers to try
  • Medium Zhu et al. 2023, EGSR 2023Shades cloth from its yarn hierarchy with fibre-level reflection and transmission, so the sheer’s glow and openness would follow the yarn rather than one cylinder per thread.
  • Large Wu et al. 2020, ACM TOG 40(1)Repulsion-based self-collision for cloth on the GPU, so gathered stacks would stop passing through themselves.
  • Large Chen et al. 2024, SIGGRAPH 2024Solves the cloth one vertex block at a time with local Newton steps, stable at large time steps, so the panels could keep their stiffness at 30 Hz without XPBD’s substeps.
Implementation and history

Bedding draped by position-based dynamics

Shipped · Oct 14, 2026

Each avatar’s duvet is dropped over the sleeping body offline by a position-based cloth solver and its pillow pressed in by the head, so no cover cuts through a chest; in the scene the cover breathes.

How it works, files and sources

draped_duvet in bin/coastal_bedding.py builds a height field of everything under the cover (support_field: sleeper, pillow, mattress, frame and bedside table) and drape drops a cloth grid onto it with coloured Gauss–Seidel distance constraints and a soft bend, after Müller and colleagues and Fratarcangeli, Tibaldo and Pellacini; the cover is then trimmed across the chest, quilted and given 3 cm of fill. sleepers poses every avatar’s sleep clip at its deepest and shallowest breath, and pillow presses each pillow wherever a sleeping head rests. bin/refresh_coastal_bedding.py rebuilds the six bed variants in the retained house. In the scene, createBreathingCover in bedding-breath.mjs lifts the sleeper’s cover a few millimetres along its normals around the chest at about fourteen breaths a minute, inhaling over 40 % of each breath (breathAt).

Files
Known limits
  • The drape is offline. In the scene the cover only breathes, a scripted swell of 7 mm at the chest, so it cannot follow a sleeper who turns.
  • Contact is against an upper envelope of the bodies, not two-sided collision.
  • The drape itself has no automated test; the review script records its clearances in artwork/coastal-home/reviews/bedding.json.
Next papers to try
  • Large Li, Kaufman and Jiang 2021, SIGGRAPH 2021Intersection-free contact for cloth and thin shells, so an offline drape could hold the duvet off every body without the trim and the fill that hide contact today.
  • Medium Chen et al. 2024, SIGGRAPH 2024The same block-descent solver offline, a stable replacement for the Gauss–Seidel drape that converges in fewer iterations.
Implementation and history

Preintegrated skin diffusion

Shipped · Oct 2, 2026

Skin spreads direct light across a curved patch with a normalized diffusion profile, so a shadow’s edge on the face turns warm instead of hard.

How it works, files and sources

buildDiffusionTable in skin-diffusion-profile.mjs integrates Christensen and Burley’s normalized two-exponential profile over a locally spherical patch (diffuseResponse, with 96-node Gauss–Legendre quadrature) into a 257 × 49 half-float table. createSkinDiffusion measures mean curvature in metres from view-space derivatives of the skinned surface and replaces only the direct diffuse term of three.js’s physical material with a 70/30 mix of diffused and ordinary response (patchSkinDiffusionShader). The red, green and blue distances, 3.2, 1.2 and 0.65 mm, are authored, not measured.

Files
Known limits
  • A local convex-sphere approximation with pointwise shadows, so no light crosses a shadow’s edge and nothing shines through an ear.
  • Anisotropic shapes reduce to scalar mean curvature.
Next papers to try
  • Medium Xie et al. 2020, Proceedings of the ACM on Computer Graphics and Interactive Techniques 3(1)One-pass screen-space subsurface scattering with variance-guided sampling, so light would cross shadow edges on the face, which a per-point table cannot.
Implementation and history
Next moves
  • Needs research A spatial, diffuse-only buffer filtered with separable kernels, after Jimenez and colleagues, to carry light across shadow edges.

Strand highlights on hair

Shipped · Oct 13, 2026

Hair gets two shifted highlight bands across its strands, the primary and secondary lobes of hair scattering, instead of a round spot.

How it works, files and sources

strandHighlights in realism.mjs adds two lobes to each avatar’s hair material: a near-white primary shifted toward the tips and a broader, hair-tinted secondary shifted toward the roots, the R and TRT lobes of Marschner and colleagues in Scheuermann’s real-time form, on Kajiya and Kay’s strand model. The avatars carry no strand tangents, so each strand direction is combed from the crown of the hair mesh’s bind pose and skinned like a normal. Widening each lobe by the normal’s variance across the pixel, while keeping its energy, removes sparkle at the hairline.

Files
Known limits
  • Direct light only. Environment reflections on hair stay a plain rough response, so hair in shade reads flat.
  • Mesh hair with combed directions, not strands, and no light scattered through the hair’s volume.
  • No automated test.
Next papers to try
  • Medium Chiang et al. 2016, Computer Graphics Forum 35(2)An energy-conserving, artist-controllable fibre model, so the two lobes’ widths and tints could come from a physical fit.
  • Medium Zinke et al. 2008, SIGGRAPH 2008Approximates light scattered through many hairs, so long dark hair would read as a volume rather than a shell.
Implementation and history

Lifts posed on each figure

Shipped · Oct 16, 2026

Every lift in Sirui’s program is solved each frame on the avatar’s own skeleton, so the hands meet the real bar whatever the body’s proportions.

How it works, files and sources

createLiftRig in lift-rig.mjs poses the hips, pelvis, spine and head for each movement, then reaches each hand and foot target with an analytic two-bone solve toward a pole hint (solveLimb): knees out over the toes, elbows back on dips. Clearances come from each figure’s own head, measured from the skinned bind-pose vertices (measureHead), so a bar passes under or behind a cartoon head. Each repetition eases in and out (lowerThenDrive, driveThenLower), the slow in and slow out that Thomas and Johnston describe and Lasseter carried into 3D animation. trainingAt turns the date into the day’s nSuns session, sessionPose stages it and routes walks around the equipment on a visibility graph (planRoute), and createGymProps loads the plates and draws the board.

Files
Known limits
  • Kinematic poses, not dynamics. The body does not strain, sway or balance under the load.
  • Two-bone limbs on a set torso pose per lift, so the spine and the shoulders do not share the work.
Next papers to try
  • Small Aristidou and Lasenby 2011, Graphical ModelsAn iterative solver over whole chains, so the spine, shoulders and arms could solve together for presses and pull-ups.
  • Large Starke et al. 2020, SIGGRAPH 2020Learns movement with many contacts from a phase per contact, so lifts, walks and handoffs of the bar could come from motion data.
  • Large Peng et al. 2021, SIGGRAPH 2021Physics-based control with a learned motion prior, so a simulated body could strain and settle under the bar’s weight.

Animals that plant their feet

Shipped · Oct 2, 2026

Rabbits, sea lions, harbor seals, a raccoon, gulls and sandpipers move on choreography sampled from time, with feet that hold their contacts on the exported terrain.

How it works, files and sources

The acting is original and sampled from absolute active time, so a pause or a slow frame cannot accumulate drift. rabbitActing holds a rabbit’s travel at takeoff and landing and advances it only in the air, with quintic travel so velocity and acceleration never jump. raccoonMotion keeps stance paws on world anchors while two-joint legs follow (plantedFoot), shorebirdMotion turns sandpipers at each zero-speed reversal, and gullMotion joins flight and perch with transitions continuous in acceleration. solvePerchLanding fits each gull’s webbed foot to exported perch triangles.

Files
Known limits
  • Deterministic choreography, with no aerodynamics, collision solver or feather simulation.
  • Contacts are checked at samples, with no guarantee between them.
Next papers to try
  • Large Coros et al. 2011, SIGGRAPH 2011Physics-based quadruped gaits with a flexible spine, so a rabbit’s hop or the raccoon’s walk would answer slope and landing.
  • Large Zhang et al. 2018, SIGGRAPH 2018Blends expert controllers learned from quadruped motion capture, for natural transitions between walking, trotting, sitting and standing.
  • Large Ju et al. 2013, ACM TOG 32(5), SIGGRAPH 2014Controls flapping flight from wingbeat data, so the gulls could flap, glide and recover in the coast’s gusts.

Gliders soaring the bluffs

Shipped · Oct 15, 2026

Three paragliders and a hang glider follow closed loops along the north bluffs, banking into their turns, posed from the scene clock.

How it works, files and sources

createRoute in gliders.mjs tabulates a closed centripetal Catmull–Rom curve by arc length, and gliderPose moves each wing along it at its ground speed, banking by tan(bank) = v²κ/g, a coordinated turn. Poses are pure functions of the scene clock, so pause, hidden tabs and reduced motion hold every glider where it is.

Files
Known limits
  • Authored loops, with no response to the wind.
Implementation and history
Next moves
  • Needs a decision Crab into the live coast wind.

Camera and land

A camera that knows the house’s walls from its own geometry, and land that continues past the mainland in every direction, out to a coast the camera can now see from 160 m.

A camera that knows the house’s walls

Shipped · Oct 15, 2026

Every static mesh is voxelized into a 12 cm field once it loads, and a spring arm keeps the camera on the near side of anything between it and the subject, so visitors can orbit freely and zoom the coast to 160 m.

How it works, files and sources

createCameraField in camera-field.mjs voxelizes each static house, room and coast mesh in a module worker (camera-field-worker.mjs), and camera.mjs classifies the cells: pieces under 45 cm in every direction are detail, a cell blocks when its neighbourhood holds a plane’s worth of structure, and blocking cells grow a 24 cm clearance shell. Rays walk the field cell by cell, after Amanatides and Woo. cameraArm places the camera at the farthest point on the orbit ray the path reaches without crossing a blocking cell, with side rays that pull in before an edge reaches it, and steerOrbit refuses steps that would leave the arm under 40 % of the requested distance. farView lets the haze, the clip planes and the sun’s shadow follow the coast’s orbit out to 160 m.

Files
Known limits
  • Ready about 3.3 s after the rooms stream in. Characters, P, the animals and the clifftop planting are not in the field.
  • Nothing scores the composition, and one 40 % threshold serves every room.
Next papers to try
  • Medium Oskam et al. 2009, SCA 2009Plans camera transitions through a visibility roadmap, so the subject stays in view while the camera moves around obstacles, a step past refusing moves that would hide it.
  • Medium Lino and Christie 2015, SIGGRAPH 2015A compact camera space built around on-screen subject positions, so a room’s framing could be composed rather than only kept clear.
Next moves
  • Needs research Score candidate yaws for the subject’s visibility near obstacles.

The land beyond the mainland’s walls

Shipped · Oct 15, 2026

A terraced mesa with badland canyons, bluffs with the gliderport, a headland with sea caves and a distant point continue the coast past the mainland’s flat walls.

How it works, files and sources

bin/build_coastal_hinterland.py snaps the new ground to the mainland’s 225 back-edge and 41 end-edge vertices (snap, end_edge) and continues the mainland’s own height, cliff and beach functions across each seam, eased over 25 m. One constrained Delaunay triangulation, after Shewchuk’s Triangle, runs from 0.5 m triangles at the walls to 18 m on the far hill, with occlusion baked into vertex colours. Planting, trails, the gliderport’s lawn and a deck over three sea caves follow photographs of Torrey Pines, Black’s Beach, Goldfish Point and the gliderport. bindHinterland loads the 1.36 MB model on the first visit outside and merges its terrain into the camera’s height grid (mergeCameraGrid), and bindWindsock turns the gliderport’s wind sock with the coast’s wind.

Files
Known limits
  • The 400 m sea plane ends at x = 200 m while the coast runs about 700 m each way, and the new beaches have no surf.
  • Shrubs read as mounds within about 20 m.
Next papers to try
  • Large Cordonnier et al. 2017, SIGGRAPH 2017Couples erosion with vegetation simulation, so the canyons and the planting could grow together instead of being placed by distance.
  • Large Paris et al. 2019, ACM TOG 38(5)Amplifies terrain with implicit 3D features, the overhangs and caves a height field cannot hold, so the sea caves and undercut cliffs could belong to the ground itself.
Implementation and history
Next moves
  • Needs a decision Extend the shore samples so surf follows the new beaches.

Drawing

The house drawn in pen while it loads, traced offline from the authored views’ geometry and morphed from drawing to drawing as each piece arrives.

A pen sketch while the house loads

Shipped · Oct 14, 2026

Pen strokes traced offline from geometry buffers draw the sea, the cliff, the cut-away house and the occupied room while the scene loads, then trace the first rendered frame.

How it works, files and sources

strokesFrom in bin/build_loading_sketch.cjs traces each authored view’s object-ID and surface-normal passes, after Saito and Takahashi’s geometry buffers: object outlines weighted by how much of the frame each object fills, creases sharper than about 57°, and long straight runs favoured by the structure tensor’s coherence. Eight drawings pack into 45 KB. createSketchEngine flies strokes on a damped spring (springStep), pairs them with their next targets in Hilbert-curve order (hilbertIndex) so a morph flows instead of tangling, and lets a resting drawing breathe (breathDepth). createLoadingSketch hands an OffscreenCanvas to a worker so model parsing never stalls the strokes.

Files
Known limits
  • The drawings are fixed captures of the authored views and go stale when a room or a camera changes.
  • Image-space outlines and creases only, with no view-dependent lines such as suggestive contours.
Next papers to try
  • Medium DeCarlo et al. 2003, SIGGRAPH 2003Draws lines where a contour would appear from a nearby viewpoint, so rounded stones and the cliff’s bulges would read as volume.
  • Medium Yang et al. 2018, SCA 2018Matches strokes between drawings while keeping their neighbours’ layout, so morphs would pair strokes by shape instead of by Hilbert order.
  • Medium Bénard et al. 2012, NPAR 2012Image-space snakes that keep stylized lines coherent on animated 3D models, for the hand-off where the strokes trace the first live frame.
  • Small Cole et al. 2008, SIGGRAPH 2008Measures where artists draw lines on the same models, a test for which lines the tracer keeps.
Implementation and history

How the lab is kept

The tools that keep the Graphics Lab page and this record honest: stills captured from the live scene, and a brief that ranks the next moves and the papers to try.

Stills from the live scene

Shipped · Oct 16, 2026

Each thumbnail is a frame of the running scene at a named hour, room and camera, scaled but not retouched.

How it works, files and sources

bin/capture_graphics_lab_stills.cjs opens the homepage’s authoring lab (?scene-lab=1) in headless Chromium, sets the hour, the room and, where the authored view does not show a technique, a lab camera. It fixes the page clock for a dated frame, removes the homepage’s feathered edge so a frame reads on either theme, and writes each 4:3 frame with its scene evidence to an unwatched folder. bin/make_graphics_lab_thumbnails.py scales the chosen frames to 480 × 360 WebP and lays four of them out as the card teaser.

Files
Known limits
  • Frames go stale when the scene changes; recapture after a room, camera or look change.
  • Captured in headless Chromium on one machine’s integrated GPU, so colours follow its driver.
Next moves
  • Ready Recapture the stills once the renovation and the wildlife work land; every frame of the house predates the renovated plaster, stone and edges.

A brief that proposes the next paper

Shipped · Oct 16, 2026

The brief script ranks each technique’s next moves by readiness and lists the papers to try by effort, so a later pass starts from the record.

How it works, files and sources

bin/design_record_brief.py graphics-lab prints each system’s current state, its limits, where its last move pointed, the candidate moves ranked by readiness and then by how recently their system moved, and every watchlist paper sorted by effort with its citation. test/test_design_records.py checks that each named function appears in its file, that every watchlist paper is a listed source the technique does not already build on, and that each link to the coastal home record resolves.

Files
Known limits
  • Effort is a guess from the code’s shape, not a measured estimate.

Moves in this system: One lab instead of a page per experiment

Design history

Each move follows the loop from Donald Schön's The Reflective Practitioner: frame the problem, make a move, let the result talk back, then reframe. The dimensions are the variables the move changed. Oldest first; new moves are added at the end.

  1. Light a1b4d3bd3

    Two renderers, one minute

    Frame
    I agreed to the Metropolis experiment. Show, on light the house actually has, when Markov chain Monte Carlo beats independent sampling and when it does not.
    Dimensions
    paths next-event estimation cannot connect; the sun’s size against a minute’s budget; what equal means; how error is measured; where the reference comes from; how much of a visitor’s processor the page may use
    Move
    A dependency-free renderer of a simplified onsen whose single path sampler is fed independent numbers (path tracing) or mutated ones (Kelemen’s Metropolis), raced in module workers on its own page.
    Backtalk
    After a minute path tracing was off by 984 % and Metropolis by 180 %. Metropolis’s total brightness is itself a rare-event estimate, because the bootstrap usually holds no sun path. Lazily replayed small steps left a few-percent bias until unread coordinates were redrawn, and a slab shortcut created ghost water hits that tests now catch.
    Reframe
    The engine is ready for the pool light’s caustics, and for manifold-based mutations if the race should be won outright.
  2. How the lab is kept

    One lab instead of a page per experiment

    Frame
    Sirui wanted the graphics experiments written up as a record that newer SIGGRAPH papers could extend, and found a project page for every experiment too much, so he asked for a hierarchy.
    Dimensions
    how many entries the projects index shows; what each experiment gets (its own page or a section of the record); what a row says at a glance; where the papers to try live; how a still stays honest
    Move
    One Graphics Lab entry on the projects index, with a row per experiment that opens its own page (the light lab) or its section of this record, which gains entry-point functions, links to the coastal home record and a watchlist of newer papers with effort guesses. Light Paths in the Onsen keeps its address as a child of the lab.
    Backtalk
    The October noon sun stays below the light well’s shaft, so the first light-well still showed no beam and the frame moved to an August noon. Night frames hid the steam and the hand’s ripples, so those stills moved to daylight. A pattern meant to find the pines framed the avatar’s spine instead. Checking the papers caught four DOIs in the draft list that resolved to other papers.
    Reframe
    Which paper comes first is Sirui’s call; the shortlist puts a visible change in each of light, sky, water and wind.

Open problems

  1. Which paper first

    Needs a decision How the lab is kept

    Every watchlist entry would make a technique more faithful, but they differ by an order of magnitude in effort and in how much a visitor would notice. The shortlist proposes four with a visible payoff; the choice is a taste call.

    Candidate moves

    • Light paths: specular manifold sampling, to win the race on the caustics outright.
    • Sun and sky: a scattering sky, for real sunsets and a terrace hour at dusk.
    • Onsen: dispersive surface waves, so the hand’s ripples travel at their true speed.
    • Wind: a wind projection basis, so the pines and the palm sway as trees.

    Read

  2. Simulation without compute shaders

    Needs a decision Water, air and sky

    The scene renders through WebGL2 and three.js r164, which have no compute shaders. An FFT ocean, a pressure solve for the steam, cloth on the GPU and probe updates all want them, so each must become chains of fragment passes or wait for WebGPU, a move that would touch every material and pass the shader warmup knows.

    Candidate moves

    • Prototype one FFT pass chain as fragment passes on a separate page and time it against the authored spectrum.
    • Keep the small solvers (the onsen, the steam, the cloth) on the CPU and move only the ocean’s spectrum to the GPU.
    • Price a WebGPU renderer for the home as its own experiment before any paper depends on it.

    Read

  3. Light that only a tracer can find

    Needs research Light

    Caustics on the onsen’s floor and vault, glossy reflections of the lit house and light through the sheer all follow paths a rasterizer cannot aim at. The light lab finds them on the CPU, but the house has no runtime tracer, and WebGL offers no ray queries.

    Candidate moves

    • Precompute a caustic pattern in the lab and project it in the onsen, moved by the solver’s slopes.
    • Shade the light well’s aperture with glossy area lights, the cheapest specular path the house is missing.

    Read

Before changing anything

Read first

Keep intact

  • The homepage opens in 2D on every screen, 3D loads only on request, and any WebGL or model failure returns the 2D desk. No experiment may change that.
  • Every simulation advances on the scene’s active clock in fixed ticks, accepts at most 0.25 s per call and drops the rest. Paused, hidden, offscreen and reduced-motion scenes compose a still frame.
  • Every new material, pass or override draw joins program-warmup.mjs, or its first draw blocks the page.
  • A change meant only to save cost must change 0 pixels in seeded, paused-clock captures; a change of look needs a matched A/B, measured interleaved.
  • The scene renders through WebGL2 and three.js r164, with no compute shaders and no ray queries; GPU work is vertex and fragment passes.
  • Each technique’s notes say where it simplifies the paper it adapts. Never present an adaptation as a full reproduction or as the state of the art.

Keep these checks green

  • test/test_design_records.py This record’s schema, paths, named functions, links to the coastal home record, sources and watchlists.python -m unittest test.test_design_records
  • test/light-lab.test.mjs The light lab’s optics against Fresnel and Snell, its water hits, and agreement between the two estimators.node --test test/light-lab.test.mjs
  • test/coastal-physics.test.mjs Wave derivatives, slope-energy accounting, water Fresnel and La Jolla’s sun.node --test test/coastal-physics.test.mjs
  • test/coast-wind.test.mjs The coast’s breeze against the station means, its gust fronts, the wind sea and the planting’s sway.node --test test/coast-wind.test.mjs
  • test/onsen-water.test.mjs Conservation, reflecting boundaries, energy decay and the hand’s coupling in the pool.node --test test/onsen-water.test.mjs
  • test/steam-transport.test.mjs Steam transport across frame rates, positive diffusion and Beer–Lambert composition.node --test test/steam-transport.test.mjs
  • test/curtain-cloth.test.mjs Cloth strain, stability, determinism, sleep and wake, and the openness model.node --test test/curtain-cloth.test.mjs test/curtain-schedule.test.mjs
  • test/skin-diffusion.test.mjs The diffusion integral’s normalization, limits and curvature.node --test test/skin-diffusion.test.mjs
  • test/coastal-lift-rig.test.mjs The lifts’ reach, contacts and head clearances on every avatar.node --test test/coastal-lift-rig.test.mjs test/coastal-gym-session.test.mjs test/coastal-training.test.mjs
  • test/visual/desk-scene.spec.js Nonblank WebGL, the rooms, recovery and reduced motion in a real browser.npm.cmd run test:visual:scene

Sources

  1. Eric Veach and Leonidas J. Guibas. Metropolis Light Transport. Proceedings of SIGGRAPH 97, 65–76, 1997. doi.org/10.1145/258734.258775
  2. Csaba Kelemen, László Szirmay-Kalos, György Antal and Ferenc Csonka. A Simple and Robust Mutation Strategy for the Metropolis Light Transport Algorithm. Computer Graphics Forum 21(3), 531–540, Eurographics 2002. doi.org/10.1111/1467-8659.t01-1-00703
  3. Eric Veach. Robust Monte Carlo Methods for Light Transport Simulation. PhD thesis, Stanford University, 1997. graphics.stanford.edu/papers/veach_thesis/
  4. Matt Pharr, Wenzel Jakob and Greg Humphreys. Physically Based Rendering, 3rd edition, Morgan Kaufmann, 2016, section 16.4, Metropolis Light Transport. pbr-book.org/3ed-2018/Light_Transport_III_Bidirectional_Methods/Metro...
  5. Wenzel Jakob and Steve Marschner. Manifold Exploration: A Markov Chain Monte Carlo Technique for Rendering Scenes with Difficult Specular Transport. ACM Transactions on Graphics 31(4), article 58, SIGGRAPH 2012. doi.org/10.1145/2185520.2185554
  6. Tizian Zeltner, Iliyan Georgiev and Wenzel Jakob. Specular Manifold Sampling for Rendering High-Frequency Caustics and Glints. ACM Transactions on Graphics 39(4), article 149, SIGGRAPH 2020. doi.org/10.1145/3386569.3392408
  7. Guillaume Loubet, Tizian Zeltner, Nicolas Holzschuch and Wenzel Jakob. Slope-Space Integrals for Specular Next Event Estimation. ACM Transactions on Graphics 39(6), article 239, SIGGRAPH Asia 2020. doi.org/10.1145/3414685.3417811
  8. Thomas Müller, Markus Gross and Jan Novák. Practical Path Guiding for Efficient Light-Transport Simulation. Computer Graphics Forum 36(4), 91–100, EGSR 2017. doi.org/10.1111/cgf.13227
  9. Bartlomiej Wronski. Volumetric Fog: Unified Compute Shader-Based Solution to Atmospheric Scattering. SIGGRAPH 2014 course, Advances in Real-Time Rendering in 3D Graphics and Games. bartwronski.com/wp-content/uploads/2014/08/bwronski_volumetric_fog_si...
  10. Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt. Real-Time Polygonal-Light Shading with Linearly Transformed Cosines. ACM Transactions on Graphics 35(4), article 41, SIGGRAPH 2016. doi.org/10.1145/2897824.2925895
  11. Jiawen Chen, Ilya Baran, Frédo Durand and Wojciech Jarosz. Real-Time Volumetric Shadows using 1D Min-Max Mipmaps. ACM Symposium on Interactive 3D Graphics and Games (I3D), 39–46, 2011. doi.org/10.1145/1944745.1944752
  12. Ravi Ramamoorthi and Pat Hanrahan. An Efficient Representation for Irradiance Environment Maps. Proceedings of SIGGRAPH 2001, 497–500. doi.org/10.1145/383259.383317
  13. Zander Majercik, Jean-Philippe Guertin, Derek Nowrouzezahrai and Morgan McGuire. Dynamic Diffuse Global Illumination with Ray-Traced Irradiance Fields. Journal of Computer Graphics Techniques 8(2), 1–30, 2019. jcgt.org/published/0008/02/01/
  14. Matt Pharr, Wenzel Jakob and Greg Humphreys. Physically Based Rendering, 4th edition, MIT Press, 2023, section 7.3, Bounding Volume Hierarchies. www.pbr-book.org/4ed/Primitives_and_Intersection_Acceleration/Boundin...
  15. Michał Iwanicki and Peter-Pike Sloan. Ambient Dice. Eurographics Symposium on Rendering 2017, Experimental Ideas & Implementations, 19–29. doi.org/10.2312/sre.20171191
  16. Ari Silvennoinen and Jaakko Lehtinen. Real-time Global Illumination by Precomputed Local Reconstruction from Sparse Radiance Probes. ACM Transactions on Graphics 36(6), article 230, SIGGRAPH Asia 2017. doi.org/10.1145/3130800.3130852
  17. Simon Rodriguez, Thomas Leimkühler, Siddhant Prakash, Chris Wyman, Peter Shirley and George Drettakis. Glossy Probe Reprojection for Interactive Global Illumination. ACM Transactions on Graphics 39(6), article 237, SIGGRAPH Asia 2020. doi.org/10.1145/3414685.3417823
  18. Jorge Jimenez, Xian-Chun Wu, Angelo Pesce and Adrian Jarabo. Practical Realtime Strategies for Accurate Indirect Occlusion. Activision technical memo ATVI-TR-16-01, 2016, presented in the SIGGRAPH 2016 course Physically Based Shading in Theory and Practice. www.activision.com/cdn/research/PracticalRealtimeStrategiesTRfinal.pdf
  19. Olivier Therrien, Yannick Levesque and Guillaume Gilet. Screen Space Indirect Lighting with Visibility Bitmask. The Visual Computer 39(11), 5925–5936, 2023. doi.org/10.1007/s00371-022-02703-y
  20. Mark Finch. Effective Water Simulation from Physical Models. In GPU Gems, edited by Randima Fernando, chapter 1, Addison-Wesley, 2004. developer.nvidia.com/gpugems/gpugems/part-i-natural-effects/chapter-1...
  21. Eric Bruneton, Fabrice Neyret and Nicolas Holzschuch. Real-time Realistic Ocean Lighting using Seamless Transitions from Geometry to BRDF. Computer Graphics Forum 29(2), 487–496, Eurographics 2010. doi.org/10.1111/j.1467-8659.2009.01618.x
  22. Jerry Tessendorf. Simulating Ocean Water. SIGGRAPH course notes, revised 1999–2004. jtessen.people.clemson.edu/reports/papers_files/coursenotes2004.pdf
  23. David Algis, Bérenger Bramas, Emmanuelle Darles and Lilian Aveneau. Arc Blanc: a real time ocean simulation framework. Journal of Computer Graphics Techniques 14(1), 70–115, 2025. jcgt.org/published/0014/01/05/
  24. Willard J. Pierson and Lionel Moskowitz. A proposed spectral form for fully developed wind seas based on the similarity theory of S. A. Kitaigorodskii. Journal of Geophysical Research 69, 1964. doi.org/10.1029/JZ069i024p05181
  25. Charles Cox and Walter Munk. Measurement of the Roughness of the Sea Surface from Photographs of the Sun’s Glitter. Journal of the Optical Society of America 44, 1954. doi.org/10.1364/JOSA.44.000838
  26. Edward C. Monahan and Iognáid Ó Muircheartaigh. Optimal Power-Law Description of Oceanic Whitecap Coverage Dependence on Wind Speed. Journal of Physical Oceanography 10, 1980. doi.org/10.1175/1520-0485%281980%29010%3C2094:OPLDOO%3E2.0.CO;2
  27. Stefan Jeschke, Christian Hafner, Nuttapong Chentanez, Miles Macklin, Matthias Müller-Fischer and Chris Wojtan. Making Procedural Water Waves Boundary-aware. Computer Graphics Forum 39(8), 47–54, SCA 2020. doi.org/10.1111/cgf.14100
  28. Jonathan Dupuy and Eric Bruneton. Real-time Animation and Rendering of Ocean Whitecaps. SIGGRAPH Asia 2012 Technical Briefs, article 15. doi.org/10.1145/2407746.2407761
  29. Stefan Jeschke, Tomáš Skřivan, Matthias Müller-Fischer, Nuttapong Chentanez, Miles Macklin and Chris Wojtan. Water Surface Wavelets. ACM Transactions on Graphics 37(4), article 94, SIGGRAPH 2018. doi.org/10.1145/3197517.3201336
  30. Christopher J. Horvath. Empirical Directional Wave Spectra for Computer Graphics. Proceedings of the Symposium on Digital Production (DigiPro), 29–39, 2015. doi.org/10.1145/2791261.2791267
  31. Nuttapong Chentanez and Matthias Müller. Real-time Simulation of Large Bodies of Water with Small Scale Details. Symposium on Computer Animation, 197–206, 2010. doi.org/10.2312/SCA/SCA10/197-206
  32. Stefan Jeschke and Chris Wojtan. Generalizing Shallow Water Simulations with Dispersive Surface Waves. ACM Transactions on Graphics 42(4), article 83, SIGGRAPH 2023. doi.org/10.1145/3592098
  33. Nuttapong Chentanez, Matthias Müller and Tae-Yong Kim. Coupling 3D Eulerian, Heightfield and Particle Methods for Interactive Simulation of Large Scale Liquid Phenomena. IEEE Transactions on Visualization and Computer Graphics 21(10), 1116–1128, 2015, first presented at SCA 2014. doi.org/10.1109/TVCG.2015.2449303
  34. Jos Stam. Stable Fluids. Proceedings of SIGGRAPH 99, 121–128, 1999. doi.org/10.1145/311535.311548
  35. Ronald Fedkiw, Jos Stam and Henrik Wann Jensen. Visual Simulation of Smoke. Proceedings of SIGGRAPH 2001, 15–22. doi.org/10.1145/383259.383260
  36. Ziyin Qu, Xinxin Zhang, Ming Gao, Chenfanfu Jiang and Baoquan Chen. Efficient and Conservative Fluids Using Bidirectional Mapping. ACM Transactions on Graphics 38(4), article 128, SIGGRAPH 2019. doi.org/10.1145/3306346.3322945
  37. Theodore Kim, Nils Thürey, Doug James and Markus Gross. Wavelet Turbulence for Fluid Simulation. ACM Transactions on Graphics 27(3), article 50, SIGGRAPH 2008. doi.org/10.1145/1360612.1360649
  38. Jonas Zehnder, Rahul Narain and Bernhard Thomaszewski. An Advection-Reflection Solver for Detail-Preserving Fluid Simulation. ACM Transactions on Graphics 37(4), article 85, SIGGRAPH 2018. doi.org/10.1145/3197517.3201324
  39. NOAA National Data Buoy Center. Station LJPC1, La Jolla, CA, hourly standard meteorological records 2023–2025. www.ndbc.noaa.gov/station_page.php?station=ljpc1
  40. G. I. Taylor. The Spectrum of Turbulence. Proceedings of the Royal Society A 164, 1938. doi.org/10.1098/rspa.1938.0032
  41. Robert Bridson, Jim Hourihan and Marcus Nordenstam. Curl-Noise for Procedural Fluid Flow. ACM Transactions on Graphics 26(3), article 46, SIGGRAPH 2007. doi.org/10.1145/1276377.1276435
  42. Emmanuel de Langre. Effects of Wind on Plants. Annual Review of Fluid Mechanics 40, 2008. doi.org/10.1146/annurev.fluid.40.111406.102135
  43. Steven Vogel. Drag and Reconfiguration of Broad Leaves in High Winds. Journal of Experimental Botany 40, 1989. doi.org/10.1093/jxb/40.8.941
  44. Charlotte Py, Emmanuel de Langre and Bruno Moulia. A frequency lock-in mechanism in the interaction between wind and crop canopies. Journal of Fluid Mechanics 568, 2006. doi.org/10.1017/S0022112006002667
  45. Chris Wellons. Prospecting for Hash Functions, 2018. nullprogram.com/blog/2018/07/31/
  46. Julien Diener, Mathieu Rodriguez, Lionel Baboud and Lionel Reveret. Wind Projection Basis for Real-Time Animation of Trees. Computer Graphics Forum 28(2), 533–540, Eurographics 2009. doi.org/10.1111/j.1467-8659.2009.01393.x
  47. Ralf Habel, Alexander Kusternig and Michael Wimmer. Physically Guided Animation of Trees. Computer Graphics Forum 28(2), 523–532, Eurographics 2009. doi.org/10.1111/j.1467-8659.2009.01391.x
  48. Klemens Jahrmann and Michael Wimmer. Responsive Real-Time Grass Rendering for General 3D Scenes. ACM Symposium on Interactive 3D Graphics and Games (I3D), article 6, 2017. doi.org/10.1145/3023368.3023380
  49. NOAA Global Monitoring Division. General Solar Position Calculations. gml.noaa.gov/grad/solcalc/solareqns.PDF
  50. Lukas Hosek and Alexander Wilkie. An Analytic Model for Full Spectral Sky-Dome Radiance. ACM Transactions on Graphics 31(4), article 95, SIGGRAPH 2012. doi.org/10.1145/2185520.2185591
  51. Sébastien Hillaire. A Scalable and Production Ready Sky and Atmosphere Rendering Technique. Computer Graphics Forum 39(4), 13–22, EGSR 2020. doi.org/10.1111/cgf.14050
  52. Eric Bruneton and Fabrice Neyret. Precomputed Atmospheric Scattering. Computer Graphics Forum 27(4), 1079–1086, EGSR 2008. doi.org/10.1111/j.1467-8659.2008.01245.x
  53. Miles Macklin, Matthias Müller and Nuttapong Chentanez. XPBD: Position-Based Simulation of Compliant Constrained Dynamics. Motion in Games (MIG), 49–54, 2016. doi.org/10.1145/2994258.2994272
  54. Miles Macklin, Kier Storey, Michelle Lu, Pierre Terdiman, Nuttapong Chentanez, Stefan Jeschke and Matthias Müller. Small Steps in Physics Simulation. Symposium on Computer Animation (SCA), article 39, 2019. doi.org/10.1145/3309486.3340247
  55. Matthias Müller, Bruno Heidelberger, Marcus Hennix and John Ratcliff. Position Based Dynamics. Journal of Visual Communication and Image Representation 18(2), 109–118, 2007; first at VRIPHYS 2006. doi.org/10.1016/j.jvcir.2007.01.005
  56. Tae-Yong Kim, Nuttapong Chentanez and Matthias Müller-Fischer. Long Range Attachments: A Method to Simulate Inextensible Clothing in Computer Games. Symposium on Computer Animation (SCA), 305–310, 2012. doi.org/10.2312/SCA/SCA12/305-310
  57. Michael Keckeisen, Stefan Kimmerle, Bernhard Thomaszewski and Markus Wacker. Modelling Effects of Wind Fields in Cloth Animations. Journal of WSCG 12(1–3), 205–212, 2004. wscg.zcu.cz/wscg2004/Papers_2004_Full/C73.pdf
  58. Nathan A. Kotey, John L. Wright and Michael R. Collins. Determining Off-Normal Solar Optical Properties of Insect Screens. ASHRAE Transactions 115(1), 155–164, 2009. uwspace.uwaterloo.ca/handle/10012/11550
  59. Alejandro Conty Estevez and Christopher Kulla. Production Friendly Microfacet Sheen BRDF. Supplemental document to the talk Revisiting Physically Based Shading at Imageworks, SIGGRAPH 2017 course Physically Based Shading in Theory and Practice. blog.selfshadow.com/publications/s2017-shading-course/imageworks/s201...
  60. L. G. Henyey and J. L. Greenstein. Diffuse Radiation in the Galaxy. Astrophysical Journal 93, 70–83, 1941. doi.org/10.1086/144246
  61. Junqiu Zhu, Zahra Montazeri, Jean-Marie Aubry, Ling-Qi Yan and Andrea Weidlich. A Practical and Hierarchical Yarn-based Shading Model for Cloth. Computer Graphics Forum 42(4), EGSR 2023. doi.org/10.1111/cgf.14894
  62. Longhua Wu, Botao Wu, Yin Yang and Huamin Wang. A Safe and Fast Repulsion Method for GPU-based Cloth Self Collisions. ACM Transactions on Graphics 40(1), article 5, 2020. doi.org/10.1145/3430025
  63. Anka He Chen, Ziheng Liu, Yin Yang and Cem Yuksel. Vertex Block Descent. ACM Transactions on Graphics 43(4), article 116, SIGGRAPH 2024. doi.org/10.1145/3658179
  64. Marco Fratarcangeli, Valentina Tibaldo and Fabio Pellacini. Vivace: A Practical Gauss-Seidel Method for Stable Soft Body Dynamics. ACM Transactions on Graphics 35(6), article 214, SIGGRAPH Asia 2016. doi.org/10.1145/2980179.2982437
  65. Minchen Li, Danny M. Kaufman and Chenfanfu Jiang. Codimensional Incremental Potential Contact. ACM Transactions on Graphics 40(4), article 170, SIGGRAPH 2021. doi.org/10.1145/3450626.3459767
  66. Per H. Christensen and Brent Burley. Approximate Reflectance Profiles for Efficient Subsurface Scattering. Pixar Technical Memo 15-04, 2015. research.pixar.com/docs/2015.TechnicalReport.CB.pdf
  67. Jorge Jimenez, Károly Zsolnai, Adrian Jarabo, Christian Freude, Thomas Auzinger, Xian-Chun Wu, Javier von der Pahlen, Michael Wimmer and Diego Gutierrez. Separable Subsurface Scattering. Computer Graphics Forum 34(6), 188–197, 2015. doi.org/10.1111/cgf.12529
  68. Xi M. Chen, Timothy Lambert and Eric Penner. Pre-Integrated Deferred Subsurface Scattering. ACM SIGGRAPH 2014 Posters. doi.org/10.1145/2614217.2614248
  69. Tiantian Xie, Marc Olano, Brian Karis and Krzysztof Narkowicz. Real-time Subsurface Scattering with Single Pass Variance-guided Adaptive Importance Sampling. Proceedings of the ACM on Computer Graphics and Interactive Techniques 3(1), 2020. doi.org/10.1145/3384536
  70. James T. Kajiya and Timothy L. Kay. Rendering Fur with Three Dimensional Textures. Computer Graphics 23(3), 271–280, SIGGRAPH 1989. doi.org/10.1145/74334.74361
  71. Stephen R. Marschner, Henrik Wann Jensen, Mike Cammarano, Steve Worley and Pat Hanrahan. Light Scattering from Human Hair Fibers. ACM Transactions on Graphics 22(3), 780–791, SIGGRAPH 2003. doi.org/10.1145/882262.882345
  72. Thorsten Scheuermann. Practical Real-Time Hair Rendering and Shading. ACM SIGGRAPH 2004 Sketches, 147. doi.org/10.1145/1186223.1186408
  73. Anton S. Kaplanyan, Stephen Hill, Anjul Patney and Aaron Lefohn. Filtering Distributions of Normals for Shading Antialiasing. High Performance Graphics, 151–162, 2016. doi.org/10.2312/hpg.20161201
  74. Yusuke Tokuyoshi and Anton S. Kaplanyan. Improved Geometric Specular Antialiasing. ACM SIGGRAPH Symposium on Interactive 3D Graphics and Games (I3D), 2019. doi.org/10.1145/3306131.3317026
  75. Matt Jen-Yuan Chiang, Benedikt Bitterli, Chuck Tappan and Brent Burley. A Practical and Controllable Hair and Fur Model for Production Path Tracing. Computer Graphics Forum 35(2), 275–283, 2016. doi.org/10.1111/cgf.12830
  76. Arno Zinke, Cem Yuksel, Andreas Weber and John Keyser. Dual Scattering Approximation for Fast Multiple Scattering in Hair. ACM Transactions on Graphics 27(3), article 32, SIGGRAPH 2008. doi.org/10.1145/1360612.1360631
  77. Deepak Tolani, Ambarish Goswami and Norman I. Badler. Real-Time Inverse Kinematics Techniques for Anthropomorphic Limbs. Graphical Models 62(5), 353–388, 2000. doi.org/10.1006/gmod.2000.0528
  78. Frank Thomas and Ollie Johnston. Disney Animation: The Illusion of Life. Abbeville Press, New York, 1981. openlibrary.org/isbn/0896592324
  79. John Lasseter. Principles of Traditional Animation Applied to 3D Computer Animation. Proceedings of SIGGRAPH 87, 35–44, 1987. doi.org/10.1145/37401.37407
  80. Tomás Lozano-Pérez and Michael A. Wesley. An Algorithm for Planning Collision-Free Paths Among Polyhedral Obstacles. Communications of the ACM 22(10), 560–570, 1979. doi.org/10.1145/359156.359164
  81. Andreas Aristidou and Joan Lasenby. FABRIK: A fast, iterative solver for the Inverse Kinematics problem. Graphical Models 73(5), 243–260, 2011. doi.org/10.1016/j.gmod.2011.05.003
  82. Sebastian Starke, Yiwei Zhao, Taku Komura and Kazi Zaman. Local Motion Phases for Learning Multi-Contact Character Movements. ACM Transactions on Graphics 39(4), article 54, SIGGRAPH 2020. doi.org/10.1145/3386569.3392450
  83. Xue Bin Peng, Ze Ma, Pieter Abbeel, Sergey Levine and Angjoo Kanazawa. AMP: Adversarial Motion Priors for Stylized Physics-Based Character Control. ACM Transactions on Graphics 40(4), article 144, SIGGRAPH 2021. doi.org/10.1145/3450626.3459670
  84. Stelian Coros, Andrej Karpathy, Ben Jones, Lionel Reveret and Michiel van de Panne. Locomotion Skills for Simulated Quadrupeds. ACM Transactions on Graphics 30(4), article 59, SIGGRAPH 2011. doi.org/10.1145/2010324.1964954
  85. He Zhang, Sebastian Starke, Taku Komura and Jun Saito. Mode-Adaptive Neural Networks for Quadruped Motion Control. ACM Transactions on Graphics 37(4), article 145, SIGGRAPH 2018. doi.org/10.1145/3197517.3201366
  86. Eunjung Ju, Jungdam Won, Jehee Lee, Byungkuk Choi, Junyong Noh and Min Gyu Choi. Data-Driven Control of Flapping Flight. ACM Transactions on Graphics 32(5), article 151, 2013, presented at SIGGRAPH 2014. doi.org/10.1145/2516971.2516976
  87. Takafumi Saito and Tokiichiro Takahashi. Comprehensible Rendering of 3-D Shapes. Computer Graphics 24(4), 197–206, SIGGRAPH 1990. doi.org/10.1145/97880.97901
  88. Doug DeCarlo, Adam Finkelstein, Szymon Rusinkiewicz and Anthony Santella. Suggestive Contours for Conveying Shape. ACM Transactions on Graphics 22(3), 848–855, SIGGRAPH 2003. doi.org/10.1145/882262.882354
  89. Wenwu Yang, Hock-Soon Seah, Quan Chen, Hong-Ze Liew and Daniel Sýkora. FTP-SC: Fuzzy Topology Preserving Stroke Correspondence. Computer Graphics Forum 37(8), 125–135, SCA 2018. doi.org/10.1111/cgf.13518
  90. Pierre Bénard, Jingwan Lu, Forrester Cole, Adam Finkelstein and Joëlle Thollot. Active Strokes: Coherent Line Stylization for Animated 3D Models. Symposium on Non-Photorealistic Animation and Rendering (NPAR), 37–46, 2012. doi.org/10.2312/PE/NPAR/NPAR12/037-046
  91. Forrester Cole, Aleksey Golovinskiy, Alex Limpaecher, Heather Stoddart Barros, Adam Finkelstein, Thomas Funkhouser and Szymon Rusinkiewicz. Where Do People Draw Lines? ACM Transactions on Graphics 27(3), article 88, SIGGRAPH 2008. doi.org/10.1145/1360612.1360687
  92. John Amanatides and Andrew Woo. A Fast Voxel Traversal Algorithm for Ray Tracing. Eurographics 1987 Technical Papers. doi.org/10.2312/egtp.19871000
  93. Epic Games. Using Spring Arm Components in Unreal Engine, Unreal Engine documentation. dev.epicgames.com/documentation/en-us/unreal-engine/using-spring-arm-...
  94. Nathan Reed. Depth Precision Visualized, 2015. www.reedbeta.com/blog/depth-precision-visualized/
  95. Thomas Oskam, Robert W. Sumner, Nils Thuerey and Markus Gross. Visibility Transition Planning for Dynamic Camera Control. Symposium on Computer Animation (SCA), 55–65, 2009. doi.org/10.1145/1599470.1599478
  96. Christophe Lino and Marc Christie. Intuitive and Efficient Camera Control with the Toric Space. ACM Transactions on Graphics, SIGGRAPH 2015. doi.org/10.1145/2766965
  97. Jonathan Richard Shewchuk. Triangle: A Two-Dimensional Quality Mesh Generator and Delaunay Triangulator. www.cs.cmu.edu/~quake/triangle.html
  98. Z3lvs. Eroded sandstone badlands and sea cliffs looking south toward La Jolla, Torrey Pines State Natural Reserve. Wikimedia Commons, 2021 (CC0). commons.wikimedia.org/wiki/File:Eroded_sandstone_badlands_and_sea_cli...
  99. Stch2022. Overlooking the steep Torrey Sandstone cliffs of Torrey Pines State Natural Reserve and Black’s Beach below. Wikimedia Commons (CC0). commons.wikimedia.org/wiki/File:Overlooking_the_steep_Torrey_Sandston...
  100. Andrek02. La Jolla 005 - sea cave. Wikimedia Commons, 2022 (CC0). commons.wikimedia.org/wiki/File:La_Jolla_005_-_sea_cave.jpg
  101. JiriMatejicek. San Diego La Jolla Goldfish Point. Wikimedia Commons, 2019 (CC BY-SA 4.0). commons.wikimedia.org/wiki/File:San_Diego_La_Jolla_Goldfish_Point.jpg
  102. Ncysea. Torrey Pines Gliderport 1. Wikimedia Commons, 2020 (CC BY-SA 4.0). commons.wikimedia.org/wiki/File:Torrey_Pines_Gliderport_1.jpg
  103. Guillaume Cordonnier, Eric Galin, James Gain, Bedrich Benes, Eric Guérin, Adrien Peytavie and Marie-Paule Cani. Authoring Landscapes by Combining Ecosystem and Terrain Erosion Simulation. ACM Transactions on Graphics 36(4), article 134, SIGGRAPH 2017. doi.org/10.1145/3072959.3073667
  104. Axel Paris, Eric Galin, Adrien Peytavie, Eric Guérin and James Gain. Terrain Amplification with Implicit 3D Features. ACM Transactions on Graphics 38(5), article 147, 2019. doi.org/10.1145/3342765
  105. Wikipedia. Banked turn, on the bank angle of a coordinated turn. en.wikipedia.org/wiki/Banked_turn

Compiled on October 16 to 18, 2026 by Anthropic’s Claude from the code, the scene notes and the coastal home record, for Sirui Tao to review. Every citation was checked against its DOI record, its publisher’s page or its authors’ page.