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:Rotation sensitivity threshold (degrees/sec).
- Lower values: More aggressive acceleration, faster response
- Higher values: More smoothing overall, slower response
1.5Translation sensitivity threshold (cm/sec).
- Lower values: More acceleration, faster positional response
- Higher values: More smoothing, slower positional response
1.0Rotation 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°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:| Sensitivity | Effect on Normalized Velocity | Smoothing |
|---|---|---|
| Low (0.5) | Delta of 1.0°/s → X=2.0 on spline | Less |
| Medium (1.5) | Delta of 1.0°/s → X=0.67 on spline | Medium |
| High (2.5) | Delta of 1.0°/s → X=0.4 on spline | More |
- 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
| Feature | Accela | EWMA | Hamilton | Alpha Spectrum |
|---|---|---|---|---|
| Complexity | Low | Medium | Medium | High |
| Parameters | 4 | 3 | 8 | 8+ |
| Adaptation | Velocity | Noise | Distance | Multi-modal |
| CPU usage | Low | Low | Low | Medium |
| Best for | Fast action | Auto smooth | Cinematic | Advanced users |
| Deadzones | Hard subtract | None | Soft ramp | Soft ramp |
| Vector processing | ✅ Yes | ❌ No | ❌ No | ❌ No |
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