Camera presets

Twelve camera roles in six families. An author names a role instead of building a pose, and the framing solver turns it into a pitch, a distance and a field of view fitted to the objects on this bench. Within a family the roles share a direction and differ in how close they sit or what they frame.

Presets only set the starting vantage at each authored moment; the student can freely rotate, zoom, and pitch (mouse wheel / arrows / right-click drag) between them.

Roles — 12 · Families — 6 · Rules — 7 · Applied examples — 3

Choosing a role

Two questions pick the role. What does the step name: nothing (the whole scene), one object:, or a list of objects:? And from what angle should the student see it? Every role sits in exactly one cell.

Angle Whole scenenames nothing One objectobject: Several objectsobjects:
Opening27° intro — —
Low31° solver default — phenomenonphenomenon_close comparecompare_close
Working angle50° workingworking_close — —
High75° — — working_high
Top-down85° overhead — overhead_focusedoverhead_close
Head-onfaces the display — instrument —

How close each role sits

Distance is a multiple of the tight fit around the role’s targets, so the same role works on a small bench or a large one. Below 1.0× the camera sits inside the fit and magnifies; above it, the frame leaves room around the targets. When a role reads too far, step to its close variant rather than overriding the distance.

  1. phenomenon_close0.30×
  2. overhead_close0.50×
  3. working_close0.60×
  4. compare_close0.65×
  5. compare1.00×
  6. overhead_focused1.00×
  7. instrument1.05×
  8. working_high1.10×
  9. phenomenon1.15×
  10. working1.20×
  11. overhead1.30×
  12. intro1.60×

The twelve roles

Opening

The establishing shot. One role.

intro

Wide opening over the whole desk, slightly above eye level, so a fresh viewer takes in the full layout.

namesnothingpitch27°distance1.6×fov60°
Use for
The opening shot, or re-establishing the whole apparatus after a focused sequence.
Instead
Mid-sequence wide framing → working. Pulling out to intro between two close shots is jarring.

Working

The student’s working angle, slightly behind them. Most steps live here.

working

Mid-distance, scene-wide, at the angle someone takes when they reach forward to the desk. The default role.

namesnothingpitch50°distance1.2×fov55°
Use for
Placing objects, tilting beakers, any hands-on step that needs natural depth.
Instead
Readouts → instrument. Flat layouts → overhead.

working_close

Same angle as working, dollied in. The whole compact prop set stays in frame at near arm’s length.

namesnothingpitch50°distance0.6×fov55°
Use for
Careful manipulation of close-together objects; the step up from working.
Instead
One object → phenomenon or instrument. Spread-out props → stay on working.

working_high

Tilted up to 75° on a list of objects, to read displays mounted high while keeping the rig’s height readable.

namesobjectspitch75°distance1.1×fov50°
Use for
Column rigs, stacked supports, balance towers: setups where height carries the lesson.
Instead
Pure top-down → overhead_focused. Flat desk layouts → working.

Overhead

Top-down at 85°. The three differ only in what they fit and how close they sit.

overhead

Near-vertical view of the whole scene, with just enough tilt to tell heights from shadows.

namesnothingpitch85°distance1.3×fov50°
Use for
Planar work that only reads from above: drawing curves on paper, arranging compass rings.
Instead
A subset → overhead_focused. Tall apparatus → working_high.

overhead_focused

Top-down on a list of objects; everything else on the desk drops out of frame.

namesobjectspitch85°distance1.0×fov50°
Use for
A subset that must read from above without the rest of the desk.
Instead
The whole desk → overhead. Fine detail → overhead_close.

overhead_close

Tight top-down on a list of objects, well inside the fit: an aggressive close-up from above.

namesobjectspitch85°distance0.5×fov50°
Use for
Sub-centimetre detail from above: drawn curves, indicator marks, dials on horizontal faces.
Instead
A comfortable view of the same objects → overhead_focused. Vertical displays → instrument.

Instrument

Head-on to one display. One role.

instrument

Tight, head-on framing of one instrument’s display. The camera turns to face the object’s display anchor, so a vertical thermometer and a top-facing scale both read square.

namesobjectpitchfaces displaydistance1.05×fov40°
Use for
Scales, thermometers, probes, multimeters: when the reading itself is the moment.
Instead
No display anchor on the object → phenomenon, or an explicit pose.

Phenomenon

One object, no readout in frame. Fitted to the object’s own shape.

phenomenon

Close on one science object, generous enough that its whole form stays readable.

namesobjectpitch31° defaultdistance1.15×fov45°
Use for
A magnet on its own, a sample crystal, a flask after a reaction: the moment to look at this thing.
Instead
A meter readout → instrument. Two or more objects → compare.

phenomenon_close

Leans right in on one object, at 0.3× the fit: the tightest role in the library.

namesobjectpitch31° defaultdistance0.3×fov45°
Use for
Sniffing a sample, reading a small label, watching a subtle change on one small object.
Instead
Two or more objects → compare_close. Keep the whole set visible → working_close.

