Over five years, we have completed more than 20 Eye Tracking integrations in VR projects — from prototypes on Quest 3 to enterprise solutions on Varjo XR-3. The main pain point for clients is a tight GPU budget, with Fixed Foveated Rendering saving only 10–15%. Dynamic FFR with Eye Tracking squeezes out up to 25% performance. However, simply connecting the SDK and reading gaze direction is not enough: raw data is noisy, requires filtering, and each interaction type needs its own logic. Our engineers are Meta XR and OpenXR certified, ensuring stable operation across all supported headsets.
Platforms and SDKs
Meta Quest Pro / Quest 3
Meta provides Meta Movement SDK (formerly OVRPlugin). The OVREyeGaze component and low-level OVRPlugin.GetEyeGazesState() allow you to obtain gaze direction, eye openness, and pupil dilation. Accuracy after calibration is ±1.5–3°. Permission must be requested via OVRPermissionsRequester before use.
OpenXR
The cross-platform pathway uses the XR_EXT_eye_gaze_interaction extension. In Unity, connect via XR Interaction Toolkit 2.3+ — GazeInteractor and GazeInteractable. One codebase for all OpenXR-supported headsets: from Quest Pro to Varjo. This reduces maintenance costs and pays off on multi-platform projects.
Tobii XR SDK
For older PC headsets (HTC Vive Pro Eye), the Tobii XR SDK is used. It is an official Unity package but integrates via Windows Mixed Reality. Separate calibration setup is required.
Platform Comparison
| Platform | SDK | Accuracy | FFR Support | Gaze Control |
|---|---|---|---|---|
| Meta Quest Pro | Meta Movement | ±1.5–3° | Dynamic FFR (FB_foveation) | GazeInteractor Oculus |
| Quest 3 | Meta Movement | ±2–3° | Dynamic FFR (FB_foveation) | GazeInteractor Oculus |
| Varjo XR-3 | OpenXR | ±0.5–1° | Foveated rendering | OpenXR Gaze |
| Pico 4 Pro | PICO Motion | ±1.5–2° | Fixed/FFR | PICO Gaze |
| PSVR 2 | Sony SDK | ±1–2° | Dynamic FFR | Sony Eye Tracking |
Comparison of Gaze Data Filtering Methods
| Method | Latency | Smoothness | Implementation Complexity |
|---|---|---|---|
| Exponential filter | ~5 ms | Medium | Low |
| Kalman filter | ~10 ms | High | High |
| One-Euro filter | ~7 ms | High | Medium |
| No filtering | 0 ms | Low (jitter) | None |
How EyeTracked FFR Works
Fixed Foveated Rendering (FFR) renders the periphery at lower resolution, but the center is fixed. Dynamic FFR shifts the high-quality zone with the gaze. On Quest 3, this yields a 15–25% GPU boost — the difference between 72 and 90 FPS in heavy scenes.
Connecting in Unity via OpenXR: enable XR_FB_foveation and XR_FB_foveation_vulkan. For Meta SDK — set OVRManager.eyeTrackingEnabled = true and combine OVRManager.fixedFoveatedRenderingLevel with OVRPlugin.useDynamicFixedFoveatedRendering. Dynamic FFR outperforms Fixed FFR by 20–30% in GPU savings while maintaining quality at the point of gaze.
Why Gaze Cursor Needs Filtering
Raw gaze data contains high-frequency noise of ±0.5–1°. Without filtering, the object under the gaze flickers between selected/unselected. Solution: exponential filter.
// Exponential filter for gaze cursor
smoothedGaze = Vector3.Slerp(smoothedGaze, rawGaze, smoothFactor * Time.deltaTime);
// smoothFactor ≈ 10–15
Additionally, dwell time activation: an object activates if the gaze is held longer than 0.5–1.5 seconds. A visual indicator — arc/ring around the object.
Permissions and Privacy
Eye Tracking requires special permissions in Meta Developer Hub. For publication in Meta Store, a separate policy review is needed: the app must not transmit raw eye data to a server without explicit user consent. In Unity, handle OVRPermissionsRequester and check OVRPlugin.eyeTrackingEnabled. For enterprise solutions, separate legal documentation is required.
Typical Calibration Issues
- Misalignment due to incorrect headset fit
- Floating accuracy after 30 minutes of use (requires recalibration)
- Conflict between different SDKs (e.g., Tobii and OpenXR simultaneously)
What's Included in the Work
- Requirement analysis and optimal SDK selection
- Eye Tracking setup on the target headset
- Gaze cursor implementation with filtering and dwell time
- Dynamic Foveated Rendering integration (if supported)
- Attention analytics collection (heatmaps, gaze duration)
- API documentation and team training
- Post-release support (1 month)
Process and Timeline
- Analysis: determine the platform, SDK, and required permissions (1–2 days).
- Design: choose filtering and interaction approach, prototype (2–3 days).
- Implementation: integrate SDK, set up FFR, gaze logic (4–8 days).
- Testing: verify accuracy, FPS measurements, usability (2–3 days).
- Deployment: build for the target platform, deliver sources and documentation.
Estimated timelines: basic integration (gaze cursor + selection) — 2–4 working days; full (Dynamic FFR + analytics) — 1–2 weeks. The cost depends on complexity and required functionality — contact us for a project assessment. The investment pays off through increased performance and reduced costs for adapting the application to different headsets.
Get a consultation for your VR project: we will analyze the requirements and propose the optimal solution considering your stack and budget. Our engineers have 5+ years of experience and Meta XR certification.





