refactor: Basic Collision Resolver

This commit is contained in:
2024-01-27 20:08:16 +03:00
parent 4d9121118d
commit a3c4afb223
3 changed files with 47 additions and 31 deletions

View File

@@ -13,6 +13,7 @@ public class PhysicsEngine2D : IPhysicsEngine2D
private int _iterationCount = 1;
private ICollisionDetector2D collisionDetector = new CollisionDetector2D();
private ICollisionResolver2D collisionResolver = new CollisionResolver2D();
public int IterationCount { get => _iterationCount; set => _iterationCount = value < 1 ? 1 : value; }
@@ -65,36 +66,7 @@ public class PhysicsEngine2D : IPhysicsEngine2D
colliderX.OnCollisionDetected?.Invoke(colliderX, information);
colliderY.OnCollisionDetected?.Invoke(colliderY, information);
Vector2D displacementVector = information.Normal * information.Penetration;
bool isStaticLeft = information.Left.RigidBody2D?.IsStatic ?? true;
bool isStaticRight = information.Right.RigidBody2D?.IsStatic ?? true;
if (isStaticLeft && isStaticRight)
continue;
else if (isStaticLeft)
information.Right.Transform.Position += displacementVector;
else if (isStaticRight)
information.Left.Transform.Position -= displacementVector;
else
{
float leftMass = information.Left.RigidBody2D?.Mass ?? float.Epsilon;
float rightMass = information.Right.RigidBody2D?.Mass ?? float.Epsilon;
float massSum = leftMass + rightMass;
float leftMomentumPercentage = leftMass / massSum;
float rightMomentumPercentage = rightMass / massSum;
information.Right.Transform.Position += leftMomentumPercentage * displacementVector;
information.Left.Transform.Position -= rightMomentumPercentage * displacementVector;
}
information.Left.Recalculate();
information.Right.Recalculate();
colliderX.OnCollisionResolved?.Invoke(colliderX, information);
colliderY.OnCollisionResolved?.Invoke(colliderY, information);
collisionResolver?.Resolve(information);
}
}
}