A module for working with Tobii Eye Tracking in VRCFaceTracking.
VR headsets (wearable streams):
- HP Reverb G2 Omnicept Edition.
- Pimax Crystal.
- and more.
Desktop (screen-based) trackers:
- Tobii Eye Tracker 5.
- other screen-based Tobii devices exposing the consumer streams.
The module auto-detects the device type: if the wearable streams are not available it derives per-eye gaze from the on-screen gaze point, the per-eye 3D eye positions and the physical screen geometry (see Desktop mode).
- Download and install VRCFaceTracking
- Download the archive with the module from release
- Run VRCFaceTracking
- Go to the "Module Registry" tab
- Click "+ Install Module From .zip"
- Select the downloaded archive
- Done!
Screen-based trackers such as the Eye Tracker 5 (feature group consumer)
support neither the wearable streams nor the licensed per-eye gaze_data
stream. Instead, this module reconstructs per-eye gaze directions from what
the device does provide:
| Stream | Rate | Used for |
|---|---|---|
gaze_point |
~33 Hz | combined gaze position on screen (0..1) |
gaze_origin |
~33 Hz | per-eye 3D positions in mm |
head_pose |
~25 Hz | optional eye-in-head compensation |
user_presence |
events | suspending output while away |
tobii_get_display_area |
once | physical screen plane incl. mounting tilt |
For each gaze sample the screen target is converted to millimeters on the
screen plane reported by the Tobii software, and each eye's direction is
normalize(target - eye_origin). This recovers true per-eye vergence
(validated on hardware: the L/R angle difference matches 2*atan(IPD/2 / distance) within a few percent).
Eye openness is inferred from per-eye tracking validity (a closed eye loses
tracking), debounced over blink_debounce_samples. Pupil diameter is not
available on consumer devices — that data requires a professional license.
Setup:
- Configure and calibrate the tracker in the Tobii Experience software (this is where the module gets the screen geometry from).
- Install the module; it selects desktop mode automatically.
Config options in config.json:
| Option | Default | Meaning |
|---|---|---|
mode |
auto |
auto / wearable / screen source selection |
screen_width_mm |
0 |
screen size override; 0 = use the Tobii display area (recommended) |
screen_height_mm |
0 |
see above |
screen_curvature_radius_mm |
0 |
cylinder radius for curved monitors (e.g. 1800 for 1800R); 0 = flat |
screen_head_compensation |
false |
rotate gaze into the head frame (eye-in-head angles) using head_pose |
gaze_degrees_scale |
1.8 |
linear gain on the gaze angles, same meaning as in standalone mode (VRCFT's atan conversion is pre-compensated, so the game receives exactly angle × scale); does not affect vergence |
vergence_scale |
0.0 |
how much true eye vergence to keep — VRChat infers focus distance from it when the eye raycast is off: 0 = parallel eyes (focus far, never cross-eyed), 1 = true screen distance (~0.55 m), >1 exaggerated |
blink_debounce_samples |
2 |
invalid samples (~30 ms each) before an eye counts as closed |
eyelid_transition_ms |
100 |
linear blink animation time for a full open↔close sweep; 0 = instant |
combined_eyelids |
true |
one shared eyelid value, open unless both eyes closed — avoids winks becoming "both eyes 0.5" on combined-lid outputs; set false for avatars with per-eye lids |
On a curved monitor, the calibrated gaze point is pixel-anchored, so the screen target is mapped onto a cylinder anchored at the display corners (uniform arc length, center sagging away from the user) instead of a flat plane.
Standalone\TobiiStandalone.exe connects to the tracker directly and sends
VRChat's native eye tracking OSC, bypassing VRCFaceTracking entirely:
/tracking/eye/CenterPitchYawDist— combined gaze in raw physical degrees plus the true focus distance in meters (computed from the eye-to-screen geometry), so VRChat handles convergence itself./tracking/eye/EyesClosedAmount— eyelid value with the same debounce, blink animation and combined-eyelid behavior as the module.
When to use it: avatars without face-tracking parameters (VRChat native eye tracking only). For FT avatars keep using the VRCFT module instead.
Important
Do not run the exe and the VRCFT module at the same time — both would send native eye tracking and fight each other.
Config (config.json next to the exe): mode, screen_width_mm,
screen_height_mm, screen_curvature_radius_mm, blink_debounce_samples,
eyelid_transition_ms, combined_eyelids work as in the module table above,
plus:
| Option | Default | Meaning |
|---|---|---|
vrchat_host |
127.0.0.1 |
OSC destination |
vrchat_port |
9000 |
VRChat's OSC input port |
gaze_degrees_scale |
1.8 |
multiplier on the sent pitch/yaw degrees |
When gaze leaves the screen the gaze message stops, and VRChat reverts to auto-look after its 10 second timeout.
Important
You must have a file with a valid license, otherwise the module will not work in "advanced" mode!
Or you can use the workaround: Broken Eye
By default, the module is loaded without a license, which allows you to use it to track combined gaze direction and eye opening/closing.
The "Advanced" mode allows you to track the gaze direction for each eye separately, as well as get information about the pupil diameter.
For this, you must have a valid license, in which is indicated
"featureGroup": "professional"
(you can see an example in the file license.example.json)
It needs to be placed in the module folder
C:\Users\<USERNAME>\AppData\Roaming\VRCFaceTracking\CustomLibs\324b3cd5-5e64-4f3f-b056-12340badc0de
# Or paste into the address bar of the explorer to open the folder
%APPDATA%\VRCFaceTracking\CustomLibs\324b3cd5-5e64-4f3f-b056-12340badc0de
under the name license.json
After launching VRCFaceTracking, make sure that the module has loaded your license, it should be in the "Output" tab:
...
[TobiiAdvanced] Information: Loading license...
[TobiiAdvanced] Information: Creating device with license.
[TobiiAdvanced] Information: Connected to platform module with build version "<version>"
[TobiiAdvanced] Information: Subscribe to advanced data.
...
If instead you see:
[TobiiAdvanced] Information: No license found in <redacted>
It means the license was not found, check the path and file name.
And if you see:
...
[TobiiAdvanced] Warning: License validation failed: TOBII_LICENSE_VALIDATION_RESULT_TAMPERED
...
It means you are using an invalid license, check its content.
Most likely you can only wait until the manufacturer of the device you are using gets a license from Tobii.
There is a workaround that will allow you to obtain data on the direction of gaze for each eye separately, the diameter of the pupil, and even receive images from cameras! And all this without a “professional” license!
The software is called Broken Eye and can be downloaded here.