Compare

Several objects side by side, equal weight.

compare

Sized to fit every named object at the tight fit; unrelated props drop out of frame.

namesobjectspitch31° defaultdistance1.0×fov55°
Use for
Two cups at different temperatures; a row of three to five weighed samples or indicator tubes.
Instead
Sub-centimetre detail → compare_close. One object → phenomenon or instrument.

compare_close

Close-up on a small set of related objects, tight enough to read sub-centimetre features.

namesobjectspitch31° defaultdistance0.65×fov45°
Use for
Indicator-patch colours, fine markings on adjacent instruments.
Instead
A comfortable overview of the same set → compare. One object → phenomenon_close.

How an author names a role

A role is the preferred way to move the camera. The same role: works in every camera block: camera_ui: while the student acts, camera_op: while the simulation runs, zoom_in: on a button the student presses, or a camera step of its own. Fall back to explicit framing constraints only when no role fits.

The whole scene

Name nothing; the role fits every object on the bench.

camera_ui:
  role: working

One object

For instrument and the phenomenon family.

camera_op:
  role: instrument
  object: scale1

Several objects

For compare, working_high and the focused overheads.

camera_ui:
  role: compare
  objects: [cup_warm, cup_cool]

Rules — when each role applies

  1. Every authored vantage has a pedagogical reason.

    Don't add a preset because "the scene looks nicer from there". Add one because there is a specific thing the student must see. If you can't answer what must be visible in one sentence, the preset isn't earned.

  2. Pitch is chosen by the face being observed.

    Match the camera's pitch to the face the student reads: flat, top-facing surfaces (paper, top-facing digital scales) want the overhead family at 85°; volumetric objects (cups, coils) want the working angle at 50° for depth cues during a drag; vertical-face readouts (thermometer scales, upright dials) want a near-horizontal camera — a thermometer standing in a cup is unreadable from above. instrument handles this on its own by turning to face the object's display.

  3. Distance is chosen by the legibility requirement.

    If digits or needles must be read, the role must sit close enough to read them without further zoom. If an object must be grabbed, close enough to make it grab-size. Distance is a multiple of the fit around the targets, so pick the role by how close it sits: from phenomenon_close at 0.3× to intro at 1.6×.

  4. Name the objects; don't place the orbit target by hand.

    A role given object: or objects: centres the camera on them. Set an orbit_target by hand, in an explicit pose, only for a one-off composition no role covers. If the same composition keeps coming back, propose a role for it.

  5. Lerp durations communicate intent.

    Step-to-step: 300–400 ms, trackable. Opening intro → working: 1000–1500 ms, cinematic. Reading zoom-ins: 400–600 ms, slightly slow so the student registers their action caused it. Exits back to working: 250–350 ms, snap-back feel.

  6. Readings that would be illegible at a shared vantage get their own step.

    If two instruments are too far apart — or too small at one zoom — to read together, split them into separate steps. Each uses instrument, phenomenon or a close variant, with Continue or Unpause. Exit lerps back to working before the next step's preset takes over. Full rule in the authoring-patterns section.

  7. Student freedom is never suspended.

    After a preset lerps into place, the student can rotate, zoom, and tilt — even during paused_reading. Time is frozen, the camera isn't.

Applied examples

These three mappings were written in May 2026 against the first six roles, before the close, focused and high variants existed. They stay as worked examples of the rules; a mapping made today could reach for overhead_focused or compare_close where they fit better.

Applied — coil magnetic field

intro role

initial_view

Purpose

The wide shot the student sees on load. Orientation, not interaction — the camera lerps inward to a working angle on step 1.

Why this zoom

distance 2.77 m fits coil, battery, four compasses and every clip with breathing room. pitch 27° reads as "standing at the desk" — physically present, not schematic — priming a hands-on expectation.

What the student must see
  • Whole desk in one frame — nothing cropped.
  • Spatial relationships: coil centre, battery right, compasses back.
  • Enough empty surface to read as a room.
{ yaw: 90.3, pitch: 27.1, distance: 2.768, fov: 55 }
Applied instantly via the lesson script's initial_camera; step 1 lerps into setup_view over 1.2 s.
working role

setup_view

Purpose

The "doing work" angle — clip connections, compass placement. The camera rests here after the opening lerp and returns here after every observation.

Why this zoom

distance 0.70 m makes the coil and clip targets grab-sized (1:1 drag feel) while the far end of the coil stays in frame — no mid-task rotation needed. pitch 58° gives depth cues for clip placement while still revealing the flat desk for compass positioning.

What the student must see
  • Coil, both wire ends, battery terminals — all at once.
  • Clip home positions along the front edge.
  • Full compass-placement zone around the coil.
  • Enough desk that "where does this go?" needs no rotation.
{ yaw: 89.7, pitch: 57.9, distance: 0.698, fov: 50 }
Target of the opening cinematic lerp on step 1; implicit base that reading_view returns to on Unpause (steps 9, 15).
phenomenon role

reading_view

Purpose

