Start · Sprachen · JavaScript · Referenz · VRDisplay.getPose()

VRDisplay.getPose()

Methode

Gibt ein <code>VRPose</code>-Objekt mit der vorhergesagten Position und Ausrichtung des VR-Headsets zum Zeitpunkt der Frame-Präsentation zurück.

seit JavaScript WebVR 1.1 (veraltet, ersetzt durch WebXR Device AP deprecated seit ja Kategorie: webapi

Signatur

VRDisplay.prototype.getPose()

Beschreibung

Die Methode getPose() der veralteten WebVR-Schnittstelle VRDisplay liefert ein VRPose-Objekt. Es beschreibt die vorhergesagte Pose des Displays, also Position, Ausrichtung, Geschwindigkeit und Beschleunigung, und zwar für den Moment, in dem der aktuelle Frame tatsächlich angezeigt wird. Die Vorhersage gleicht die Latenz zwischen Rendern und Anzeige aus und verringert so Bewegungsübelkeit.

Die Pose enthält unter anderem orientation (Quaternion als Float32Array mit den Werten [x, y, z, w]), position (Vektor [x, y, z] in Metern), linearVelocity, angularVelocity sowie die zugehörigen Beschleunigungen. Kann ein Wert nicht ermittelt werden, zum Beispiel die Position bei Headsets, die nur die Drehung erfassen (3DoF), ist das Feld null.

In der WebVR-Spezifikation 1.1 wurde getPose() zugunsten von VRDisplay.getFrameData() als veraltet markiert. getFrameData() füllt ein VRFrameData-Objekt und liefert neben der Pose auch fertige View- und Projektionsmatrizen für beide Augen. In neuem Code sollte keine der beiden Methoden verwendet werden, sondern die WebXR Device API.

Rückgabewert

Typ
VRPose
Beschreibung
Ein VRPose-Objekt mit der vorhergesagten Pose für den aktuellen Frame. Einzelne Felder wie position können null sein, wenn die Hardware sie nicht unterstützt.

Beispiele

Pose im Render-Loop auslesen

const startVR = async () => {
  if (!navigator.getVRDisplays) {
    console.warn('WebVR wird nicht unterstützt');
    return;
  }
  const displays = await navigator.getVRDisplays();
  if (displays.length === 0) return;
  const vrDisplay = displays[0];

  const onFrame = () => {
    const pose = vrDisplay.getPose();
    if (pose.orientation) {
      const [x, y, z, w] = pose.orientation;
      console.log(`Ausrichtung: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}, ${w.toFixed(2)}`);
    }
    vrDisplay.requestAnimationFrame(onFrame);
  };
  vrDisplay.requestAnimationFrame(onFrame);
};

startVR();
Ausrichtung: 0.00, 0.12, 0.00, 0.99

Positions-Tracking (6DoF) prüfen

const logPosition = (vrDisplay) => {
  const pose = vrDisplay.getPose();
  if (pose.position) {
    const [x, y, z] = pose.position;
    console.log(`Kopfposition: x=${x.toFixed(2)} m, y=${y.toFixed(2)} m, z=${z.toFixed(2)} m`);
  } else {
    console.log('Nur Rotations-Tracking (3DoF) verfügbar');
  }
};

navigator.getVRDisplays?.().then(([display]) => display && logPosition(display));
Kopfposition: x=0.05 m, y=1.62 m, z=-0.10 m

Nachfolger verwenden: getFrameData()

const frameData = new VRFrameData();

const render = (vrDisplay) => {
  // Empfohlener Ersatz für getPose() ab WebVR 1.1
  vrDisplay.getFrameData(frameData);
  const { pose, leftViewMatrix, rightProjectionMatrix } = frameData;
  console.log('Orientierung:', pose.orientation);
  console.log('Linke View-Matrix hat', leftViewMatrix.length, 'Einträge');
  vrDisplay.requestAnimationFrame(() => render(vrDisplay));
};
Linke View-Matrix hat 16 Einträge

// Wichtig · Fallstricke

  • Veraltet: getPose() gilt schon innerhalb von WebVR als veraltet. Die gesamte WebVR-API ist durch die WebXR Device API ersetzt worden, in der man die Pose über XRFrame.getViewerPose() abfragt.
  • Browser-Unterstützung: WebVR gab es nur in älteren Firefox-Versionen, in Chrome für Android (Daydream) hinter einem Flag, in Samsung Internet und in Edge (Legacy). Aktuelle Browser unterstützen die API nicht mehr. Deshalb vorher auf navigator.getVRDisplays prüfen.
  • Rufen Sie die Methode innerhalb von VRDisplay.requestAnimationFrame() auf. Nur dort passt die vorhergesagte Pose zum Frame, der gerade gerendert wird.
  • position und andere Felder können null sein, etwa bei 3DoF-Geräten. Prüfen Sie das vor jedem Zugriff.
  • Die Methode ist nur in einem sicheren Kontext (HTTPS) verfügbar, und der Zugriff kann durch eine Permissions-Policy blockiert sein.