Skip to main content

Eye

Regular • File: EyeTracking.csv • Writer: LaboEyeTrackingDataWriter.cs

Media

At a glance

Eye tracking captures gaze data for three eye positionsEye_Center_*, Eye_Left_*, Eye_Right_* — each with a block of position, direction, and device-specific columns produced by SilicoEyeUtility.ColumnNamesEyes(prefix). This is a regular per-frame stream; gaze is a continuous signal and every frame gets a row when the gate passes.

For stimulus-locked gaze analysis (what were they looking at when stimulus X appeared?), combine this with ExperienceState's EventNumber column.

When it writes

LateUpdate, provided:

  • Eye data capture is enabled in settings, AND
  • Eyes are currently tracked (HMD on, eye tracker engaged), AND
  • A head skeleton is assigned.

An Update() phase call refreshes the skeleton / gaze data internally so that the LateUpdate write captures fresh values — you don't need to do anything for this to work, just know that there is a two-phase refresh happening.

File & location

  • Default: EyeTracking.csv in the run directory.
  • Writer: LaboEyeTrackingDataWriter.cs.
  • Columns: SilicoEyeUtility.ColumnNamesEyes(prefix) for each of Center / Left / Right.

Configuration

Gated by the eye-capture setting, eye-tracking being live, and the head skeleton being assigned. No dedicated ScriptableObject — it follows the experience's skeleton configuration.

Columns

Shared prefix

See Column conventions — The shared prefix.

Per-eye blocks

Three blocks, one per eye, in order: Center, Left, Right. Each block follows the placeholder convention Eye_[eye]_*:

ColumnTypeUnitsDescription
Eye_[eye]_PosX, Eye_[eye]_PosY, Eye_[eye]_PosZfloatmetresEye position in environment coordinates.
Eye_[eye]_DirX, Eye_[eye]_DirY, Eye_[eye]_DirZfloatunit vectorGaze direction (normalised).
Eye_[eye]_HitTexture, Eye_[eye]_HitUV*, Eye_[eye]_HitObject (if present)variesDevice / scene-specific hit-test columns — which object / texture the gaze ray is currently intersecting. Availability depends on the skeleton / device.

Expand [eye] to Center, Left, or Right. So a concrete column is e.g. Eye_Center_DirZ or Eye_Left_PosX.

Center is typically a cyclopean average of the two eyes; Left and Right are per-eye data when the tracker exposes them.

Sample rows

...shared...,Eye_Center_PosX,Eye_Center_PosY,Eye_Center_PosZ,Eye_Center_DirX,Eye_Center_DirY,Eye_Center_DirZ,Eye_Left_PosX,...,Eye_Right_PosX,...
...,0.0,1.72,-2.5,0.0,0.0,1.0,-0.03,...,0.03,...
...,0.0,1.72,-2.5,0.05,0.02,0.99,-0.03,...,0.03,...

Join with other streams

Standard FrameNumber join to ExperienceState:

import pandas as pd
exp = pd.read_csv("ExperienceState.csv")
eye = pd.read_csv("EyeTracking.csv")
joined = exp.merge(eye, on="FrameNumber", how="left", suffixes=("_exp", "_eye"))

# Mean forward-gaze Z component per epoch:
joined.groupby("EpochName")["Eye_Center_DirZ"].mean()

Gotchas

  • Device support varies. Requires an eye-tracking-capable HMD (Meta Quest Pro and similar). On unsupported devices there will be no file, or the values will be static.
  • Tracker dropout is common. Blinks, off-axis gaze, or tracker reacquisition can produce frames with zeroed or stale values. Check for (0, 0, 0) direction vectors and handle them — typically mask out or interpolate.
  • Center is derived. On most devices, Eye_Center_* is computed as a midpoint / averaged cyclopean eye. If you need ground-truth per-eye data for vergence / convergence analyses, use Eye_Left_* and Eye_Right_*.
  • HitTexture / HitObject columns are scene-dependent. If present, they identify what the gaze ray is intersecting in the environment. Their availability and semantics depend on the skeleton / device — check the header.
  • Direction is in environment coordinates, not head-local. If you want head-relative gaze (where are they looking relative to forward?), rotate by the inverse of head rotation from Participant.

Analysis recipes

  • Gaze paths — the canonical Eye analysis. Paths, dwell times, saccade detection.
  • Stimulus-locked averaging — epoch-aligned gaze around stimulus onset (classic attention-capture analysis).