The Accela filter is the simplest filter to configure - it has only 4 parameters and uses predefined acceleration curves for responsiveness.
How It Works
The Accela filter calculates delta (rate of change) for each axis, applies a deadzone, then looks up a multiplier from a spline curve based on the velocity:- Calculate delta:
delta = input - last_output - Apply deadzone: Suppress movement below threshold
- Normalize: Divide by sensitivity threshold
- Spline lookup: Get multiplier from acceleration curve
- Apply: Scale and integrate delta over time
Acceleration Curves
The filter uses predefined spline curves that map normalized velocity to output multiplier: Rotation spline:Understanding the spline curves
Understanding the spline curves
The X-axis represents velocity normalized by the sensitivity parameter.
- X = 1.0 means moving at exactly the sensitivity threshold
- X = 2.0 means moving twice as fast
- X = 0.5 means moving at half the threshold
- Y = 1.0 means output equals input (no acceleration)
- Y > 1.0 means output is amplified (acceleration)
- Y < 1.0 means output is reduced (smoothing)
Algorithm
Rotation Processing
Translation Processing
Vector-Proportional Processing
Thedo_deltas function ensures that the X/Y/Z components maintain their relative proportions:
The filter multiplies output by
dt (delta time) to ensure frame-rate independence. The same settings work regardless of tracking frequency.Parameters
The Accela filter has only 4 parameters:slider
default:"1.5"
Rotation sensitivity threshold (degrees/sec).
- Lower values: More aggressive acceleration, faster response
- Higher values: More smoothing overall, slower response
1.5slider
default:"1.0"
Translation sensitivity threshold (cm/sec).
- Lower values: More acceleration, faster positional response
- Higher values: More smoothing, slower positional response
1.0slider
default:"0.03"
Rotation deadzone in degrees. Movements below this are set to zero.
- Too low: Visible jitter when trying to hold still
- Too high: Small movements feel unresponsive
0.03°slider
default:"0.1"
Translation deadzone in centimeters. Movements below this are set to zero.Default:
0.1 cm (1mm)Tuning Guide
For Fast Action Games (Recommended)
Minimize lag and maximize acceleration:Why these settings?
Why these settings?
- Low sensitivity thresholds = aggressive acceleration kicks in early
- Small deadzones = don’t suppress intentional micro-movements
- Fast movements get huge multipliers from the spline
For Flight Simulators
Balance smoothness with responsiveness:Why these settings?
Why these settings?
- Higher sensitivity thresholds = more smoothing overall
- Larger deadzones = eliminate cockpit vibration jitter
- Still responsive for intentional head movements
For Racing Simulators
Smooth left/right with responsive lean:Why these settings?
Why these settings?
- Moderate rotation sensitivity = smooth panning to look at apex
- Lower translation sensitivity = fast lean response for g-forces
- Balanced deadzones for stability during vibration
Sensitivity vs Smoothing
The sensitivity parameter is inverse to smoothing:
Example:
- You move your head 2.0°/sec
- Rotation sensitivity is 1.0
- Normalized velocity = 2.0 / 1.0 = 2.0
- Spline at X=2.5 gives Y=35 multiplier
- Output delta = 2.0 * 35 = 70°/sec
- This creates fast acceleration
Deadzone Behavior
The Accela filter uses hard deadzones that subtract from the delta:- Delta is set to 0
- No output movement
- Deadzone amount is subtracted
- Example: delta=0.05, deadzone=0.03 → effective delta=0.02
- This creates a smooth transition
- Deadzone subtraction is negligible
- Full acceleration effect
The deadzone subtraction prevents a sudden jump when exiting the deadzone. The transition is continuous.
Vector Processing Details
Thedo_deltas function processes X/Y/Z as a 3D vector to maintain proportional movement:
- Diagonal movements don’t favor one axis
- Proportions between X/Y/Z are preserved
- No “staircase” effect on diagonal tracking
Why vector processing matters
Why vector processing matters
Without vector processing, if you move diagonally:
- X delta = 1.0, Y delta = 1.0
- Both would lookup spline(1.0) independently
- Output would favor axis-aligned movement
- Distance = sqrt(1^2 + 1^2) = 1.414
- Lookup spline(1.414) once
- Split proportionally: X=0.707, Y=0.707
- Maintains diagonal direction precisely
Frame-Rate Independence
The filter multiplies output bydt (time since last frame):
- At 60 FPS: dt ≈ 0.0167, small increments
- At 120 FPS: dt ≈ 0.0083, even smaller increments
- Same position reached regardless of frame rate
You don’t need to adjust settings when changing tracker frequency. The filter automatically compensates.
Comparison to Other Filters
When to choose Accela
When to choose Accela
Choose Accela if:
- You play fast-paced action games
- You want aggressive acceleration on fast movements
- You prefer simple, predictable settings
- You want minimal CPU overhead
- You want automatic noise adaptation (use EWMA)
- You need quaternion rotation (use Hamilton)
- You want predictive filtering (use Alpha Spectrum)
- You need separate rotation/translation curves
Troubleshooting
Movements feel too fast/twitchy
Movements feel too fast/twitchy
- Increase sensitivity values (rotation and/or translation)
- This shifts you down the spline curve, reducing multipliers
- Try increasing by 0.3-0.5 at a time
Feels laggy/sluggish
Feels laggy/sluggish
- Decrease sensitivity values
- This shifts you up the spline curve, increasing multipliers
- Try decreasing by 0.2-0.3 at a time
Jitter when holding still
Jitter when holding still
- Increase deadzones slightly
- Rotation: try 0.05-0.08
- Translation: try 0.15-0.25
- Check tracker mounting for vibration
Small movements ignored
Small movements ignored
- Decrease deadzones
- Minimum useful values:
- Rotation: 0.01-0.02
- Translation: 0.05-0.08
- Below this, sensor noise dominates
Diagonal movements feel wrong
Diagonal movements feel wrong
This should not happen - the filter uses vector processing.Check that you’re using a recent version of OpenTrack. Older versions may have per-axis processing.
Advanced: Custom Spline Curves
The spline points are defined inaccela-settings.hpp:
- More aggressive: Increase Y values at high X
- More smoothing: Decrease Y values at low X
- Steeper curve: Increase the difference between adjacent points
- Flatter curve: Decrease the difference between adjacent points
Code Reference
Relevant source files:- Implementation:
filter-accela/ftnoir_filter_accela.cpp - Header:
filter-accela/ftnoir_filter_accela.h - Settings/splines:
filter-accela/accela-settings.hpp - Dialog:
filter-accela/ftnoir_filter_accela_dialog.cpp
Key Functions
Vector processing (ftnoir_filter_accela.cpp:24-64):
ftnoir_filter_accela.cpp:74-162):
Next Steps
Filter Overview
Compare all available filters
Alpha Spectrum
Advanced adaptive filter
EWMA Filter
Automatic noise-adaptive filtering
Hamilton Filter
Quaternion-based smooth rotations