// You may think you can just pass the body.LinearVelocity to the Friction function and edit it there!
// But doing so is unpredicted! And you will doom yourself to 1000 years of rubber banding!
var velocity = body.LinearVelocity;
+ var angVelocity = body.AngularVelocity;
_mover.Friction(0f, frameTime, friction, ref velocity);
+ _mover.Friction(0f, frameTime, friction, ref angVelocity);
PhysicsSystem.SetLinearVelocity(uid, velocity, body: body);
+ PhysicsSystem.SetAngularVelocity(uid, angVelocity, body: body);
}
}
}
+ public void Friction(float minimumFrictionSpeed, float frameTime, float friction, ref float velocity)
+ {
+ if (velocity < minimumFrictionSpeed)
+ return;
+
+ // This equation is lifted from the Physics Island solver.
+ // We re-use it here because Kinematic Controllers can't/shouldn't use the Physics Friction
+ velocity *= Math.Clamp(1.0f - frameTime * friction, 0.0f, 1.0f);
+
+ }
+
/// <summary>
/// Adjusts the current velocity to the target velocity based on the specified acceleration.
/// </summary>