Fixation detection can give you a detailed understanding of what exactly your users are focusing on. Fixations are calculated using eye tracking, so only certain HMDs are supported.
Perception from the human eye is limited unless the eye is relatively stable. This stable point is called a fixation. When the eye is moving relative to the user's head, it is likely a saccadic movement or saccade. If the fixation is on a moving object, the eye can follow that fixation as a smooth pursuit movement. By default, when the eye movement is relatively stable for 60 milliseconds, the user has begun fixating on that point. This can be changed with the MinFixationMS variable.
The Cognitive3D method for detecting fixations uses a dispersion threshold technique - that is, it assumes gaze in the same direction is part of the same fixation. By default, directions within 1° are counted as the same fixation and can be adjusted as the MaxFixationAngle variable.
A fixation is projected into world space, so if the user moves around the environment, they can continue to fixate on the same point from different angles.
In Unity and Unreal, there is an optional curve that sets a larger fixation angle toward the edge of the HMD screen. This helps sustain fixations if the user is looking at an extreme angle.
If the user's gaze is outside of this direction for 10 milliseconds, the fixation will end. This is configurable as the SaccadeFixationEndMs parameter.
A fixation doesn't necessarily end when a user blinks. When a user's eyes close, 20 milliseconds of previously recorded gaze are discarded, configurable as PreBlinkDiscardMs. When the user's eyes open, 100 milliseconds of gaze are discarded as BlinkEndWarmupMs.
By default, the longest allowed blink duration is 400 milliseconds. Any longer than this value and the user can be assumed to be actively keeping their eyes closed and the fixation will end.
Fixating on Occluded Points
If the user is fixating on a point and something moves in front of the user's gaze, the fixation will continue. This is useful when fast moving objects quickly pass the user's gaze. If the user begins fixating on the new object, there will likely be a saccade (which will end the fixation on the occluded point) as the eyes move to begin a new fixation.
Dynamic Objects and Smooth Pursuit
We record fixations in the context of the scene during the experience - this allows us to record fixations on moving objects with a Dynamic Object component. A fixation on a moving object is generally refered to as a smooth pursuit movement of the eyes. Internally, there is no difference when detecting a fixation on a dynamic object whether it is moving or stationary.
The Maximum Fixation Angle is increased slightly when fixating on a dynamic object to allow fixations during erratic movements. This value is 1.25 by default, configurable as DynamicFixationSizeMultiplier.
The fixation will end if the user's gaze does not directly hit the dynamic object for 500 milliseconds. This is useful when the user is trying to look past a dynamic object, especially if multiple dynamic objects are placed in close proximity to each other. However, this can have issues if looking at very small dynamic objects. This is configurable as MaxConsecutiveOffDynamicMs.
The fixation ends immediately if the dynamic object is disabled or destroyed.