Active only on reading steps, when the circuit is closed and compass needles align. The only preset that recentres the orbit target — onto the compass cluster rather than the coil, because the needles are the object of study.

Why this zoom

distance 0.42 m: each compass face fills a chunk of screen so needle direction is legible with no further zoom. pitch 65° (steeper than working) minimises perspective skew across four faces at different depths — at shallow angle their needles would skew unevenly.

What the student must see
  • All four compasses with equal emphasis — none dominates.
  • Needle orientation distinguishable, including subtle differences.
  • Coil in the background — needle deflection must tie to the energised coil.
  • Attached clip–battery connection — "why is this happening" stays in frame.
{ orbit_target: [0.019, 0.770, -0.104], yaw: 89.4, pitch: 65.4, distance: 0.424, fov: 50 }
Applied on paused_reading steps 9 and 15. Transient — on Unpause the camera lerps back to setup_view over 300 ms.

Applied — warm + cool water energy transfer

Proposed mapping — not yet authored

Four roles, heavy on instrument

Dominated by numeric readings — mass on a scale, temperature on a thermometer — repeated across trials. Both readouts are small and sit in different places, so working can't serve them alone. The camera zooms into each instrument individually and returns to working between.

The mixture-temperature phase is time-dependent (digits keep changing until equilibrium). That's the one reading that uses phenomenon with time paused; everything else uses instrument with Continue.

Procedure momentRoleNotes
Investigation loadintroWide shot of cups, scale, thermometer, baths.
Fill cups, place on scaleworkingMedium pitch — see fill depth.
Read scale massinstrument → ContinueTop-facing digital display — angled-down camera, pitch 50–70°, orbit target on scale.
Read starting temp (each cup)instrument → ContinueVertical thermometer face — near-horizontal camera, pitch 10–25°, orbit target on the scale's middle tick. One step per probe (R6).
Mix + insert probeworkingBack to the bench for the pour.
Watch temperature stabilisephenomenon → UnpauseSame shallow-pitch framing as the starting-temp read — the thermometer is still vertical. Time paused until equilibrium.
Repeat trialre-uses aboveNew condition, same camera sequence.
Compare trial valuescompareSide-by-side framing of the two recorded readouts.
Vertical thermometer framing: per Rule R2, the thermometer's readout face is vertical — the camera pitch must be shallow (10–25°) so the scale reads head-on. An overhead or steep angle foreshortens the tick marks and makes it guesswork. This is the canonical non-flat instrument / phenomenon case.
Schema gap: Scale and starting-temperature readings are not time-dependent, so they need a Continue button (not Unpause). ui: button (description-only) covers this; the investigation can be authored against it.

Applied — orbital shapes

Circle portion authored (orbits.html); ellipse pass pending

Overhead-heavy, with compare at the end

The whole activity happens on butcher paper — flat surface, perspective distortion would undermine the learning. overhead dominates; students drop to slight perspective only for pushing pins. Measurements and shape comparisons need near-top-down so circles read as circles.

Procedure momentRoleNotes
Investigation loadintroWide shot of paper, pins, ruler, string loops.
Tape paper, gather toolsworkingSlight perspective for tactile setup.
Place pin, trace circleoverheadNear top-down so the circle reads true.
Measure radius with rulerinstrument → ContinueTight on ruler tick. One step per measurement (R6).
Calculate eccentricity(UI side)No camera change; widget interaction.
Place two pins, trace ellipseoverheadSame vantage; watch the ellipse form symmetrically.
Measure major axis, foci distanceinstrument → ContinueOne step per measurement.
Label features, add arrowsoverheadStudent draws; camera fixed.
Compare circular vs ellipticalcompareBoth drawings together, overhead, equal weight.
Note: No phenomenon role needed — nothing time-dependent. Pattern: setup → overhead for construction → repeated instrument measurements → compare for the pedagogical payoff.

Authoring patterns for future investigations

Rule

Split one step per reading

When to apply

When an investigation has multiple readings too far apart — or too small at any shared vantage — to be legible at once. Collapsing forces the student to zoom around (breaks flow) or squint (breaks trust). Split each reading into its own step.

The rule
  • One step per reading. Each gets its own step with its own zoom preset, tight enough to read without further zoom.
  • Continue or Unpause, never both. Continue when the reading is static, Unpause (paused_reading) when the value would keep changing if time ran.
  • Exit lerps back to working. Continue/Unpause lerps to setup_view before the next step's preset, giving a clean breathing moment between readings.
  • Keep the object in frame, not just the readout. Frame instrument and phenomenon together so the value ties to the physical thing, not an abstract dial.
  • Camera stays static during the reading. No mid-step animation; the vantage holds until the student acts.
What this is not
  • Not an excuse for a single "wide" zoom-in over multiple readings. If you need a magnifier to read it, so will the student.
  • Not a replacement for the notepad. The step frames the value; the notepad records it.
Schema today: ui: paused_reading (Unpause) + ui: button (Continue, description-only) cover both variants.