Start · Sprachen · JavaScript · Referenz · PositionSensorVRDevice.getState()

PositionSensorVRDevice.getState()

Methode

Gibt ein <code>VRPositionState</code>-Objekt mit Position, Ausrichtung und Bewegungsdaten des VR-Positionssensors für das aktuelle Frame zurück.

seit JavaScript Veraltet: nur experimentelle WebVR-0.x-Builds (Fir deprecated seit ja Kategorie: webapi

Signatur

PositionSensorVRDevice.prototype.getState()

Beschreibung

Die Methode getState() der Schnittstelle PositionSensorVRDevice gehört zur frühen, inzwischen entfernten WebVR-API (Version 0.x). Sie liefert den Zustand des Positionssensors eines VR-Headsets (z. B. Oculus Rift DK2) für das aktuelle Frame, also den Wert, der zum laufenden window.requestAnimationFrame()-Callback passt. Der Browser kann dabei eine Vorhersage für den Zeitpunkt berechnen, an dem das Frame tatsächlich angezeigt wird. Das verringert die gefühlte Verzögerung beim Rendern.

Das zurückgegebene VRPositionState-Objekt enthält unter anderem timeStamp, hasPosition, hasOrientation, position (ein DOMPoint in Metern), orientation (ein DOMPoint als Quaternion x/y/z/w) sowie linearVelocity, angularVelocity, linearAcceleration und angularAcceleration. Werte, die der Sensor nicht liefern kann, sind null.

Brauchte man Rohdaten ohne Frame-Vorhersage, etwa für Physik oder Eingabelogik außerhalb der Render-Schleife, gab es als Gegenstück getImmediateState(). Mit resetSensor() ließ sich die aktuelle Kopfhaltung als neuer Nullpunkt festlegen.

Für neue Projekte kommt diese API nicht mehr in Frage. Der Nachfolger ist die WebXR Device API. Dort übernimmt XRFrame.getViewerPose() diese Aufgabe.

Rückgabewert

Typ
VRPositionState
Beschreibung
Ein Objekt mit dem vorhergesagten Sensorzustand für das aktuelle Frame: timeStamp, hasPosition, hasOrientation, position, orientation, linearVelocity, angularVelocity, linearAcceleration, angularAcceleration. Werte, die nicht verfügbar sind, sind null.

Beispiele

Positionssensor finden und in der Render-Schleife abfragen

// Nur in alten WebVR-0.x-Builds lauffähig
const findSensor = async () => {
  if (!navigator.getVRDevices) {
    throw new Error('WebVR 0.x wird nicht unterstützt');
  }
  const devices = await navigator.getVRDevices();
  return devices.find((d) => d instanceof PositionSensorVRDevice);
};

const start = async () => {
  const sensor = await findSensor();
  if (!sensor) return console.log('Kein Positionssensor gefunden');

  const loop = () => {
    const state = sensor.getState();
    if (state.hasOrientation) {
      const { x, y, z, w } = state.orientation;
      console.log(`Quaternion: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}, ${w.toFixed(2)}`);
    }
    requestAnimationFrame(loop);
  };
  requestAnimationFrame(loop);
};

start().catch((err) => console.warn(err.message));
Quaternion: 0.01, -0.12, 0.00, 0.99 …

Kamera an Kopfposition und -ausrichtung koppeln

// Annahme: camera ist ein Three.js-PerspectiveCamera-Objekt, sensor ein PositionSensorVRDevice
const updateCamera = (sensor, camera) => {
  const state = sensor.getState();

  if (state.hasOrientation && state.orientation) {
    const { x, y, z, w } = state.orientation;
    camera.quaternion.set(x, y, z, w);
  }
  if (state.hasPosition && state.position) {
    const { x, y, z } = state.position;
    // Position in Metern, ggf. an Szenenmaßstab anpassen
    camera.position.set(x, y + 1.6, z);
  }
};

const render = () => {
  updateCamera(sensor, camera);
  renderer.render(scene, camera);
  requestAnimationFrame(render);
};

// Aktuelle Blickrichtung als "vorne" festlegen
sensor.resetSensor();
requestAnimationFrame(render);

Feature-Erkennung mit Umstieg auf WebXR

const initVR = async () => {
  if (navigator.xr && await navigator.xr.isSessionSupported('immersive-vr')) {
    console.log('WebXR verfügbar – XRFrame.getViewerPose() verwenden');
    return 'webxr';
  }
  if (navigator.getVRDevices) {
    console.log('Nur veraltetes WebVR 0.x – PositionSensorVRDevice.getState()');
    return 'webvr-legacy';
  }
  console.log('Kein VR-Support');
  return 'none';
};

initVR();
WebXR verfügbar – XRFrame.getViewerPose() verwenden

// Wichtig · Fallstricke

  • Veraltet und entfernt: PositionSensorVRDevice und navigator.getVRDevices() gab es nur in experimentellen Builds (Firefox Nightly, spezielle Chromium-Builds). Auch der Nachfolger WebVR 1.1 (VRDisplay.getFrameData()) ist inzwischen abgeschafft. Stattdessen WebXR verwenden (XRSession, XRFrame.getViewerPose()).
  • Richtiger Aufrufzeitpunkt: getState() nur innerhalb eines requestAnimationFrame-Callbacks aufrufen. Nur dort passt die Vorhersage zum angezeigten Frame. Für Logik außerhalb des Renderns ist getImmediateState() gedacht.
  • null-Werte prüfen: Geräte, die nur die Ausrichtung erfassen (z. B. Oculus DK1), liefern position === null. Vor dem Zugriff immer hasPosition bzw. hasOrientation prüfen.
  • Einheiten: Positionen sind in Metern angegeben, die Ausrichtung als Quaternion und nicht in Euler-Winkeln.
  • Sicherheit/Datenschutz: Bewegungsdaten des Kopfes können sich für Fingerprinting eignen. Moderne APIs verlangen deshalb eine Nutzergeste und einen sicheren Kontext (HTTPS).