Skip to main content
Filters process raw tracking data to reduce noise, smooth movement, and improve tracking quality. OpenTrack includes several filter types optimized for different use cases.

Filter System Overview

Filters implement the IFilter interface:

Module Selection

Available Filters

Adaptive smoothing based on head velocity. Provides strong smoothing at rest and minimal lag during fast movements.Best for: General gaming and simulationImplementation:
How it works:
  1. Calculate velocity (change per frame)
  2. Map velocity through spline curve to get smoothing factor
  3. Apply exponential smoothing based on factor
Advantages:
  • 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

This provides strong smoothing when still, but reduces lag during fast movements.

Rotation vs Translation

Typically needs less aggressive smoothing:
Head rotation is generally smoother than position tracking.
High smoothing values (>0.95) can cause significant lag. Balance smoothness with responsiveness based on your tracker quality.

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

Don’t assume constant frame rate - Pipeline runs at ~250Hz but varies
Don’t introduce NaN/Infinity - Check for invalid math operations
Don’t block - Filter runs in tracking thread, keep it fast

Troubleshooting

  1. Reduce smoothing factor (Accela: lower curve values)
  2. Make curve steeper (faster response at higher velocities)
  3. Try EWMA with higher alpha (0.7-0.9)
  4. Check if game has additional filtering
  1. Increase smoothing at low velocities
  2. Check tracker quality and lighting
  3. Try Hamilton filter for better noise handling
  4. Verify tracker is running at stable frame rate
  1. Verify filter is selected in modules
  2. Check filter initialization didn’t fail
  3. Restart tracking after changing filter
  4. Check OpenTrack logs for errors
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)
All filters are designed to run efficiently at 250Hz.

Next Steps

Mapping Curves

Fine-tune response after filtering

Configuration

Advanced tracking settings

Tracker Setup

Improve tracking quality at the source