Ground Truth · the artifact is the signal
The Blade the Camera Bent
Photograph a fast propeller with a phone and the blades come out curved, sheared, or cut clean in half. People call it a glitch, a camera bug, a broken picture. It is the opposite of broken. The camera recorded the literal truth — it just didn't record it all at once.
A rolling-shutter CMOS sensor reads its rows one after another, top to bottom, a few microseconds apart. By the time the bottom row is read, the blade has moved. So each row catches the blade at a slightly later instant, and a straight blade images as a spiral. The bend isn't noise — it's a clock. Its exact shape encodes how fast the rows were read and how fast the prop was turning. Read the bend backward and you recover the numbers. Below, you do exactly that.
Line time τ
30.86 µs/row
full read 33.33 ms
Per-row bend k = ω·τ
1.94 mrad/row
120.0° across the frame
RPM recovered from the bend
600
you set 600 · fit, not echoed
Drag it up and watch the straight blade curl into a spiral. Faster spin, more bend — the bend is the speed.
How long the sensor takes to read all rows top-to-bottom. Slide it to 0 — a global shutter — and the blade snaps straight.
Each arm bends by the same per-row k — the spiral just repeats.
More rows over the same read time means a smaller τ per row.
The kinematics is one line. A straight radial blade at start angle θ₀, spinning at angular velocity ω = rpm·2π/60, imaged on sensor row y (rows counted from the top, each delayed by the line time τ), appears at angle
The slope of that imaged curve — angle per row — is the constant k = ω·τ. That single number is the clock. The right-hand canvas above renders the blade purely from this equation, row by row, as the red readout line sweeps down. The pink overlay is the prediction θ(y) drawn straight on top — they coincide because they're the same equation. Then the page does the inverse: it samples points off the rendered curve, fits their slope by least squares (knowing nothing about the inputs), recovers k, and divides by the known τ to print the RPM. It lands back on the number you set.
The check — the bend, read backward, in front of you
These figures update live with the sliders. The recovered RPM is not the input fed back: it is fit from the slope of the curve the sensor actually drew.
Slide the readout time to 0 and τ → 0, so k → 0 and the blade is straight: a global shutter has no clock to read. Run the kinematics headless: node research/the-blade-the-camera-bent/verify-the-blade-the-camera-bent.mjs — it recomputes the spiral, recovers k by an independent least-squares fit, and asserts every number on this page.
What's exactly true here, and what's idealised
Exactly true. The readout model is the documented one: a CMOS rolling shutter reads rows sequentially with a fixed per-line delay τ, so a feature present at angle θ₀ when row 0 is read is at θ₀ + ω·(y·τ) when row y is read. The slope of the imaged curve is therefore the constant ω·τ in radians per row, and the total skew across an N-row frame is ω·N·τ = ω·T_readout. The inversion is a clean linear fit — the curve is a line in (row, angle) space, so its slope recovers ω·τ exactly. This is pure kinematics; nothing is fudged.
When the spiral overlaps. Because each sensor row is read exactly once, the angle-versus-row fit is exact at any speed. But once the total bend passes ~180° the drawn spiral crosses itself on screen, and someone reading angles off a flat photo would see a curve that doubles back — they would have to unwrap the angle before fitting. The page flags that case ("> ½ turn… needs unwrap") rather than pretend a by-eye reading stays unambiguous. The overlap threshold is a genuine property of the measurement, not a rendering bug.
The model, named. This page models the idealised linear row-sequential readout — the standard model. A real photograph adds effects this instrument does not: each row integrates light over a finite exposure, so a fast blade is smeared (motion blur) rather than frozen at one instant; readout direction varies by sensor and crop mode (top-to-bottom, bottom-to-top, even sideways); and electronic-shutter readout can be non-uniform. The clean spiral here is the geometry under the blur, not a claim that a real frame has razor edges.
Free choices. The default reading uses 1080 rows and a 1/30 s (33.33 ms) full readout — a deliberately slow consumer-CMOS figure, in the range of horshack-dpreview's measured per-camera compilation, which spans roughly 1/15 s on the slowest typical stills sensors (some medium-format backs read even slower, ~1/3 s) down to a few milliseconds on fast-readout and stacked sensors. The corresponding line time τ ≈ 31 µs/row sits in the documented 5–35 µs band. Per-camera τ values are measured, not derived from first principles, and vary by sensor, resolution and crop mode — so treat the absolute τ here as representative. What is exact regardless of the chosen numbers is the relationship: the bend is ω·τ per row, and recovering one given the other is just division.
Not the wagon-wheel effect. That illusion (a wheel appearing to spin backward on film) is inter-frame temporal aliasing — the camera samples the motion too rarely between whole frames. This is intra-frame readout geometry — the distortion happens within a single exposure, because the one frame isn't captured at a single instant. Different mechanism, same lesson: a sampling process can write a faithful record that still misreports the motion.