Filter System Overview
Filters implement the IFilter interface:Module Selection
Available Filters
- Accela
- EWMA
- Hamilton
- None
Accela Filter (Recommended)
Adaptive smoothing based on head velocity. Provides strong smoothing at rest and minimal lag during fast movements.Best for: General gaming and simulationImplementation:- Calculate velocity (change per frame)
- Map velocity through spline curve to get smoothing factor
- Apply exponential smoothing based on factor
- Strong smoothing at rest (reduces jitter)
- Minimal lag during fast movements
- Separate curves for rotation and translation
- Highly configurable
Filter Processing Pipeline
Filters are applied in the tracking pipeline:1
Input
Receive corrected pose data (after camera offset and centering):
2
Filter Processing
Filter processes each frame:
Filters must track their own timing using a timer. Frame rate is not guaranteed to be constant.
3
State Management
Filters maintain internal state:
4
Center Reset
When user centers, filter can reset:
Accela Filter Configuration
The Accela filter is the most powerful and commonly used:Smoothing Curves
Accela uses two spline curves to map velocity to smoothing:Curve Design
1
X-axis: Velocity
Input velocity in degrees/second (rotation) or cm/second (translation)
- 0: At rest (maximum smoothing)
- 50-100: Moderate movement
- 200+: Fast movement (minimal smoothing)
2
Y-axis: Smoothing Factor
Output smoothing strength:
- 0.0: No smoothing (instant response)
- 0.5: Moderate smoothing
- 0.95: Strong smoothing (slow response)
3
Typical Curve
Rotation vs Translation
- Rotation Curve
- Translation Curve
Typically needs less aggressive smoothing:Head rotation is generally smoother than position tracking.
EWMA Filter Configuration
Simpler than Accela, with fixed smoothing:Tuning EWMA
- Alpha = 0.1: Maximum smoothing, high lag
- Alpha = 0.5: Balanced
- Alpha = 0.9: Minimal smoothing, minimal lag
Start with 0.5 and adjust. Lower values = smoother but more lag.
Filter Dialog Interface
Filters can provide live configuration:Live Updates
Custom Filter Development
1
Implement IFilter
2
Handle Timing
3
Register Plugin
Best Practices
Do’s
Use time-based filtering - Account for variable frame rate with dt
Handle first frame - Skip or initialize carefully on first run
Reset on center - Clear accumulated state when user centers
Separate rotation/translation - Different axes need different treatment
Don’ts
Troubleshooting
Too much lag
Too much lag
- Reduce smoothing factor (Accela: lower curve values)
- Make curve steeper (faster response at higher velocities)
- Try EWMA with higher alpha (0.7-0.9)
- Check if game has additional filtering
Still too jittery
Still too jittery
- Increase smoothing at low velocities
- Check tracker quality and lighting
- Try Hamilton filter for better noise handling
- Verify tracker is running at stable frame rate
Filter not applying
Filter not applying
- Verify filter is selected in modules
- Check filter initialization didn’t fail
- Restart tracking after changing filter
- Check OpenTrack logs for errors
Different axes feel wrong
Different axes feel wrong
Configure separate smoothing per axis:
Performance Impact
Filter CPU usage comparison (approximate):- None: 0% overhead
- EWMA: <0.1% CPU
- Accela: <0.5% CPU (includes spline evaluation)
- Hamilton: 1-2% CPU (quaternion and matrix math)
Next Steps
Mapping Curves
Fine-tune response after filtering
Configuration
Advanced tracking settings
Tracker Setup
Improve tracking quality at the source