Wingsuit is a game in the Tofte Simulators arcade. You jump off a cliff, fly a valley through its rings and low over the trees, and open your canopy in time to land in the meadow. There are two lines: The Valley, wider and gentler, and The Gully, tighter and steeper, where you can stay right down on the floor all the way. This week each line got its own sky.

Two numbers
The suit is held to two figures published for real wingsuits:
- its best glide is about 2.5 to 1, so 2.5 metres forward for every metre down;
- that best glide comes at about 45 metres a second.
The second is from Robson and D'Andrea (AIAA, 2012), from measured wingsuit flights, who also give 35 metres a second as a comfortable flying speed. I have to be plain about where these came from: I read both figures in search result summaries, because the papers could not be opened from where the game was written. Everything below rests on them.
The model is a point mass with lift and drag, and drag follows the textbook form for a wing, a parabolic polar:
CD = CD0 + K × CL²
That form has a known best glide, 1 / (2√(CD0 × K)), at a lift coefficient of √(CD0 / K). So the two published numbers fix the two unknowns. The game supplies the rest:
- a 90 kg pilot with gear;
- 2 square metres of wing;
- air at 1.1 kg per cubic metre, which is roughly the density about 1,000 metres up.
Out come CD0 = 0.0736, K = 0.543, and a best-glide lift coefficient of 0.368. The game's tests check that a suit flown at that lift settles at 2.5 to 1 and 45 metres a second. They also check that no other lift setting glides better.
What falls out
Fly the suit for a minute at each lift setting and let it settle. That gives:
| Lift setting | Through the air | Forward | Down | Glide |
|---|---|---|---|---|
| Flat out (0.08, the game's least) | 84.9 m/s | 61.2 m/s | 58.9 m/s | 1.04 to 1 |
| Fast (0.20) | 60.2 m/s | 54.3 m/s | 25.8 m/s | 2.10 to 1 |
| Best glide (0.368) | 45.0 m/s | 41.8 m/s | 16.7 m/s | 2.50 to 1 |
| Slow (0.637) | 33.8 m/s | 30.7 m/s | 14.2 m/s | 2.17 to 1 |
| At the stall limit (0.90) | 27.8 m/s | 24.2 m/s | 13.8 m/s | 1.75 to 1 |
At its best glide the suit is still falling at 16.7 metres a second, about 60 km/h straight down, while it moves forward at 42.
The slowest way down is not the furthest way down. The best glide sinks at 16.7 metres a second. Pull up to the edge of the stall and the suit sinks slower, 13.8, but glides only 1.75 to 1. It takes longer to reach the ground and gets less far before it does. Where that edge is, a lift coefficient of 0.9, is the game's own choice and not a published figure. Past it, the tests show the suit stalls: less lift, more drag, and a worse glide.
Diving costs glide quickly. Flat out the suit does 85 metres a second through the air and only just beats falling straight down: 1.04 metres forward for each metre of height.
Turning
Bank the suit and it turns on a circle of radius V² / (g tan(bank)). The tests hold it to that, and to sinking faster than wings level while it turns. At 45 metres a second:
| Bank | Turn radius |
|---|---|
| 30 degrees | 358 m |
| 45 degrees | 206 m |
| 60 degrees (the most the game allows) | 119 m |
A bend tighter than that has to be flown slower: at 30 metres a second, the same 60 degree bank turns in 53 metres.
The ghost never glides 2.5 to 1
The ghost is a pilot flying the same two controls a player has, lift and bank, under the same rules. The tests have it make every ring of both lines, miss every tree and land in the meadow. From its recorded flights:
- The Valley: six rings, canopy open at 74.9 seconds, down in the meadow at 106.5. Before the canopy it covers 2,840 metres over the ground for 1,320 metres of height: 2.15 to 1.
- The Gully: seven rings, canopy at 81.6 seconds, down at 113.3. 3,341 metres for 1,584: 2.11 to 1.
Neither comes near the suit's 2.5. The line costs glide. I have not split that cost up the way the surf ledger splits energy, but there are three candidates:
- every ring hangs at a height the line chooses, not the one the best glide would put you at;
- every bend is flown banked, and banked sinks faster;
- every dive for a ring trades height for speed, and drag takes a share of it.
The ghost's fastest moments, measured from its recorded positions, are above the best-glide speed:
- 54 metres a second in the Gully, at its first ring;
- 48 in the Valley, just before the canopy opens.
A sky for each line
Each line's sky is a dome drawn by a shader. It rides with the camera, behind everything, and is never solid. It draws:
- a gradient from the horizon up;
- the sun's disc and its glow;
- clouds that drift;
- three ranges of far mountains round the horizon, nearest darkest, with snow on the high ones.
The Valley gets a low golden sun and the Gully a clear high-mountain day. The terrain's fog takes the sky's haze colour, so the valley's own far walls fade into the far ranges.

The first version drew the Valley's sky rust where it should have been peach. Nothing errored, and the picture looked like a sunset. What gave it away was the seam: the valley's far walls faded into one colour and the sky behind them was another.
three.js hands a shader its colours in linear light, and its own materials convert to the screen's sRGB on the way out. A hand-written shader does not unless it asks to. So mine was showing linear values as if they were sRGB. That darkens everything and pushes warm colours toward red. One line fixed it. That is the same shape as a game rope that is only as stiff as its solver: a picture that is well formed, plausible, and wrong.
What is simplified
- There is no wind, and the air is the same all the way down.
- You set the suit's lift and bank directly, rather than flying its body.
- The canopy is a second, slow wing with made-up but canopy-like numbers: about 9 metres a second through the air and 5 down, fully open after 2.5 seconds.
- The trees are solid.
The suit itself is exactly as good as the two figures it is held to. The tests check the model against those numbers, and nothing here checks those numbers against a real flight. If either is off, every row in the tables above is off with it, consistently, and nothing on screen would say so.