Eye Tracking Data
1. Overview
SightLab exports eye tracking data including:
The x, y, z coordinates of the gaze intersection point (combined and per eye)
Rotational values for each eye (left and right)
2. Coordinate System
2.1 Intersect Point Coordinates
System: 3D Cartesian coordinate system (X, Y, Z)
Origin: Center of the virtual environment
Axes:
Positive X: Extends to the right
Positive Y: Extends upward
Positive Z: Extends outward from the screen
Units: Meters
Reference: Coordinates are relative to the parent object's coordinate system
2.2 Eye Rotation
Represents the rotational orientation of each eye
Measured in degrees
Represented as Euler angles
3. Data Types
3.1 Gaze Intersection Data
Combined gaze: x, y, z coordinates of where the combined gaze intersects with objects in the scene
Individual eye gaze: x, y, z coordinates for each eye's gaze intersection
3.2 Eye Rotation Data
Left eye rotation: Rotational values for the left eye in Euler angles
Right eye rotation: Rotational values for the right eye in Euler angles
4. Data Collection Process
The eye tracking data is collected and processed in the updateGazeObject function within the "sightlab" module. Here's a breakdown of the process:
Retrieve the eye tracker's transformation matrix
Combine it with the main view matrix to get the gaze direction in the virtual environment
Create a line representing the gaze direction
Check for intersection with objects in the scene
Update the gaze point object's position if there's a valid intersection
Record the time, intersection point, main view position, and other relevant flags
5. Code Explanation
def updateGazeObject(self):
self.eyeTracker = vizconnect.getTracker('eye_tracker').getRaw() gazeMat = self.eyeTracker.getMatrix()
gazeMat.postMult(viz.MainView.getMatrix())
line = gazeMat.getLineForward(1000)
info = viz.intersect(line.begin, line.end)
if info.valid and self.gazePointObject is not None:
self.gazePointObject.setPosition(info.point)
The function retrieves the eye tracker's matrix, which represents its position and orientation
It combines this with the main view matrix to get the gaze direction in the virtual environment
A line is created to represent the gaze direction
The viz.intersect() function checks if this line intersects with any objects in the scene
If there's a valid intersection, the gaze point object's position is updated to the intersection point
For Individual Eye Data
def updateTrialData(self, currentTime, point, eyeTracker, maxDistance, label):
leftGazeMat = eyeTracker.getMatrix(viz.LEFT_EYE)
leftEuler = leftGazeMat.getEuler()
leftGazeMat.postMult(viz.MainView.getMatrix())
line = leftGazeMat.getLineForward(maxDistance)
leftInfo = viz.intersect(line.begin, line.end)
#leftEuler = vizmat.AngleBetweenVector(viz.MainView.getMatrix().getForward(), leftGazeMat.getForward())
if leftInfo.valid:
left_eye = leftInfo.point
else:
left_eye = vizmat.MoveAlongVector(line.begin, line, maxDistance)
rightGazeMat = eyeTracker.getMatrix(viz.RIGHT_EYE)
rightEuler = rightGazeMat.getEuler()
rightGazeMat.postMult(viz.MainView.getMatrix())
line = rightGazeMat.getLineForward(maxDistance)
#rightEuler = vizmat.AngleBetweenVector(viz.MainView.getMatrix().getForward(), rightGazeMat.getForward())
rightInfo = viz.intersect(line.begin, line.end)
if leftInfo.valid:
right_eye = rightInfo.point
else:
right_eye = vizmat.MoveAlongVector(line.begin, line, maxDistance)
Retrieves gaze matrices for the left and right eyes from the eye tracker.
Extracts the Euler angles (orientation) from these gaze matrices.
Transforms the gaze matrices to the main view's coordinate system.
Creates forward gaze lines from the eye positions to a specified maximum distance.
Performs intersection tests to check if these gaze lines intersect with any objects in the virtual environment.
Records the intersection points if valid; otherwise, records the points at the maximum distance along the gaze lines.
Updates the trial data with the calculated gaze intersection points and Euler angles for both eyes.
6. Data Usage and Interpretation
The x, y, z coordinates of the intersection point represent where the user's gaze meets objects in the virtual environment
Combined gaze data can be used for general gaze tracking, while individual eye data allows for more detailed analysis
Eye rotation data can be used to analyze eye movements and potentially detect specific eye behaviors
7. Additional Data
Additional data based on the VR system in use (e.g., pupil diameter, eye openness)
Fixation State: Indicates whether the gaze is in a fixation or saccade state
Saccade Angle: The angle of eye movement during a saccade
Saccade Velocity: Average and peak velocity during a saccade
Retrieving the count of views or gaze events for each object in a scene.
Calculating the total gaze duration and the average gaze duration per object based on total gaze time divided by the number of gaze events.
Time to First Fixation: Measuring the time it takes for a participant to first fixate on a specific area of interest after a stimulus is presented.
Fixation Sequence Analysis: The order in which different areas of interest are fixated upon, which can indicate the cognitive process or strategy employed by the viewer.
Heatmaps
Scan Paths
Walk Paths
Interactive playback
Area of Interest (AOI) Analysis: Defining specific regions within the visual scene to examine how much and how long subjects look at these areas.
Gaze Contingent Display: Changing what is shown on the screen based on where the user is looking, often used in dynamic experiments.
For more information see the eye tracking metrics page
Sample Trial Data