What a camera controls
A camera is a control surface with a recorded cause for every frame. Across 495 renders with their camera parameters attached, which measured coordinates does it actually move, and which ones stay where they are?
1. The setup
The observatory renders a scene from sampled camera states, runs the Image Structure Reader and colour kernel on each render, and writes one row per frame joining the camera parameters to about forty measured coordinates. 528 renders exist across 21 runs; 495 in 17 runs have enough frames to fit (twelve or more). Three kinds of run appear: two controlled 48-camera sweeps of a generated scene, several sweeps of a staged Blender scene, and frames sampled from three animated films where the camera moves as the film moves.
Renders are deterministic, so there is no sampler spread to divide by. The comparable unit is the step: the median change in a coordinate between nearest-neighbour camera states, measured in standardised camera space. One step is what a small camera move already does.
2. Dose-response
Six renders along the orbit
The same scene at six azimuths, with the measured horizontal placement beneath each. This is what a control surface with authority looks like: turn the knob, the number follows.
3. The control map
| Control | Median |standardised slope| across coordinates |
|---|---|
| focal length | 0.398 |
| azimuth | 0.193 |
| elevation | 0.166 |
| distance | 0.149 |
| roll | 0.072 |
Focal length is the dominant knob by a factor of two over anything else, and roll barely registers. That is worth stating plainly because focal length is the parameter a director thinks of as "look" rather than "blocking", while the parameters that feel like composition, where you stand and how high you are, move these numbers less.
What is controlled
| Coordinate | R² | Range (steps) | Keeps after tone control | Dominant control |
|---|---|---|---|---|
| colour beta | 0.85 | 10.6 | 24% | focal_length_mm |
| colour coupling | 0.80 | 8.6 | 17% | focal_length_mm |
| midtone mass | 0.80 | 7.8 | n/a | focal_length_mm |
| colour independence | 0.78 | 8.7 | 26% | focal_length_mm |
| mass/colour alignment | 0.78 | 8.7 | 26% | focal_length_mm |
| hue entropy | 0.75 | 4.6 | 18% | focal_length_mm |
| mass dispersion | 0.73 | 5.5 | 12% | focal_length_mm |
| orientation stability | 0.65 | 9.5 | 84% | elevation_deg |
| diagonal energy | 0.65 | 6.7 | 74% | elevation_deg |
| highlight mass | 0.64 | 7.5 | n/a | focal_length_mm |
| saliency concentration | 0.63 | 8.1 | 42% | elevation_deg |
| structural thickness | 0.58 | 6.0 | 36% | focal_length_mm |
| edge/colour coupling | 0.55 | 7.1 | 74% | azimuth_deg |
| packing density | 0.54 | 6.7 | 40% | focal_length_mm |
| tonal hierarchy | 0.54 | 5.8 | 38% | focal_length_mm |
R² and retention in this table come from the pre-registered five-parameter linear fit. Section 7 gives the corrected figures under the full camera state.
What looked pinned
| Coordinate | R² | Range (steps) |
|---|---|---|
| primary focal dominance | 0.06 | 4.3 |
| focal dominance | 0.07 | 7.1 |
| compliance difference | 0.07 | 4.4 |
| scanpath restlessness | 0.13 | 2.6 |
| radial displacement | 0.15 | 5.0 |
| off-centre force | 0.16 | 5.4 |
| saliency divergence | 0.16 | 7.7 |
| cohesion | 0.18 | 5.2 |
| stance VCLI | 0.18 | 20.7 |
Nine coordinates sit below 0.2 explained variance under the pre-registered fit. That result does not survive. Section 7 shows that the threshold sat below the chance floor and that the fit omitted where the camera was aimed; with the aim included, all but one of these move into reach. The table is kept as recorded, and corrected below.
4. What runs through light, and what does not
Median retention is 84%. The structural coordinates keep nearly all of their response: vertical placement 97%, off-centre force 94%, orientation stability 91%, the Default Gravity Index 87%, horizontal placement 86%, dispersion 84%. The camera moves these by moving geometry, which is what one would hope.
The exceptions are the colour coordinates, and they are consistent: mass dispersion keeps 24%, hue entropy 33%, colour beta 51%, colour independence and mass/colour alignment 58% each. A camera move aimed at one of those is, in effect, a lighting change. If the lighting is fixed by the shot, they will be much harder to reach than their raw numbers suggest.
An earlier version of this section said the opposite, reporting that four fifths of the camera's authority ran through tone. That came from fitting only five camera parameters and leaving out where the camera was aimed. With part of the cause missing, tone stood in for it, and removing tone removed the proxy. Section 8 documents the correction.
5. One coordinate cannot move at all
field.void_fraction reads exactly 0.7200 in all 528 renders, across three scenes and three
films. It is not a property of the scenes. In the vendored instrument, the active mask is defined as
active = mass >= np.percentile(mass, 72)void_fraction = 1.0 - active.mean() |
which returns 1 − 0.28 for any image whatsoever. The instrument's own documentation says so, in the notan
module: "the blend's percentile void_fraction is a fixed ~0.72 on every work". The measure was superseded
there, and the replacement, notan.field_void, sits in the same table and does move (R² 0.33 under the
camera). The point is not that anyone was deceived: it is that a column which cannot vary was still exported per
render, where every consumer of that table would reasonably read it as a measurement. Checking whether a
coordinate can move at all costs one line and belongs at the top of any analysis.
6. Predictions
| # | Prediction | Verdict | Detail |
|---|---|---|---|
| P1a | distance back raises void fraction | untestable | the coordinate is a constant (see section 5) |
| P1b | distance back lowers mass dispersion | HELD | slope -0.29, rank correlation -0.33, R² 0.73 |
| P2 | azimuth moves horizontal placement | HELD | slope +0.63, rank correlation +0.66, R² 0.46 |
| P3 | elevation moves vertical placement | no | slope -0.16, rank correlation -0.14, R² 0.23 |
| P4 | focal length opposes distance on void fraction | untestable | the coordinate is a constant (see section 5) |
| P5 | roll drives orientation stability | no | slope +0.08, rank correlation +0.07, R² 0.65 |
| P6 | the Default Gravity Index is strongly camera-controlled | no | R² 0.24, classified weak |
| P7 | some coordinates are unreachable by camera | HELD | 9 pinned coordinates |
The one that matters most is P6. The Default Gravity Index, the composite that sounds most like composition, is only weakly camera-controlled: R² 0.24 across the controlled sweeps, against 0.85 for colour beta. Where you put the camera is not what mostly determines it.
azimuth 272° · elevation 15° · distance 11.0 · focal 81mm
azimuth 222° · elevation 38° · distance 11.0 · focal 36mm
The lowest and highest Default Gravity frames in the first sweep, with their camera parameters. The index differs by more than thirty points; the camera parameters do not differ in any simple way that predicts it.
7. Robustness, and two corrections
Three checks were run after the pre-registered analysis. Two of them overturned its conclusions, and both failures are the same species: a model of the cause that was too small.
The threshold was below chance
With 48 rows and five predictors, R² is not zero under the null. A permutation test puts the chance mean at 0.11 and the 95th percentile at 0.23. The plan called anything under 0.20 "pinned", which is below the chance ceiling, so that class could not mean what it said. Ten coordinates sat within chance under the original fit.
The camera's aim was missing
The sampler jitters the point the camera looks at, and that is part of the camera state. Adding the three aim coordinates, and quadratic terms for curved responses, changes the classification of 16 of 38 coordinates:
| Classification | Pre-registered (5 parameters, linear) | Full camera state (aim + curvature) |
|---|---|---|
| controlled | 15 | 25 |
| weak | 14 | 12 |
| at or below chance | 9 | 1 |
Off-centre force goes from 0.16 to 0.55 once the aim is included; radial displacement from 0.15 to 0.54. Only scanpath focal dominance remains indistinguishable from chance under the full model. The honest statement is therefore the opposite of the one the pre-registered analysis produced: almost nothing these instruments measure is beyond the camera's reach, and the apparent "pinned" set was mostly an artifact of describing the camera with five numbers instead of eight.
Roll barely turned
Prediction P5 asked whether roll drives orientation stability, and the answer was no. The sweep rolls through 9 degrees against 105 degrees of azimuth, so that prediction was underpowered rather than refuted. Orientation stability is strongly camera-controlled (R² 0.84 under the full state); it simply responds to other controls.
What survives unchanged
The dose-response relationships, the dominance of focal length, the constant coordinate in section 5, and the scene-specificity below are unaffected by these refits.
8. The map is scene-specific
| Group | Coordinates compared | Same class as the controlled sweeps | Share |
|---|---|---|---|
| scene sweeps (staged Blender scene) | 38 | 16 | 42% |
| film intervals (Spring, Charge, Sprite Fright) | 38 | 9 | 24% |
Carrying the classification from the controlled sweeps to the staged scene holds for 42% of coordinates, and to film frames for 24%. That is a limit worth stating loudly: "the camera controls X" is a statement about a scene, not about images. In the films the camera is not an independent variable at all, since content changes with every cut and move, so those runs can only corroborate or contradict.
9. What this says
- The camera is a real control surface. Coordinates follow the knobs monotonically, with rank correlations up to 0.82 in a single sweep, and 25 of 38 coordinates are controlled under the full camera state.
- Its strongest single knob is focal length, not position: twice the median influence of azimuth, five times that of roll.
- The control is mostly geometric. Structural coordinates keep 84% of their response with tone removed. Colour coordinates are the ones that ride on light, losing a third to a half.
- Almost nothing is beyond reach, once the camera's aim is counted as part of the camera. One coordinate out of 38 stays at chance.
- One exported coordinate is a constant. Check that a number can move before analysing what moves it.
- Chance is not zero. With 48 samples and five predictors, a null coordinate scores 0.11 on average. Thresholds have to be set above the noise floor, and mine was not.
- The map does not transfer between scenes without re-measurement.
Limits
The pre-registered classification used five camera parameters and a linear fit; the corrected one adds the aim point and quadratic terms. Neither is the true functional form, so both are descriptions rather than models of the renderer. The controlled sweeps are one generated scene, so "camera-controlled" means controlled in that geometry. Four runs with fewer than twelve frames were excluded, leaving 495 of 528 renders; the constant-coordinate check used all 528. Film frames are temporally correlated and their camera is not manipulated, so no significance is claimed for them. Removing the tonal channels is a statistical control, not an intervention: it estimates how much of the camera's effect travels with tone in this data, and cannot prove a causal path. Measurements are read as the observatory recorded them, using the vendored instrument at version 0.8; nothing was re-measured here. All statements are about coordinates, not about whether an image is good.
Method
Per run, camera parameters and coordinates are standardised, each coordinate is fitted on the five camera
parameters by ordinary least squares, and the multiple R², the standardised slopes and Spearman correlations are
recorded. Runs are pooled by taking medians across runs, never by pooling rows. The step is the median absolute
change between nearest-neighbour camera states in standardised camera space. Tone control refits each coordinate
after regressing out the three tonal mass channels. Classification thresholds, predictions and the exclusion rule
were fixed in ANALYSIS_PLAN.md before any result was computed. Data copies, scripts, per-run results
and the figures are kept in the project archive.