예제 #1
0
        public CharacterInput ApplyStabilization(CharacterInput input, FlightStatistics target, float deltaTime)
        {
            input = ApplyStallPrevention(input, target, _userConfig.StallLimiterStrength, _userConfig.RollLimiterStrength);

            var stabilityInput = CharacterInput.Zero;

            // Update gyroscopic stability
            var error = GetGyroError(deltaTime, target, _lastGyroError, _c.ErrorSmoothingSpeed);

            _lastGyroError = error;
            var pids           = GetGyroPidOutputs(error);
            var gyroCorrection = PidOutputToCharacterInput(pids);

            gyroCorrection      = CharacterInput.Lerp(_lastGyroCorrection, gyroCorrection, _c.StabilityCorrectionSpeed * deltaTime);
            _lastGyroCorrection = gyroCorrection;
            stabilityInput     += gyroCorrection;

            // Apply stability overrides (Player input cancels out stabilization effects)
            var stabilityOverride = GetStabilityOverrides(input, _c.MaxStabilityOverride);

            stabilityInput = ApplyStabilityOverride(stabilityInput, stabilityOverride);

            input += stabilityInput;

            // Apply speed scaling to summed inputs
            float normalizedSpeed = Mathf.Clamp01(target.RelativeVelocity.magnitude / _c.MaxSpeed);

            return(ApplySpeedScaling(input, normalizedSpeed, _userConfig.InputSpeedScaling, 1.5f));
        }
예제 #2
0
 public CharacterInput SmoothInput(CharacterInput input, float deltaTime)
 {
     _smoothPlayerInput = CharacterInput.Lerp(_smoothPlayerInput, input, _c.InputSmoothingSpeed * deltaTime);
     return(_smoothPlayerInput);
 }