Grass

After Bartosz Ciechanowski, Airfoil

Studied 2026-08-192D canvas. Semi-implicit Euler on a few hundred jointed chains. No libraries.

A blade of grass is a driven damped oscillator. The wind is one smooth field travelling across the scene; each blade is a chain of hinges with its own stiffness, so each one answers the wind late, and by its own amount. That lag is the entire source of the richness. Drive the same blades directly from the same field, with no dynamics in between, and the field reads as a screensaver.

1 · The field

Hundreds of blades on seven depth rows — with depth jittered inside each row, or the rows read as stripes — each a chain of five segments integrated with semi-implicit Euler under a quadratic drag force. The wind is a sum of three travelling sines plus a slow seeded noise term, all moving at nearly the same speed, so gusts arrive as coherent waves rolling across the field rather than as per-blade jitter. Watch a whole row bow, and then release.

Read this: switch no dynamics on and each blade becomes a direct function of the wind at its root. The wave still travels, but nothing overshoots, nothing springs back, and every blade turns at the same instant. In figure 2 the lag goes to zero and the two curves become one curve. That is the whole difference.

2 · The lag

Wind speed at the blue probe and the tip deflection of the rust blade, on one time axis. They are the same signal, and the blade's copy arrives late and smoothed. The dashed line is the wind curve delayed by the measured lag: where it lands on the rust curve, the blade is doing now what the wind did then.

wind at probetip deflectionwind, delayed
Read this: soften the blades in figure 1 and the lag grows and the tip overshoots the wind. Stiffen them and the two curves close on each other. Withno dynamics on, the lag falls to zero and the curves are one curve.

3 · One blade

The same chain, alone and large. Grey arrows are the drag force on each segment. They grow toward the tip because the wind is faster up there, and they shrink whenever a segment is already moving with the wind — that term is the damping. Joint stiffness falls from base to tip, so the base barely moves and the tip whips. Press gust and count the swings back.

Read this: at low damping the tip rings for several cycles after a gust has passed. Four hundred blades doing that, each out of phase with its neighbour, is the whole of figure 1.
After the windy grass figure in Bartosz Ciechanowski'sAirfoil. That article is about lift, and the grass is a background detail in it — the detail that makes the page feel like a place. Rebuilt from scratch here in canvas 2D, no libraries, deterministic seeds, to find out what the blades are actually doing.

What it actually does

  • Gusts have to travel. A sum of three travelling sines plus a slow seeded noise term, all moving at roughly one speed, makes a whole row bow together and release; per-blade jitter at the same amplitude looks like static.
  • Stiffness falls from base to tip along the chain, so the base barely moves and the tip whips.
  • At low damping the tip rings for several cycles after a gust has passed. Hundreds of blades doing that, each out of phase with its neighbour, is the whole of the field.
  • The control case is measurable rather than rhetorical: with dynamics the tip lags the wind by around 0.2 s at a correlation of 0.91, and with dynamics off the lag is exactly zero at a correlation of 1.
  • The leaves are advected by the same field the blades sample, which is why they look like they belong in the scene rather than on top of it.
  • Depth is carried by alpha, scale and colour temperature, with the far rows drawn first.

What the rebuild taught

  • The second-order term is the whole thing. A no-dynamics switch that snaps every blade straight to the wind is the most convincing control on the page: every blade at a given depth then moves as one, and the field dies.
  • Measure the lag rather than asserting it. Plotting wind at a probe against the tip deflection of one marked blade, and overlaying the wind delayed by the measured amount, turns a claim into a reading.
  • The pointer must push the field, not the blades. Injecting a disturbance into the same wind everything samples means the leaves respond too, for free, and nothing needs a special case.
  • Coherence is a property of the driver, not of the driven. Everything expensive here was spent on the wind field; the blades themselves are twenty lines.
  • The wind sum has to be non-dispersive, and the natural way to write it is not. Phrasing each term as x over wavelength minus frequency times t gives every term a different travel speed, in the ratio of the wavelengths; the gusts then smear within about a second and the field degrades into per-blade shimmer, which is precisely the screensaver failure this study is about. Writing the phase as x minus speed times t, over wavelength, with the speeds deliberately close, is what makes rows bow together.
  • Gravity has to be sized against the softest joint in the chain, not against the blade as a whole. The tip joint has both the least stiffness and the least inertia, so a gravity figure that looks reasonable for the blade folds the last two joints straight into their angle clamp. The clamp is what makes it look dead rather than broken.
  • You cannot calibrate a driven oscillator by watching it being driven. The drag was four times too weak and the travelling gusts hid it completely, because there was plenty of motion. Freezing the gusts and sweeping steady wind from zero found it in one pass: the whole range moved the tip by a tenth of a radian.
  • A probe measuring the wrong column measures the wrong thing while looking entirely plausible. With the probe and the tracked blade in different columns, most of the reported lag was the gust’s travel time between them, and the correlation came out negative. The probe has to sit at the tracked blade’s own column and depth.
  • Discrete depth rows render as stacked hedges with hard horizontal edges. Jittering each blade’s depth within its row fixes it while the painter sort still runs by row.
  • Pick tall and near for anything you intend to plot. Stiffness scaling inversely with length means a short blade barely moves, and a tracked-blade picker that ignored height produced a graph whose whole argument was a flat line.
  • Two captions asserted things the numbers deny: that the blades "move as one" without dynamics, when the measured within-row spread is only about a quarter narrower, and that a tip segment drags harder partly because it is freer to move with the wind, which is backwards, because moving with the wind is what reduces drag and that term is the damping. If a caption makes a quantitative claim, measure it.

Rebuild

Three figures: the field, the lag plotted against the wind that caused it, and one blade alone with its drag forces drawn. The source figure is a background detail in an article about lift, which is exactly why it was worth pulling out.

Primitives

Flow fieldOne continuous field that everything samples, so unrelated objects agree about the world for free.
Jointed chainA body integrated joint by joint. Stiffness falling along its length is what makes a tip whip and a base hold.
SpringDamped follow. Nothing snaps, and stiffness/damping carry most of the perceived personality.
Depth cueAlpha, scale or weight standing in for lighting. Cheap, flat, and more legible than shading.
Painter sortExplicit far-to-near draw order. Replaces a depth buffer with one sort per frame.

The work it is after

ciechanow.ski/airfoil