# Kinetic — a study in movement

A single-file Three.js playground with a procedural 24-joint humanoid, constrained two-bone leg IK, world-locked ground contacts, and smoothly blended walk, run, and looping jump cycles.

## Run

Open `index.html` in a modern desktop or mobile browser. If your browser restricts local modules, serve this directory with `python3 -m http.server 8000` and open `http://localhost:8000`. No build or installation is required. An internet connection is needed for Three.js and OrbitControls, both pinned to **0.180.0** on jsDelivr.

## Controls

- **1 / 2 / 3** or the **Walk / Run / Jump** buttons: switch motions.
- **Space** or the round playback button: pause / resume.
- **S** or **Show skeleton**: toggle the bone and joint overlay.
- **R** or **Reset view**: restore the camera.
- **Playback speed**: adjust animation speed from 0.25× to 1.75×.
- **Mouse**: drag to orbit, scroll to zoom, right-drag to pan.
- **Touch**: one finger to orbit; two fingers to pinch-zoom and pan.

The camera follows actual forward travel; the ground grid remains world-fixed. Stance feet lock to heel/sole/toe pivots rather than sliding. Jump first slows down and gathers both feet, then crouches, takes off, follows a ballistic arc, and absorbs the landing. Switching away from jump while airborne waits until recovery before blending into the next gait. All motions loop. Use **Controls & rig notes** for the in-app reference.

Rendering uses capped pixel density, shared geometry/materials, and allocation-free IK math for a 60 fps desktop target. Actual frame rate depends on hardware. For diagnostics, `kinetic.inspect()` in the browser console reports joint angles, foot-lock error, and draw calls.
