void FixedUpdate()
    {
        vehicleBounds = transform.GetTotalBounds(Space.World);

        CalculateOrientationFromSurroundings();

        if (control)
        {
            if (Input.GetKey(KeyCode.W))
            {
                gas = 1;
            }
            else if (Input.GetKey(KeyCode.S))
            {
                gas = -1;
            }
            else
            {
                gas = 0;
            }

            if (Input.GetKey(KeyCode.D))
            {
                steer = 1;
            }
            else if (Input.GetKey(KeyCode.A))
            {
                steer = -1;
            }
            else
            {
                steer = 0;
            }
        }

        float currentForwardVelocity = Vector3.Dot(CarBody.velocity, forward);

        if (gas > float.Epsilon || gas < -float.Epsilon)
        {
            CarBody.AddForce(PhysicsHelpers.CalculateRequiredForceForSpeed(CarBody.mass, currentForwardVelocity, Mathf.Clamp(currentForwardVelocity + gas * acceleration, -maxSpeed, maxSpeed)) * forward, ForceMode.Force);
        }

        float handlingMultiplier = handlingCurve.Evaluate(Mathf.Abs(currentForwardVelocity) / maxSpeed);

        if (steer > float.Epsilon || steer < -float.Epsilon)
        {
            forward = Quaternion.AngleAxis(steer * maxTurnRate * handlingMultiplier * Mathf.Sign(currentForwardVelocity), up) * forward;
        }

        ApplyFloatation();
        ApplyOrientator();

        ApplyFriction();
    }
    private void ApplyFriction()
    {
        float currentHorVelocity         = Vector3.Dot(CarBody.velocity, right);
        float velocityFrictionMultiplier = frictionCurve.Evaluate(currentHorVelocity / maxSpeed);

        float forceToStop = PhysicsHelpers.CalculateRequiredForceForSpeed(CarBody.mass, currentHorVelocity, 0);

        CarBody.AddForce(right * forceToStop * velocityFrictionMultiplier, ForceMode.Force);

        Vector3 correctionTorque         = CarBody.CalculateRequiredTorqueForRotation(castedOrientation, Time.fixedDeltaTime, maxCorrectionTorque);
        float   maxTorque                = 20;
        float   correctionTorqueAmount   = Vector3.Dot(correctionTorque, up);
        float   torqueFrictionMultiplier = frictionCurve.Evaluate(correctionTorqueAmount / maxTorque);

        CarBody.AddTorque(up * correctionTorqueAmount, ForceMode.Force);
    }
    private void ApplyFloatation()
    {
        Vector3 expectedFloatingForce = CalculateFloatingForce();

        CarBody.AddForce(expectedFloatingForce, ForceMode.Force);
    }