Skip to content

Basic Usage

Learn the fundamental concepts and APIs of Webgazer.ts.

Quick Start

The simplest way to get eye tracking running:

typescript
import webgazer from '@webgazer-ts/core';

// Start eye tracking
await webgazer.begin();

// Listen to gaze predictions
webgazer.setGazeListener((data, elapsedTime) => {
  if (data) {
    console.log(`Gaze at (${data.x}, ${data.y}) - ${elapsedTime}ms`);
  }
});

Core Concepts

1. Initialization

Before tracking, initialize Webgazer:

typescript
// Basic initialization
await webgazer.begin();

// With configuration
webgazer
  .setRegression('ridge') // Choose regression algorithm
  .setTracker('TFFacemesh') // Choose face tracker
  .showVideo(true) // Show camera feed
  .showFaceOverlay(true) // Show face detection overlay
  .showFaceFeedbackBox(true); // Show feedback box

await webgazer.begin();

2. Gaze Prediction

Get eye gaze coordinates in real-time:

typescript
// Continuous listening (recommended)
webgazer.setGazeListener((data, elapsedTime) => {
  if (data) {
    // data.x, data.y = gaze coordinates
    // data.eyeFeatures = detailed eye information
    moveCursor(data.x, data.y);
  }
});

// One-time prediction
const prediction = await webgazer.getCurrentPrediction();
if (prediction) {
  console.log(prediction.x, prediction.y);
}

3. Calibration

Calibration improves accuracy (see Calibration Guide):

typescript
// Click-based calibration
document.getElementById('calibrate-btn').addEventListener('click', async (e) => {
  // Record calibration point
  await webgazer.recordScreenPosition(e.clientX, e.clientY);
});

// Verify accuracy
const accuracy = await webgazer.getAccuracy();
console.log(`Accuracy: ${accuracy}px average error`);

4. Control Flow

Start, pause, resume, and stop tracking:

typescript
// Start tracking
await webgazer.begin();

// Pause (keeps model, stops camera)
webgazer.pause();

// Resume
webgazer.resume();

// Stop (clears everything)
await webgazer.end();

// Check if running
const isRunning = webgazer.isReady();

Common Patterns

Eye Tracking Cursor

Move an element to follow gaze:

typescript
const cursor = document.getElementById('gaze-cursor');

webgazer.setGazeListener((data) => {
  if (data) {
    cursor.style.left = `${data.x - 10}px`;
    cursor.style.top = `${data.y - 10}px`;
  }
});
css
#gaze-cursor {
  position: fixed;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: rgba(255, 0, 0, 0.5);
  pointer-events: none;
  z-index: 9999;
}

Element Detection

Detect when user looks at elements:

typescript
function isLookingAt(element: HTMLElement, gazeX: number, gazeY: number): boolean {
  const rect = element.getBoundingClientRect();
  return (
    gazeX >= rect.left &&
    gazeX <= rect.right &&
    gazeY >= rect.top &&
    gazeY <= rect.bottom
  );
}

const button = document.getElementById('my-button');

webgazer.setGazeListener((data) => {
  if (data && isLookingAt(button, data.x, data.y)) {
    button.classList.add('gaze-active');
  } else {
    button.classList.remove('gaze-active');
  }
});

Dwell Time Activation

Trigger action after looking at element for duration:

typescript
class DwellDetector {
  private dwellStart: number | null = null;
  private dwellThreshold = 1000; // ms

  check(element: HTMLElement, gazeX: number, gazeY: number): boolean {
    const isLooking = isLookingAt(element, gazeX, gazeY);
    
    if (isLooking) {
      if (!this.dwellStart) {
        this.dwellStart = Date.now();
      }
      const dwellTime = Date.now() - this.dwellStart;
      return dwellTime >= this.dwellThreshold;
    } else {
      this.dwellStart = null;
      return false;
    }
  }
}

const detector = new DwellDetector();

webgazer.setGazeListener((data) => {
  if (data && detector.check(button, data.x, data.y)) {
    button.click();
  }
});

Gaze Heatmap

Track where users look over time:

typescript
const gazePoints: Array<{x: number, y: number, timestamp: number}> = [];

webgazer.setGazeListener((data) => {
  if (data) {
    gazePoints.push({
      x: data.x,
      y: data.y,
      timestamp: Date.now()
    });
  }
});

// Generate heatmap after session
function generateHeatmap() {
  // Use library like heatmap.js
  const heatmapData = gazePoints.map(p => ({
    x: Math.round(p.x),
    y: Math.round(p.y),
    value: 1
  }));
  
  return heatmapData;
}

API Reference

Core Methods

MethodDescription
begin()Initialize and start tracking
end()Stop tracking and cleanup
pause()Pause tracking (keep model)
resume()Resume tracking
isReady()Check if tracking is active

Configuration

MethodDescription
setRegression(name)Set regression algorithm
setTracker(name)Set face tracker
showVideo(bool)Show/hide camera feed
showFaceOverlay(bool)Show/hide face detection
showFaceFeedbackBox(bool)Show/hide feedback box

Prediction

MethodDescription
setGazeListener(callback)Listen to gaze predictions
getCurrentPrediction()Get single prediction
recordScreenPosition(x, y)Record calibration point

See API Reference for complete documentation.

Next Steps

Based on Webgazer.js by Brown HCI