workshop private

← all mechanics

Snap

mechanics · created 2026-10-12

A flying disc, where turn and fade are not two behaviours but one coefficient on either side of a sign change, divided by spin — so the 35.7 m that snap is worth to a flat release is worth 2.6 m to a thrower who re-aims for it, and three drivers of wildly different stability, each released on the angle that aims it, land within 4.4 m of each other.

physicssimulationgame-feelcanvastopdown

Drag off the tee to aim and power up, or hit throw. The only other controls are the ones a thrower actually has: which disc, how much snap, what angle the plate leaves on, and whether the nose is up or down.

The trace changes colour mid-flight. That is the whole creation, and it is not a styling choice — it is the sign of a number.

One division

A thrown disc is a gyroscope in a wind, and a gyroscope does not do what a torque tells it to do. It does what the torque tells it to do rotated ninety degrees, at a rate divided by how fast it is spinning:

dn/dt = τ⊥ / (I_z · ω_z)

n is the disc’s normal — the way “up” through its top points. The torque that matters is the pitching moment, because air arriving at an angle to the plate pushes harder on one half of it than the other, and that moment points along the disc’s right–left axis. Precession turns a pitch into a roll:

nose-DOWN moment  →  the disc banks RIGHT   (what the sport calls turn)
nose-UP   moment  →  the disc banks LEFT    (what the sport calls fade)

Banked, the lift tilts with the plate, and a tilted lift is a turn. So the flight path is the time-integral of a sign.

The sign is one coefficient

The pitching moment coefficient is a single curve in angle of attack:

C_M(α) = C_M0 + C_Mα·α + C_Mq·α|α| ,   C_M0 < 0

Below the crossing α* it is negative — nose down — and the disc turns right. Above α* it is positive and the disc fades left. There is no second mechanism. Turn and fade are the same coefficient on either side of one root, and “stability”, the number stamped on every disc ever sold, is a statement about where that root sits.

discC_M0C_MαC_Mqα*crossed atwidest rightlanded
understable driver−0.02050.1500.905.10°37% of the flight7.4 m5.3 m
neutral driver−0.01150.1601.202.97°30% of the flight0.0 m−14.9 m
overstable driver−0.00420.1701.601.18°21% of the flight0.0 m−21.0 m
midrange−0.00950.1651.352.45°28% of the flight0.0 m−13.9 m
putter−0.00700.1701.451.85°26% of the flight0.0 m−13.4 m

Three degrees of α separate a disc that turns over and never comes back from one that hooks left out of the thrower’s hand.

Nobody pitches the disc up. The air moves.

The thing I did not expect to be able to draw. A gyroscope holds its attitude in space, so across a flight the plate barely moves — and yet α climbs the whole way, crosses α*, and reverses the roll. Here is a neutral driver released dead flat at 26 m/s and 1400 rpm, column three being the plate’s own pitch against the horizon:

tspeedplate pitchflight pathαC_Mroll rate
0.0 s26.0 m/s10.0°10.0°0.0°−0.011510.1°/s right
1.0 s20.8 m/s9.8°8.9°0.9°−0.00885.4°/s right
1.5 s18.7 m/s9.4°7.3°2.1°−0.00412.1°/s right
2.0 s16.9 m/s8.8°5.2°3.6°+0.00321.4°/s left
3.0 s13.9 m/s7.7°0.1°7.6°0.03049.5°/s left
4.0 s11.3 m/s7.4°−5.8°13.2°0.089519.7°/s left
5.0 s9.5 m/s0.3°−17.9°18.2°0.160426.1°/s left
6.2 s11.7 m/s−32.4°−41.5°9.2°0.044911.5°/s left

Between release and five seconds in, the plate pitches ten degrees further down and α rises by eighteen. The disc never lifts its nose. The flight path tips out from under it — a disc that is falling is meeting air that arrives from below — and the angle between the plate and the air is what the coefficient is a function of. Fade is not something the disc starts doing at the end of a flight. It is the same torque that was turning it, arriving on the far side of a root the disc walked across without doing anything.

Taking the halves away

Same release, dead flat, with pieces of C_M deleted:

modelcarrywidest rightlandedbank at landing
the disc as it is88.0 m8.2 m4.3 m−52.5°
the α terms removed — a constant nose-down moment82.1 m24.6 m24.6 m+26.6°
C_M0 = 0 — the crossing dragged to α = 081.0 m0.0 m−14.8 m−50.9°
C_Mq = 0 — a straight C_M line91.0 m18.1 m18.1 m−12.2°
C_M = 0 — no pitching moment at all89.5 m0.0 m0.0 m0.0°

The last row is the one to sit with. A disc with no pitching moment flies dead straight, lands level, and goes almost as far as any of them — the flight that every beginner is trying to throw is the flight of a disc with the interesting physics switched off. Every shot shape in the sport is bought by spending glide on a torque, and the only question a thrower gets to answer is which direction to spend it in.

What snap is actually worth

This is the measurement I would not have guessed. Hold the release speed at 26 m/s — same arm, same disc, same flat release — and vary only the spin:

spincarrylandedflightbank at landing
600 rpm53.7 m11.6 m right2.78 s88.4°
1000 rpm66.5 m19.0 m right3.85 s45.9°
1400 rpm77.2 m25.0 m right4.98 s17.3°
1900 rpm87.0 m25.4 m right6.18 s−12.0°
2400 rpm89.4 m19.4 m right6.61 s−24.7°

35.7 m — sixty-seven percent more carry, and 3.83 s more air, from spin alone. At 600 rpm the divisor is so small that the disc rolls up onto its edge (88° of bank) and stops being a wing; at 2400 it holds the plate flat and flies. Every coaching video that says snap is distance is reading this table.

