Start · Sprachen · JavaScript · Referenz · PositionSensorVRDevice

PositionSensorVRDevice

Schnittstelle

Stellt in der frühen WebVR API den Positions- und Orientierungssensor eines VR-Headsets dar und liefert Position, Ausrichtung und Bewegungsdaten.

seit JavaScript Veraltet: nur in frühen WebVR-Vorabversionen (Fire deprecated seit ja Kategorie: webapi

Signatur

interface PositionSensorVRDevice extends VRDevice

Beschreibung

Das Interface PositionSensorVRDevice gehörte zur ursprünglichen, vor Version 1.0 entwickelten WebVR API. Es steht für den Positionssensor einer VR-Hardware, meist des Head-Mounted Displays (HMD). Darüber konnte eine Webanwendung abfragen, wo sich der Kopf des Nutzers im Raum befindet und in welche Richtung er schaut. Mit diesen Daten wurde anschließend die virtuelle Kamera einer WebGL-Szene ausgerichtet.

Instanzen wurden nicht selbst erzeugt, sondern über navigator.getVRDevices() abgerufen. Diese Methode liefert ein Promise mit einem Array aller erkannten VRDevice-Objekte. Die Positionssensoren filterte man dann mit instanceof PositionSensorVRDevice heraus. Von VRDevice erbt das Interface die Eigenschaften hardwareUnitId, deviceId und deviceName. Über hardwareUnitId ließ sich ein Sensor dem zugehörigen HMDVRDevice zuordnen.

Diese Methoden gibt es:

  • getState(): Gibt ein VRPositionState-Objekt mit dem Sensorzustand zurück, den der Browser für den nächsten darzustellenden Frame vorausberechnet. Das ist der empfohlene Weg für das Rendering.
  • getImmediateState(): Gibt den aktuellen Zustand ohne Vorhersage zurück, zum Beispiel für Logik, die nichts mit dem Rendering zu tun hat.
  • resetSensor(): Legt die aktuelle Position und Ausrichtung als neuen Nullpunkt fest und kalibriert den Sensor damit neu.

Das Objekt VRPositionState enthält timeStamp, hasPosition, position, linearVelocity, linearAcceleration, hasOrientation, orientation (ein Quaternion als DOMPoint), angularVelocity und angularAcceleration. Wichtig: In neuem Code sollte dieses Interface nicht mehr verwendet werden. Nachfolger war zunächst VRDisplay aus WebVR 1.1, heute ist es die WebXR Device API.

Rückgabewert

Typ
PositionSensorVRDevice
Beschreibung
Wird nicht über einen Konstruktor erzeugt, sondern als Element des Arrays geliefert, mit dem das Promise von navigator.getVRDevices() erfüllt wird.

Beispiele

Positionssensor ermitteln (mit Funktionsprüfung)

const findPositionSensor = async () => {
  // Prüfen, ob die alte WebVR API überhaupt vorhanden ist
  if (!('getVRDevices' in navigator) || typeof PositionSensorVRDevice === 'undefined') {
    console.log('Alte WebVR API nicht verfügbar – bitte WebXR verwenden.');
    return null;
  }
  const devices = await navigator.getVRDevices();
  const sensor = devices.find((d) => d instanceof PositionSensorVRDevice);
  if (sensor) {
    console.log(`Sensor gefunden: ${sensor.deviceName} (${sensor.hardwareUnitId})`);
  }
  return sensor ?? null;
};

findPositionSensor();
Alte WebVR API nicht verfügbar – bitte WebXR verwenden. (in aktuellen Browsern)

Kamera pro Frame mit getState() aktualisieren

const startTracking = (sensor, camera) => {
  const loop = () => {
    const state = sensor.getState();

    if (state.hasOrientation && state.orientation) {
      const { x, y, z, w } = state.orientation; // Quaternion
      camera.quaternion = [x, y, z, w];
    }
    if (state.hasPosition && state.position) {
      const { x, y, z } = state.position;
      camera.position = [x, y, z];
    }
    requestAnimationFrame(loop);
  };
  requestAnimationFrame(loop);
};

// Aufruf, z. B. nach findPositionSensor():
// const camera = { position: [0, 0, 0], quaternion: [0, 0, 0, 1] };
// startTracking(sensor, camera);

Sensor per Tastendruck neu kalibrieren und Sofortzustand loggen

const bindResetKey = (sensor) => {
  window.addEventListener('keydown', (event) => {
    if (event.key === 'r') {
      sensor.resetSensor(); // aktuelle Pose wird neuer Nullpunkt
      const now = sensor.getImmediateState();
      console.log('Zurückgesetzt, Zeitstempel:', now.timeStamp);
    }
  });
};
Zurückgesetzt, Zeitstempel: 123456.78

// Wichtig · Fallstricke

Veraltet und entfernt: PositionSensorVRDevice gab es nur in experimentellen Builds, etwa in Firefox Nightly und in speziellen Chromium-Builds von 2014/2015. In keinem aktuellen Browser ist das Interface vorhanden. Schon WebVR 1.1 ersetzte es durch VRDisplay.getPose() bzw. getFrameData(), und heute ist XRSession / XRFrame.getViewerPose() aus der WebXR Device API der Standard.

  • Prüfe immer vorher, ob die API vorhanden ist ('getVRDevices' in navigator). Ohne diese Prüfung bricht das Skript mit einem ReferenceError ab.
  • hasPosition ist bei Geräten ohne Positionstracking (z. B. frühe Oculus-DK1- oder Cardboard-Setups) false. In diesem Fall ist position null.
  • Für das Rendering getState() verwenden, nicht getImmediateState(). Nur getState() enthält die Vorhersage für den nächsten Frame, und ohne sie wirkt die Darstellung verzögert. Das kann Übelkeit auslösen.
  • Sensordaten zur Kopfbewegung können sich für Fingerprinting eignen. Moderne APIs verlangen deshalb eine Nutzergeste und einen sicheren Kontext (HTTPS).