Cloth simulated with Extended Position Based Dynamics. Grab it, throw it, cut it in half, turn the wind up until it tears off the pole.
Drag to grab. C knife, P pin, G grab, space pause, R reset. Then press Substep sweep and flip the solver.
Substep sweep re-runs the cloth from its starting state at 1, 2, 4, 8, 16 and 32 substeps, then draws the six resulting silhouettes on top of each other. Nothing else changes between the runs.
In one substep of size h, gravity moves a free particle down by
g*h^2 before the solver gets to it. A PBD projection removes a fixed fraction
k of the error, so a hanging mass settles where k*|C| = g*h^2, giving
an elongation of g*h^2/k. Every term in that is a solver setting. The XPBD
update carries alpha/h^2 through the same balance and lands on
m*g*alpha + g*h^2: a material term, plus a discretisation term that vanishes as
the substep shrinks.
So the six PBD outlines are six different fabrics and the six XPBD outlines are one fabric measured six times. That is the entire difference between the two solvers, and it is worth about four lines of code.
The honest caveat, which is also the more useful half. That is true once the solve has
CONVERGED. At one iteration per substep there is a leftover term, and the excess over the
static answer goes as g*h^2 with a coefficient of N(N-1)/2 for an
N link chain, because a Gauss-Seidel sweep hands its corrections downstream and the lag
accumulates one unit per link. On the ten link rope that is a 2% garnish. On a thirty by
thirty sheet at six substeps it was most of the answer: max strain came out 45.7% at
six substeps against 17.0% at twenty-four, which is the headline above failing outright.
Turning iterations up closed it, from a 63% gap to 0.001% measured on the whole population.
Compliance is a material property in the converged limit, and an under-resolved solve quietly
smuggles a solver setting back into your fabric.