Nobody Dances Like That

Ghostly dancers, soft focus, a smoke-filled dance floor.

Photo by Liana S on Unsplash

I did not set out to learn anything about human beings. I set out to draw a dancer. The human beings turned up uninvited and taught me a lesson anyway, which is very much their way.

Here’s the setup. A small macOS app I’ve been chipping away at — I’ll tell you what it actually does another day — grew a music visualiser almost by accident. Once it existed, I couldn’t leave it alone. I’d seen one of those lovely minimal audio visualisers: a lone figure moving in a hazy, backlit room, a slim waveform riding over the top. And what I wanted from it wasn’t the waveform. It was the room. The presence. The sense that someone was in there, dancing, just out of focus.

So, obviously, I tried to draw the someone.

So I drew her

The house rule still applied, the one I keep for my games: nothing loaded from a file. No stock video, no motion-capture, no borrowed footage of an actual dancer. If I wanted a figure, I had to build one out of maths, drawn fresh on the GPU every frame.

And I did. A circle for a head. A soft column for a torso. Two arms on little sweeping cycles, rising and falling. A skirt that flared from the waist and rippled at the hem. She swayed. She lifted her arms. She was, unmistakably, a woman dancing.

She was also awful, and it took me an embarrassingly long time to work out why.

The trouble with people

Here is the thing nobody warns you about. The instant a shape reads as human, the person watching stops looking at a shape and starts watching a person — and everyone, without exception, is a lifelong expert on how people move. My dancer held her arms overhead a beat too long. Nobody dances like that. Her sway was a touch too even, too metronomic. Nobody dances like that. Every frame invited the same four words, and the better I made the figure — the more clearly human — the louder those words got.

I had built myself an uncanny valley and moved straight in.

The fix, it turned out, was not a more convincing dancer. I could have spent a month on inverse kinematics and weight-shift and secondary motion and still landed on “good puppet.” The fix was to stop drawing a person at all.

The black blob

So I abstracted her. Off came the head, the arms, the skirt, until what was left was just a soft vertical presence — a shadow in the beam, swaying. No anatomy to get wrong. Problem solved.

Reader, it was not solved. I had walked straight into the second trap.

A shape with soft edges is still a shape. What I had now was a flat, dead, coal-black column — a hole punched in the smoke. A blob. I stared at it. The AI I do this work alongside stared at it too. We agreed, in as many words: blob.

The mistake was the same one, wearing a different coat. I was still drawing a thing — filling in a region and softening its border — and a filled region, however soft its edge, always reads as an object cut out of the world. The trick I’d been missing all afternoon was this: don’t draw a shape. Draw a density.

Vapour, not silhouette

The old question was “is this pixel inside the figure?” — and any yes/no question gives you an edge, and an edge is a thing to be wrong about. The new question was gentler: “how much shadow hangs in the air right here?”

Instead of a body, a soft haze that’s thickest along a slowly-wandering spine and fades to nothing in every direction, all of it broken up by the same procedural smoke drifting through the rest of the room. No border. No flat core. Light seeps through the thin parts and catches in the dense ones, unevenly, the way light actually behaves in a smoky room. And just like that it stopped being a blob in the smoke and started being smoke, with something alive moving inside it. Same maths family as the monsters in my game, pointed at a kinder subject.

Move with the music, not at it

Then, motion. My first attempt jerked on every beat — twitching on each kick drum like a cheap club light with a wiring fault. Which makes sense on paper and looks terrible in practice, because a beat is a hammer, and a dancer is not being hammered.

So I stopped moving to the beat and started moving to the tempo: a slow, smoothed reading of how much energy is in the music right now, feeding a clock that quietly speeds up as the room gets busy and eases off when it calms. The presence drifts faster through a loud passage and lingers through a quiet one — carried by the music without lurching on any single hit. Then I gave it company. One hard key light, the smoke machine wound up to full, and half a dozen of these presences drifting across the floor, each on its own path. A crowd.

The whole scene is a few equations per pixel. It runs cold and silent — no fans, no fuss — because there was never anything to load. There’s no dancer on disk. There’s only code, and the dark doing most of the work.

The actual lesson

Here’s what stuck with me, scrubbing off hours of iterative experimentation.

Every time I tried to say more — here is a head, here are her arms, here is precisely how she sways — the thing got worse, because I was writing cheques the animation could never cash. And every time I said less, it got better, because I was leaving room for the one renderer I will never out-code: the person watching. Tell someone “this is a woman dancing” and they will lovingly itemise everything wrong with her. Show them light and shadow shifting in smoke and they will tell you, unprompted, that it’s a dance floor — because they want it to be. Their eye finishes the sketch I was never able to.

I’ve written before about constraints as craft, but this was a sharper version of it. The skill wasn’t in drawing the dancer. It was in drawing less than a dancer, and trusting the dark to do the rest.

The visualiser is a small thing at the quiet edge of a bigger project I’m not ready to talk about yet — that’s a post for another day. For now I just wanted to tell you about the afternoon I sat down to animate a human being, failed completely, and discovered that failing was the entire point.

Put some music on. Watch the floor fill up. The illusion is complete.