workshop private

← all creations

Backcast

mechanics · created 2026-09-08

A fly line simulated as an inextensible chain, and the measurement nobody wants — every dial you are consciously turning during the forward cast is worth less than a metre, and the half of the cast happening behind your head is worth seven.

physicssimulationgame-feelcanvas

In every other kind of casting you throw a weight and the line follows it. In fly casting the fly weighs thirty milligrams, which is nothing, and the line is the projectile. Ten metres of it, one gram per metre, thrown by being peeled off a fold that travels from the rod tip to the fly while the whole assembly falls out of the sky.

So the loop is not a style choice. It is the delivery mechanism, and nothing in this module knows what one looks like. There is a chain of point masses with inextensible links, gravity, and air; you move one end of it and stop. The loop is what happens next.

Which meant I could ask the question that fly-casting instruction never answers with a number: of everything you are doing, how much of it matters?

The two angles

A cast has two directions in it. One is the forward stroke — where you take the rod tip — and it is the one you are thinking about, the one every lesson is built around, the one you can feel. The other is where the line already happens to be lying when the stroke begins, which is the wreckage of a back cast that finished behind your head where you could not see it.

Same rig, same line, same stroke length and speed. Rows vary the back cast; columns vary the forward stroke. Carry in metres, each cell the mean of three tip speeds:

back caststroke −15°−8°+8°+15°mean
−20°7.087.428.328.878.978.13
−15°8.538.218.999.139.688.91
−10°8.147.409.159.809.558.81
−5°8.119.869.779.788.849.27
7.488.749.409.058.908.72
+5°6.758.317.967.647.487.63
+10°5.375.625.926.006.175.81
+15°4.454.444.514.774.734.58
+20°3.223.543.583.693.773.56
+25°2.392.652.732.752.702.64
+30°1.791.941.972.051.941.94
mean5.756.196.576.686.61

Read the last row, then the last column.

Over the same matched ±15°, the forward stroke moves the cast 16% — 5.75 to 6.68 — and the back cast moves it 95%, 8.91 down to 4.58. Give the back cast the full range it was measured over and it runs 9.27 to 1.94: a factor of 4.8, on the axis you are not looking at.

And the columns inside the bad rows barely move at all. The +30° row is 1.79, 1.94, 1.97, 2.05, 1.94 — the same dead cast five times over, thrown five different directions. The forward stroke is not compensating. There is nothing to compensate with.

I went in expecting the folk rule — the forward stroke must go 180° opposite the back cast — and expecting the diagonal of that table to light up. It does not. There is no diagonal. There is a back cast that works and a back cast that does not, and the stroke you put on it is a rounding error.

You cannot power out of it

The obvious objection is that a bad back cast is just a cast that needs more effort. So: every dial a caster consciously turns, run against a good back cast (−5°) and a high one (+25°).

back −5°back +25°cost
tip speed 20 m/s6.13 ± 0.19 m1.05 ± 0.16 m−5.08 m
tip speed 28 m/s10.06 ± 0.16 m2.76 ± 0.03 m−7.29 m
tip speed 36 m/s9.12 ± 1.04 m3.68 ± 0.09 m−5.45 m
tip speed 44 m/s9.13 ± 0.72 m4.16 ± 0.15 m−4.96 m
stroke 2.0 m7.92 ± 1.39 m2.80 ± 0.56 m−5.12 m
stroke 3.0 m9.80 ± 0.78 m2.71 ± 0.51 m−7.09 m
stroke 4.0 m11.12 ± 0.46 m2.46 ± 0.53 m−8.66 m
stop in 15 ms6.56 ± 1.76 m2.12 ± 0.57 m−4.44 m
stop in 28 ms9.80 ± 0.78 m2.71 ± 0.51 m−7.09 m
stop in 50 ms9.68 ± 0.56 m2.95 ± 0.52 m−6.73 m

Every row is negative and no row is close to zero. Taking the tip from 20 m/s to 44 — from a competent cast to a speed no arm produces — buys back 3.1 m on the ruined cast and still lands 5.9 m short of what a level back cast gets for free at 28. Lengthening the stroke widens the gap, because a longer stroke is worth 3.2 m on a good back cast and −0.3 m on a bad one: it is the one input whose value depends on the geometry being right first.

The stop is my favourite row and I did not predict it. A crisper stop is worse on both — 6.56 against 9.80 on the good back cast. Fifteen milliseconds is a deceleration so sharp that the shock outruns the line’s own ability to carry it, and the energy goes into a kink instead of into the fold. There is a right amount of crispness and it is not “more”.

The air is doing half the work

The line is 1.2 mm across and 1 g/m. Ten metres of it takes about a second to turn over, and a second is a long time to be falling. So I took the air away:

carryloop
as modelled8.59 ± 1.57 m0.42 m
no skin friction along the line8.85 ± 1.87 m0.43 m
no broadside drag3.96 ± 2.31 m0.59 m
no air at all4.02 ± 3.15 m0.55 m
half the broadside drag7.04 ± 1.73 m0.45 m
twice the broadside drag6.27 ± 1.29 m0.41 m
four times the broadside drag4.43 ± 0.99 m0.37 m

Air resistance is worth 54% of the cast. Delete it and the line free-falls instead of settling to a terminal 3 m/s, hits the water at four metres, and never turns over. Skin friction — the part that actually slows the line down, the part you would think of as drag — is worth nothing at all: 8.85 against 8.59, inside the noise.

And the real value sits on top of the hill. Half is worse, double is worse, four times is much worse. That is not a fitted result; nothing was tuned for it. cn is a cylinder in crossflow and ct is a turbulent flat plate, both read off standard correlations, and a fly line at 1.2 mm and 20 m/s lands near the peak of its own drag curve by itself.

The two coefficients differ by a factor of 340. Getting that ratio wrong was my first bug: with skin friction set to a bluff-body value the cast died at nine metres every time, and the reason is the thing the whole piece turns on. A straight leg of line moving along its own length is almost frictionless; only the fold is broadside. Loop width is a drag budget.

What you actually do in the demo

You steer the rod tip, not the rod. The pointer is where the top of the rod is trying to be; the bend you can see is drawn to reach it, not simulated. That is deliberate — see the gotchas — and it means the cast you make here and the cast in the tables above are driven by the same input.

2 and 3 keep 1 on screen as a dashed ghost. They are the tables as a picture: 8.3 m, 2.0 m, and 3.3 m.

Reuse

src/flycast.mjs is framework-free and draws nothing. Metres, kilograms, seconds; +x downstream, +y up, y = 0 is the water.

A whole cast at dt = 1/4000 is about 130 ms in Node, so a few hundred of them is a coffee.

Gotchas