# Shared navigation

The lab defaults to Walk. The same controller is used by every scene and by both actual WebGPU and direct-light fallback. The standalone Framework overview does not start a renderer.

- Click the scene to focus it and capture the mouse for looking.
- W/S move forward/backward along the horizontal projection of the view. A/D turn left/right in place at 90° per second. Hold W while turning to follow a curve.
- Shift raises speed from 3.2 to 7.2 world units per second.
- Escape releases mouse capture, clears movement and returns keyboard focus to the page.
- Orbit switches back to drag-to-orbit and scroll-to-zoom.

Movement accelerates and decelerates smoothly using analytic integration. Turning does not add sideways movement or increase forward speed. The lower-level motion helper still supports normalized strafe inputs for other hosts. Time steps are capped at 100ms after a stall; common frame rates from 10 to 144Hz produce the same travel distance. Forward movement does not gain altitude when looking up or down.

Keyboard movement is active only while the scene has focus or owns the mouse lock. Inputs, sliders, buttons, editable content, composition input and platform shortcuts are not captured. Blur, tab visibility changes, pointer-lock loss, scene/preset changes and disposal clear held keys and velocity. Taking control interrupts the camera rail.

When mouse capture is unavailable in an embedded view, the scene offers drag-to-look and WASD while focused. That is the same movement controller, not a separate renderer path. Touch dragging can also look around, but this first version does not add a touch movement joystick.

Navigation preserves eye height. The Hillside sanctuary opts into authored planar floor areas and obstacle sliding, including upper-gallery areas and body clearance. Other reference scenes remain free. Gravity, floor following and stair stepping are not implemented. See [WORLD-BOUNDARIES.md](WORLD-BOUNDARIES.md).

The implementation lives in src/framework/navigation.js. The framework owns controller installation and cleanup; the app owns Walk/Orbit buttons and help text. Movement math has deterministic speed/turning/frame-rate tests. Browser commissioning checks real keys, focus boundaries, mouse look, Escape and both rendering backends.

## All 3D hosts

The six lab worlds, the first-room example and the World Library's arcade/column
previews use `createWalkController`: W/S move, A/D turn, Shift boosts, and Escape
releases focus and capture. All default to Walk and expose Orbit and reset buttons.
The library retains the selected Walk/Orbit mode when changing specimens or bay
counts. In a focused specimen, Escape releases interaction first; a subsequent
Escape outside the canvas returns to the collection. Switching mode, replacing a
preview and leaving its page clear held input and dispose controller listeners.
Material channel images and teaching diagrams are not navigable 3D scenes.

Shared controls do not imply shared physics: the sanctuary has authored containment;
the earlier references, starter room and standalone specimens retain free planar
movement. The library's ground is an inspection stage, not a walkable world extension.

The lab and Framework scene gallery use one `sceneGroups` catalog. **Presentable
worlds** contains the sanctuary, lantern passage and woven atrium; a divider precedes
**Early samples & lighting studies**, containing the quiet arcade, light chamber
and colour study. Original geometry and reference identifiers are preserved.
