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.
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.
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.
closer · magnifies1.0× = tight fit · room around →
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.
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.
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.
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×.
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.
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.
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.
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.
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.
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.
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 moment
Role
Notes
Investigation load
intro
Wide shot of cups, scale, thermometer, baths.
Fill cups, place on scale
working
Medium pitch — see fill depth.
Read scale mass
instrument → Continue
Top-facing digital display — angled-down camera, pitch 50–70°, orbit target on scale.
Read starting temp (each cup)
instrument → Continue
Vertical thermometer face — near-horizontal camera, pitch 10–25°, orbit target on the scale's middle tick. One step per probe (R6).
Mix + insert probe
working
Back to the bench for the pour.
Watch temperature stabilise
phenomenon → Unpause
Same shallow-pitch framing as the starting-temp read — the thermometer is still vertical. Time paused until equilibrium.
Repeat trial
re-uses above
New condition, same camera sequence.
Compare trial values
compare
Side-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 moment
Role
Notes
Investigation load
intro
Wide shot of paper, pins, ruler, string loops.
Tape paper, gather tools
working
Slight perspective for tactile setup.
Place pin, trace circle
overhead
Near top-down so the circle reads true.
Measure radius with ruler
instrument → Continue
Tight on ruler tick. One step per measurement (R6).
Calculate eccentricity
(UI side)
No camera change; widget interaction.
Place two pins, trace ellipse
overhead
Same vantage; watch the ellipse form symmetrically.
Measure major axis, foci distance
instrument → Continue
One step per measurement.
Label features, add arrows
overhead
Student draws; camera fixed.
Compare circular vs elliptical
compare
Both 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_viewbefore 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.