private void DoBob(float speed)
{
if (BobAmplitude == Vector4.zero || BobRate == Vector4.zero)
return;
speed = Mathf.Min(speed, BobMaxInputVelocity);
// reduce number of decimals to avoid floating point imprecision bugs
speed = Mathf.Round(speed * 1000.0f) / 1000.0f;
float upAmp = (speed * (BobAmplitude.y * -0.0001f));
float upBob = (Mathf.Cos(Time.time * (BobRate.y * 10.0f))) * upAmp;
float sideAmp = (speed * (BobAmplitude.x * 0.0001f));
float sideBob = (Mathf.Cos(Time.time * (BobRate.x * 10.0f))) * sideAmp;
float forwAmp = (speed * (BobAmplitude.z * 0.0001f));
float forwBob = (Mathf.Cos(Time.time * (BobRate.z * 10.0f))) * forwAmp;
float rollAmp = (speed * (BobAmplitude.w * 0.0001f));
float rollBob = (Mathf.Cos(Time.time * (BobRate.w * 10.0f))) * rollAmp;
m_PositionSpring.AddForce(new Vector3(sideBob, upBob, forwBob));
m_RotationSpring.AddForce(new Vector3(0, 0, rollBob));
DetectBobStep(speed, upBob);
}