Broken friction
you define friction as: obj.Velocity -= Friction * dt;
this is the same as: ob.Velocity.X -= Friction * dt; ob.Velocity.Y -= Friction * dt;
So it means if vector component is negative (or zero), it's absolute value increases. It's clearly visible when objects with zero velocity slowly move to the bottom left corner (or top left - depends on coordinate system).
I used this
var friction = Friction * dt; PhysMath.RoundToZero(ref velocity, tolerance); velocity.X += velocity.X == 0 ? 0 : velocity.X > 0 ? -friction : friction; velocity.Y += velocity.Y == 0 ? 0 : velocity.Y > 0 ? -friction : friction;
Or this: velocity -= Vector2.Normalize(velocity) * friction;
Fixed in latest commit