FaceFall - Devlog #3
Making the cloth actually feel like cloth
This update was all about making the simulation feel physically believable instead of just stable. Some things worked exactly as I’d hoped, some didn’t, and one bug ended up explaining why cloth doesn’t really bounce.
Better aerodynamics
The old simulation only used simple linear drag, which meant the whole cloth slowed down evenly in every direction. It worked, but everything fell like it was moving through syrup.
I replaced that with per-triangle aerodynamic forces. Every triangle now generates drag based on its orientation and velocity, so the cloth behaves much more naturally. A flat sheet catches the air like a parachute, while an edge-on sheet slices straight through it.
The drag is also normalised so changing the cloth resolution doesn’t completely change the way it falls.
The difference is surprisingly noticeable. Around the one second mark the cloth now billows into a canopy before landing, something the old solver never managed.
Self collision
Another thing I wanted was proper self collision.
Previously, folds could pass straight through each other. I implemented a spatial hash so nearby particles can efficiently detect overlaps without checking every possible pair, keeping the cost close to linear even on larger simulations.
The first time I tried self collision a while ago it was unstable because I only corrected positions. This time every collision also updates particle velocity, so the solver no longer fights itself.
Folded cloth now stacks into proper layers instead of collapsing through itself.
Softer collisions
I also rewrote the collision response.
Instead of instantly pushing particles outside the collider, objects now behave like spring-damper surfaces. The cloth compresses slightly into the collision shell before settling, which produces much smoother landings and completely removed the tiny jitter I was previously working around.
The bounce bug
This ended up being the most interesting part of the update.
I originally wanted the cloth to bounce realistically, so I tried several different approaches. None of them looked right.
While debugging I found something strange. After impact, some particles still had positive upward velocity for frame after frame, yet they never actually moved.
The culprit was strain limiting.
Every correction was changing particle positions without updating their velocities, meaning momentum was effectively disappearing from the simulation. Once I applied the matching velocity correction alongside each positional fix, impacts started travelling naturally through the cloth as visible waves instead of vanishing.
Ironically, fixing that bug also answered the original question.
Real cloth barely bounces.
Once the sheet starts draping over a sphere, the hanging fabric absorbs almost all of the remaining energy. Even with perfect restitution the cloth only lifted a few centimetres before settling again.
Because of that, the default fabric presets now use very low restitution values. Silk barely rebounds at all, while leather keeps a little more energy.
Higher frame rate
The simulator now runs internally at 120 FPS.
Preview mode still displays at 60 FPS by stepping the simulation twice per frame, while exports run at the full rate. Renders take longer, but the smoother motion is absolutely worth it, especially during impact.
Current state
This update made the simulation feel much closer to real fabric.
The cloth now catches the air properly, folded layers no longer pass through each other, collisions are smoother, and the behaviour after impact looks far more convincing than before.
It also reminded me that sometimes the most realistic result isn’t the one you expect. After spending hours trying to make the cloth bounce, the correct answer turned out to be that real cloth… mostly doesn’t.
Comments 0
No comments yet. Be the first!
Sign in to join the conversation.