stable collisions

This commit is contained in:
max
2026-09-03 17:27:52 +02:00
parent 815bd2d260
commit d8758f98dc
8 changed files with 151 additions and 452 deletions

View File

@@ -5,20 +5,17 @@ namespace PhysicsEngine
{
public class Solver
{
// Optional: set a default number of substeps (e.g. 8 for better stability)
private const int DefaultSubSteps = 8;
public void Step(float dt, List<Body> bodies, List<Constraint> constraints, List<GlobalForce> globalForces, int subSteps = DefaultSubSteps)
{
// Avoid division by zero or negative subSteps
if (subSteps <= 0) subSteps = 1;
float subDt = dt / subSteps;
for (int step = 0; step < subSteps; step++)
{
// 1. Accumulate global forces (gravity, drag, etc.)
// They are applied each substep using the substep dt.
// accumulate global forces
foreach (var body in bodies)
{
if (body.IsStatic) continue;
@@ -29,29 +26,29 @@ namespace PhysicsEngine
}
}
// 2. Numerical Integration (Velocity & Position updates)
// velocity & position updates
foreach (var body in bodies)
{
if (body.IsStatic) continue;
// Linear motion
// linear motion
Vector2 acceleration = body.ForceAccumulator * body.InverseMass;
body.Velocity += acceleration * subDt;
body.Position += body.Velocity * subDt;
// Angular motion
// angular motion
float angularAcceleration = body.TorqueAccumulator * body.InverseInertia;
body.AngularVelocity += angularAcceleration * subDt;
body.Rotation += body.AngularVelocity * subDt;
// Clear accumulators for the next substep
// clear
body.ClearForces();
}
// 3. Resolve Collisions
// collisions
CollisionEngine.ResolveCollisions(bodies, subDt);
// 4. Resolve constraints
// constraints
foreach (var constraint in constraints)
{
constraint.Solve();