Skip to content

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 HandGazeInteractor semantics).
  • Drives a real @pmndrs/pointer-events pointer 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 ​

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 ​

readonly filter: 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 ​

readonly pointer: 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 ​

readonly pointerState: 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 ​

readonly reticle: 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 ​

GazeOrigin


getHeldByHand() ​

getHeldByHand(): GazeHand

Defined in: packages/xr-input/src/pointer/gaze-pointer.ts:1162

Which hand initiated the active gaze-pinch select.

Returns ​

GazeHand


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 ​

GazeFrameContext

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 ​

GazeCandidateProvider

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 ​

GazePointerInput

Returns ​

void

Privacy | Terms