Now let the thrower do the obvious thing and re-aim for the disc they actually have — at each spin, the release angle that lands it on the line:

spinhyzer that lands on the linecarry
700 rpm8.8°84.9 m
1100 rpm3.7°86.1 m
1500 rpm1.6°86.8 m
2000 rpm0.4°87.3 m
2400 rpm−0.1°87.5 m

Across 700–2400 rpm the on-line release angle moves 9.0° — about 0.53° per 100 rpm — and the carry it buys moves 2.6 m.

So: unaimed, snap is worth 35.7 m. Aimed, it is worth 2.6 m. The thirty-three metres in between were never spin. They were a release angle that nobody had matched to the arm holding the disc, and they are recoverable with a wrist, not a winter of training. Spin and release angle are the same control, and only one of them is free.

Which also means holding one angle while the arm changes is expensive:

throwerspincarrymiss from the line
novice894 rpm82.9 m8.0 m
club player1192 rpm82.4 m12.5 m
pro1440 rpm82.4 m14.9 m
spin monster1738 rpm82.5 m16.8 m

Nine metres of lateral spread for 0.5 m of carry, on one disc at one angle. Snap is a steering wheel wearing a power meter’s clothes.

The bag is a set of release angles

Every disc, released on the angle that lands it on the line, at 26 m/s and 1440 rpm:

dischyzer that aims itcarrywidest right
understable driver12.0°86.9 m3.6 m
neutral driver1.9°86.7 m5.4 m
overstable driver−6.2°82.5 m5.9 m
midrange0.3°73.7 m4.6 m
putter−1.9°64.5 m3.9 m

The three drivers carry 86.9, 86.7 and 82.5 m — a spread of 4.4 m across 18.2° of release angle. They are not three distances. They are three different answers to the same question, and the thing being bought is the shape of the arc between here and there, which is why the bag has more discs in it than a thrower has distances.

Nose

nosecarrypeak height
−4°92.2 m6.1 m
−2°87.6 m7.7 m
0°82.4 m9.1 m
+2°77.1 m10.4 m
+4°71.9 m11.5 m

2.64 m of carry per degree, straight off the (α − α0)² in the drag law, and every metre of it goes into height nobody asked for. It is the only control here that is worse in both directions than it looks.

Wind, which does not touch the disc and changes everything

windcarrylandedwidest right
6 m/s tail76.7 m11.6 m left0.0 m
2 m/s tail83.1 m15.5 m left0.0 m
still82.4 m14.9 m left0.0 m
2 m/s head79.8 m11.5 m left0.0 m
4 m/s head76.5 m4.2 m left3.7 m
6 m/s head74.2 m10.9 m right14.4 m
8 m/s head64.9 m40.8 m right40.8 m

A headwind raises the airspeed, so it multiplies C_M at every α — including all the α below the crossing, where the moment is still nose-down. It spends its time in the turn. That is why a card full of players reaches for a more overstable disc when it starts blowing in their faces, and why a tailwind that feels like free distance costs six metres and fades out early.

I did not fit any of that. The coefficients were set by how each disc flies in still air, and the wind behaviour is what the integration did with them — which is the one piece of outside validation this model has, so I am recording it.

Wind is not a substitute for a disc, though, which is worth knowing before buying one fewer: searched across ±10 m/s, the closest a wind can get an understable driver to flying like a neutral one is 6.2 m off its landing spot, and a neutral to an overstable one, 8.7 m. It is a dial that moves the crossing, not one that moves the disc.

The hole

88 m, OB 26 m either side, four trees, a basket. Three drivers can all reach the chains from this tee, and no two of them do it the same way:

discaimhyzercarrymiss
understable driver−2°11°87.6 m0.6 m
neutral driver−3°0°88.1 m0.4 m
overstable driver−11°−14°88.3 m0.5 m
midrange−12°−8°79.4 m8.8 m
putter−13°−12°69.3 m18.8 m

Every one of those lines was found by search, not by taste — measure.mjs sweeps aim × release angle and reports the best each disc can do. The overstable disc gets there by being aimed eleven degrees left of the basket on fourteen degrees of anhyzer, which is a thing no beginner would ever try and every experienced player does on purpose.

What is modelled and what is fitted

The aerodynamic form is Hummel’s (2003) flying-disc fit: linear lift, quadratic drag about a small negative α, linear pitching moment. Everything structural — precession, the lift tilting with the plate, α being an angle between the plate and the air rather than between the plate and the ground, spin in the divisor — falls out of the integration and is not tuned.

Two things are mine and should be read as modelling choices:

SPIN_DECAY is tuned to lose 24–31% of the spin across a drive, which is where high-speed footage puts it, and spin decay is the only reason I·ω moves at all during a flight.

Reuse

src/snap.mjs is framework-free: no DOM, no canvas, no timers.

import { simulate, bestLine, rad } from './snap.mjs';

const res = simulate({ disc: 'neutral', speed: 26, snap: 5.8, hyzer: rad(10) });
// → { carry, drift, peakRight, flightTime, peakHeight, path:[{t,x,y,h,v,alpha,bank,CM,rollRate}], … }

const line = bestLine({ disc: 'understable', speed: 26, snap: 5.8 });
// → the release angle that lands it on the aim line, searched coarse-then-fine

createThrow() hands back a live object you step yourself, a frame at a time — that is what the demo drives. The frame is aerospace (x downrange, y right, z down), angles are radians inside and degrees only at the edges, and path[].rollRate is signed right-positive, which is what the trace is coloured by.

node scripts/measure.mjs prints every table on this page. node scripts/screenshot-demo.mjs regenerates thumb.png and media/, and doubles as the smoke test — it drives the real page in Chromium, cross-checks the page’s landing against a cold simulate() of the same throw, and exercises the keyboard and pointer paths.