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

PositionSensorVRDevice.getImmediateState()

Methode

Gibt den aktuellen Zustand des Positionssensors eines VR-Geräts als <code>VRPositionState</code> zurück, also Position, Ausrichtung und Bewegungsdaten zum Zeitpunkt des Aufrufs.

seit JavaScript Veraltet: nur experimentelle WebVR-1.0-Vorversione deprecated seit ja Kategorie: webapi

Signatur

PositionSensorVRDevice.prototype.getImmediateState()

Beschreibung

getImmediateState() gehört zur Schnittstelle PositionSensorVRDevice aus der frühen, experimentellen WebVR-API. Die Methode liest den Positionssensor eines VR-Headsets (z. B. Oculus Rift DK2) sofort aus und liefert ein VRPositionState-Objekt. Darin stehen position, orientation, lineare und Winkelgeschwindigkeit, Beschleunigungen und ein timeStamp.

Die Schwestermethode getState() liefert dagegen einen vorhergesagten Zustand für den Zeitpunkt, an dem das nächste Bild angezeigt wird. Für das Rendern ist getState() die bessere Wahl, weil die Vorhersage die Latenz ausgleicht. getImmediateState() passt dagegen gut, wenn Sie Rohdaten ohne Vorhersage brauchen, etwa für Physik, Kalibrierung, Logging oder Treffertests.

Ob die Werte gültig sind, sagen die Flags hasPosition und hasOrientation. Geräte ohne Positionsverfolgung (z. B. Cardboard) liefern nur eine Ausrichtung, position ist dann null. Werte, die nicht gemeldet werden, sind ebenfalls null.

Wichtig: Diese API wurde nie standardisiert. Sie wurde erst durch WebVR 1.1 (VRDisplay.getFrameData()) ersetzt und danach vollständig durch die WebXR Device API. Für neuen Code sollten Sie ausschließlich WebXR verwenden.

Rückgabewert

Typ
VRPositionState
Beschreibung
Objekt mit dem aktuellen Sensorzustand: timeStamp, hasPosition, position (DOMPoint in Metern oder null), linearVelocity, linearAcceleration, hasOrientation, orientation (Quaternion als DOMPoint oder null), angularVelocity und angularAcceleration.

Beispiele

Positionssensor finden und aktuellen Zustand lesen

// Alte WebVR-API (0.x): Geräte auflisten und Positionssensor herausfiltern
const findeSensor = async () => {
  if (!navigator.getVRDevices) {
    console.warn('Alte WebVR-API wird nicht unterstützt.');
    return null;
  }
  const geraete = await navigator.getVRDevices();
  return geraete.find((g) => g instanceof PositionSensorVRDevice) ?? null;
};

const sensor = await findeSensor();
if (sensor) {
  const zustand = sensor.getImmediateState();
  if (zustand.hasOrientation) {
    const { x, y, z, w } = zustand.orientation;
    console.log(`Ausrichtung: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}, ${w.toFixed(2)}`);
  }
  if (zustand.hasPosition) {
    const { x, y, z } = zustand.position;
    console.log(`Position (m): ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`);
  }
}
Ausrichtung: 0.01, -0.12, 0.00, 0.99 Position (m): 0.03, 0.10, -0.25

Rohdaten fürs Logging, vorhergesagten Zustand fürs Rendern

const starteSchleife = (sensor, zeichneSzene) => {
  const log = [];

  const frame = () => {
    // Vorhergesagter Zustand für das nächste Bild: fürs Rendern
    const vorhersage = sensor.getState();
    zeichneSzene(vorhersage.orientation, vorhersage.position);

    // Echter aktueller Zustand: für Analyse und Physik
    const jetzt = sensor.getImmediateState();
    log.push({
      t: jetzt.timeStamp,
      winkelGeschw: jetzt.angularVelocity
        ? [jetzt.angularVelocity.x, jetzt.angularVelocity.y, jetzt.angularVelocity.z]
        : null
    });

    requestAnimationFrame(frame);
  };

  requestAnimationFrame(frame);
  return log;
};

Moderner Ersatz mit WebXR

// Heute: WebXR statt PositionSensorVRDevice
if (navigator.xr && await navigator.xr.isSessionSupported('immersive-vr')) {
  const session = await navigator.xr.requestSession('immersive-vr');
  const refSpace = await session.requestReferenceSpace('local');

  session.requestAnimationFrame(function onFrame(time, frame) {
    const pose = frame.getViewerPose(refSpace);
    if (pose) {
      const { position, orientation } = pose.transform;
      console.log(position.x, position.y, position.z, orientation.w);
    }
    session.requestAnimationFrame(onFrame);
  });
}
0.02 1.6 -0.1 0.98

// Wichtig · Fallstricke

  • Veraltet und entfernt: PositionSensorVRDevice, navigator.getVRDevices() und getImmediateState() gab es nur in experimentellen Builds hinter Flags. Aktuelle Browser unterstützen sie nicht mehr. Nutzen Sie die WebXR Device API (XRFrame.getViewerPose()).
  • Die MDN-Kurzbeschreibung nennt fälschlich VRDisplay. Die Methode gehört zu PositionSensorVRDevice. VRDisplay ist die Nachfolge-Schnittstelle aus WebVR 1.1 und kennt diese Methode nicht.
  • Fürs Rendern sollten Sie getState() verwenden. Wenn Sie mit getImmediateState() rendern, entstehen sichtbare Verzögerungen und Übelkeit (Motion-to-Photon-Latenz).
  • Prüfen Sie immer hasPosition/hasOrientation und die Werte auf null, bevor Sie darauf zugreifen.
  • Prüfen Sie vor der Nutzung, ob die API vorhanden ist ('getVRDevices' in navigator), sonst gibt es einen TypeError.