Lab / 04 · graphics
A cicada,
generated from code.
Built from Three.js primitives at runtime — there is no .glb, no loader and no asset request. The whole insect is a few hundred flat-shaded triangles, which is smaller shipped as code than it would be as a file. Drag to orbit, scroll to zoom, and move the wingbeat slider.
triangles — · — fps
drag to orbit · scroll to zoom
View
What is worth knowing
The detail that sells it is not the geometry.
- Real cicadas beat their wings at roughly 60–120 Hz. At that rate on a screen the wings vanish into a blur, so the default here is
14 Hz— slow enough to read as a wing, fast enough to read as flight. Push the slider up to see why nobody animates it accurately. - The wing pivots at the shoulder, not at its centre. Each wing sits in its own group positioned at the wing root; rotating that group is what makes the stroke look hinged.
- Feathering is the detail that sells it. The wing twists on
rotation.za quarter-cycle out of phase with the up/down stroke, the way a real wing changes angle of attack as it reverses. - The body bobs at twice the wingbeat — one dip per power stroke — and the abdomen trails slightly behind the body.
- Flat shading is the whole aesthetic. Every surface uses
flatShading: truewith low segment counts, so the facets are deliberate rather than a compromise.
- Geometry
- procedural, no asset
- Library
- Three.js r128 (CDN, SRI)
- Shading
- flat, low segments
- Controls
- orbit · zoom · wingbeat
- Readout
- live triangles and fps
The fps and triangle counters are measured in the running loop, not written by hand. If your device drops below a usable frame rate, that number is the honest report.