Class: GazePointer
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:513
Singleton gaze pointer. Peer of MultiPointer in XRInputManager.
Remarks
- One global instance — gaze has no handedness.
- Samples the WebXR gaze target ray itself via GazePointer.sampleGazePose, publishing the result to XROrigin.eyeSpace. The hand/controller ray owns far targeting when a gaze source is unavailable. GazePointerOptions.diagnostics explains the silent failure modes.
- Candidate selection is delegated to a GazeCandidateProvider; the default GazeConecaster does OBB cone membership and time-weighted dwell consensus while this pointer resolves surfaces with the same pmndrs ray intersector used for event delivery.
- Selector composes either hand's pinch; once selecting, the other hand is ignored until release (per-hand mutual exclusion, matching Meta Interaction SDK's
HandGazeInteractorsemantics). - Drives a real
@pmndrs/pointer-eventspointer so UIKit panels click naturally on gaze-pinch. - Keeps its optional debug reticle hidden by default. Production feedback belongs on the hovered target, matching Meta Interaction SDK.
Constructors
Constructor
new GazePointer(
xrOrigin,scene,camera,options):GazePointer
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:606
Parameters
xrOrigin
scene
Scene
camera
PerspectiveCamera
options
GazePointerOptions = {}
Returns
GazePointer
Properties
diagnosticsEnabled
diagnosticsEnabled:
boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:534
See GazePointerOptions.diagnostics.
filter
readonlyfilter:FilteredEyeGaze
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:540
OneEuro smoother applied to the raw gaze pose. Public so hosts can retune minCutoff/beta from config without rebuilding the pointer.
pointer
readonlypointer:Pointer
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:549
Real @pmndrs/pointer-events Pointer driven by the filtered gaze ray. Each frame: pose-update + pointer.move(scene) raycasts from the gaze origin so UIKit and any other pointer-events listeners see enter/leave/ move events from the gaze just like they do from the hand ray. On pinch we forward down/up with button: 0 so click fires naturally.
pointerState
readonlypointerState:GazePointerState
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:550
pointerTransformFollowsHand
pointerTransformFollowsHand:
boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:518
provider
provider:
GazeCandidateProvider
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:516
reticle
readonlyreticle:Mesh<CircleGeometry,MeshBasicMaterial>
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:514
showDebugReticle
showDebugReticle:
boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:519
suppressWhenDirectPointerActive
suppressWhenDirectPointerActive:
boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:517
Accessors
trackingLossGraceSeconds
Get Signature
get trackingLossGraceSeconds():
number
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:523
Returns
number
Set Signature
set trackingLossGraceSeconds(
value):void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:527
Parameters
value
number
Returns
void
Methods
canTarget()
canTarget():
boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:769
Whether this frame has a pose that is safe to use for fresh targeting.
Returns
boolean
dispose()
dispose():
void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1206
Returns
void
getCurrentTarget()
getCurrentTarget():
Object3D<Object3DEventMap>
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1157
Current dwell winner's root Object3D (null if none/suppressed).
Returns
Object3D<Object3DEventMap>
getDirection()
getDirection():
Vector3
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1177
World-space gaze direction (post-filter, unit length).
Returns
Vector3
getGazeOrigin()
getGazeOrigin():
GazeOrigin
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1184
Whether a valid gaze pose is available this frame.
Returns
getHeldByHand()
getHeldByHand():
GazeHand
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1162
Which hand initiated the active gaze-pinch select.
Returns
getOrigin()
getOrigin():
Vector3
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1172
World-space gaze origin (post-filter).
Returns
Vector3
isSelecting()
isSelecting():
boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1167
True while a gaze-pinch select is held.
Returns
boolean
ownsFarTargeting()
ownsFarTargeting(
time):boolean
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:755
Whether gaze mode should own far targeting this frame.
This mirrors ISDK's mode/source distinction: a valid pose activates gaze; then a short grace period keeps the mode active when a frame's pose is invalid (for example, a blink), while targeting itself clears. WebXR does not expose a separate pose-validity signal, so source enumeration defines the lifetime of that grace period. Removing the source hands far targeting back to hands/controllers immediately; the grace period applies only to temporary pose invalidity (for example, a blink).
Parameters
time
number
Returns
boolean
reset()
reset():
void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1193
Reset filter, provider, selector and diagnostic state. Call when gaze becomes invalid (session ended, eye tracking lost) so we don't carry stale samples, and so the next session re-reports its gaze verdict.
Returns
void
sampleGazePose()
sampleGazePose(
time,context):void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:702
Read the gaze target ray off the live frame and write it into XROrigin.eyeSpace.
This mirrors the standalone WebXR eye-gaze diagnostic page's probe: find the input source whose targetRayMode is 'gaze', then pose its targetRaySpace against the frame's reference space, tolerating a throw. The source can exist while getPose returns null (uncalibrated headset, withheld permission), so source presence and pose validity are tracked separately. A missing or invalid pose clears the current gaze pose so stale tracking can never be used for targeting.
Call once per frame before GazePointer.update.
Parameters
time
number
context
Returns
void
setAttached()
setAttached(
attached):void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:679
Add or remove the pointer's rig nodes (debug reticle and ray space).
The pointer is constructed eagerly by XRInputManager so systems can hold a stable reference, but an app that never uses gaze shouldn't pay for gaze geometry in every rig matrix walk — so nothing is parented until gaze is actually switched on.
Parameters
attached
boolean
Returns
void
setCandidateProvider()
setCandidateProvider(
provider):void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:777
Swap the candidate provider at runtime (e.g. a multi-cone or dwell-only provider). The previous provider is reset and detached.
Parameters
provider
Returns
void
update()
update(
targetingAvailable,dt,time,input):void
Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:782
Parameters
targetingAvailable
boolean
dt
number
time
number
input
Returns
void