Question about PBD stabilization
Posted: Sun Nov 18, 2018 10:25 am
I have a question related to PBD in the context of a grain/sand simulation.
I understand some solvers implement a stabilization step prior to the main constraint solver loop, where solid-surface interpenetrations are resolved, and the position deltas are added to both the current position and the projected position so they do not contribute to the overall velocity deltas calculated at the end of the solver loop (otherwise, the smaller the time step...the greater the explosive force of those solid surface collision constraints).
However, it seems the same explosiveness can occur even with particle-particle collisions, but it doesn't really make sense to include them in the stabilization step. So how can such explosiveness be mitigated?
To illustrate:
Imagine a simulation with a time step of 1. On the first step of the simulation, 2 particles (each with a radius of 1) occupy the same location. During the constraint solver loop, they are each moved a distance of 1.0 units away from each other in opposite directions to satisfy their collision constraint. At the end of the solver loop, when velocities are calculated from current/projected particle positions, and each particle ends up with a velocity magnitude of 1 using the formula: vDelta = (projectedPos - currentPos) / timeDelta;
Now we change the time step to 1/32 (0.03125). The same scenario unfolds with the coincident particles being moved 1 unit away from each other. However, at the end of the time step when we are calculating their velocity, they end up with a velocity that is much more explosive since we're dividing the positionDelta by .03125, which effectively multiplies it by 32. So now their velocity magnitude...despite only having moved a single unit in space, is 32 instead of 1. And consequently, they explode apart as the simulation continues.
With big piles of particles forming regularly and particle-particle collisions happening often in a grain simulation, these explosions can happen all the time and result in a very unstable simulation. Especially if new particles are injected into the system over time in such a way that doesn't guarantee they will be collision-free at birth. So how can these explosive artifacts be fixed?
I understand some solvers implement a stabilization step prior to the main constraint solver loop, where solid-surface interpenetrations are resolved, and the position deltas are added to both the current position and the projected position so they do not contribute to the overall velocity deltas calculated at the end of the solver loop (otherwise, the smaller the time step...the greater the explosive force of those solid surface collision constraints).
However, it seems the same explosiveness can occur even with particle-particle collisions, but it doesn't really make sense to include them in the stabilization step. So how can such explosiveness be mitigated?
To illustrate:
Imagine a simulation with a time step of 1. On the first step of the simulation, 2 particles (each with a radius of 1) occupy the same location. During the constraint solver loop, they are each moved a distance of 1.0 units away from each other in opposite directions to satisfy their collision constraint. At the end of the solver loop, when velocities are calculated from current/projected particle positions, and each particle ends up with a velocity magnitude of 1 using the formula: vDelta = (projectedPos - currentPos) / timeDelta;
Now we change the time step to 1/32 (0.03125). The same scenario unfolds with the coincident particles being moved 1 unit away from each other. However, at the end of the time step when we are calculating their velocity, they end up with a velocity that is much more explosive since we're dividing the positionDelta by .03125, which effectively multiplies it by 32. So now their velocity magnitude...despite only having moved a single unit in space, is 32 instead of 1. And consequently, they explode apart as the simulation continues.
With big piles of particles forming regularly and particle-particle collisions happening often in a grain simulation, these explosions can happen all the time and result in a very unstable simulation. Especially if new particles are injected into the system over time in such a way that doesn't guarantee they will be collision-free at birth. So how can these explosive artifacts be fixed?