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

VRDisplay.getImmediatePose()

Methode

Gibt ein <code>VRPose</code>-Objekt mit der aktuellen Pose (Position, Ausrichtung) des <code>VRDisplay</code> zurück, ohne dass eine Bewegungsvorhersage angewendet wird.

seit JavaScript WebVR 1.0 (veraltet, nie standardisiert; entfernt deprecated seit ja Kategorie: webapi

Signatur

VRDisplay.prototype.getImmediatePose()

Beschreibung

Die Methode getImmediatePose() der veralteten WebVR-Schnittstelle VRDisplay liefert die Pose des Headsets zum Zeitpunkt des Aufrufs, also die tatsächlich gemessenen Sensordaten, ohne dass der Browser sie auf den Zeitpunkt der nächsten Bildanzeige hochrechnet.

Im Unterschied zu VRDisplay.getPose(), das eine vorhergesagte Pose für das nächste Frame liefert und damit die Latenz ausgleicht, ist getImmediatePose() für Fälle gedacht, in denen Rohdaten wichtiger sind als flüssiges Rendering: etwa für Analyse, Protokollierung, Kalibrierung oder das Platzieren von Objekten an der tatsächlichen aktuellen Kopfposition.

Zum Rendern von Szenen sollte diese Methode nicht verwendet werden, weil die Darstellung ohne Vorhersage spürbar hinterherhinkt, was Übelkeit fördern kann. In späteren Entwürfen der WebVR-1.1-Spezifikation wurde die Methode bereits wieder entfernt und durch VRDisplay.getFrameData() ersetzt.

Rückgabewert

Typ
VRPose
Beschreibung
Ein VRPose-Objekt mit position, orientation, linearVelocity, angularVelocity usw. (jeweils Float32Array oder null, falls das Gerät diese Werte nicht liefert).

Beispiele

Aktuelle Kopfposition ohne Vorhersage auslesen

const logImmediatePose = async () => {
  if (!navigator.getVRDisplays) {
    console.log('WebVR wird nicht unterstützt');
    return;
  }
  const displays = await navigator.getVRDisplays();
  if (displays.length === 0) {
    console.log('Kein VR-Gerät gefunden');
    return;
  }
  const vrDisplay = displays[0];
  const pose = vrDisplay.getImmediatePose();

  // position/orientation können null sein (z. B. 3DoF-Headsets)
  if (pose.position) {
    const [x, y, z] = pose.position;
    console.log(`Position: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`);
  }
  if (pose.orientation) {
    console.log('Ausrichtung (Quaternion):', Array.from(pose.orientation));
  }
};

logImmediatePose();
Position: 0.12, 1.65, -0.30 Ausrichtung (Quaternion): [0, 0.38, 0, 0.92]

Vorhergesagte und tatsächliche Pose vergleichen

const comparePoses = (vrDisplay) => {
  const predicted = vrDisplay.getPose();
  const immediate = vrDisplay.getImmediatePose();

  if (predicted.orientation && immediate.orientation) {
    const diff = Array.from(predicted.orientation)
      .map((v, i) => Math.abs(v - immediate.orientation[i]));
    console.log('Abweichung pro Komponente:', diff.map((d) => d.toFixed(4)));
  }
};

navigator.getVRDisplays?.().then(([display]) => {
  if (display) comparePoses(display);
});
Abweichung pro Komponente: ["0.0012", "0.0035", "0.0004", "0.0009"]

Moderne Alternative mit WebXR

// WebXR ersetzt WebVR vollständig
const startXR = async () => {
  if (!(await navigator.xr?.isSessionSupported('immersive-vr'))) return;
  const session = await navigator.xr.requestSession('immersive-vr');
  const refSpace = await session.requestReferenceSpace('local');

  session.requestAnimationFrame((time, frame) => {
    const pose = frame.getViewerPose(refSpace);
    if (pose) {
      const { x, y, z } = pose.transform.position;
      console.log('Viewer-Position:', x, y, z);
    }
  });
};
Viewer-Position: 0 1.6 0

// Wichtig · Fallstricke

  • Veraltet: Die gesamte WebVR-API ist obsolet und wurde aus Chrome, Firefox und Edge entfernt. Für neue Projekte ausschließlich die WebXR Device API verwenden (XRFrame.getViewerPose()).
  • getImmediatePose() war nur im ursprünglichen WebVR-1.0-Entwurf vorhanden und wurde schon in WebVR 1.1 zugunsten von getFrameData() gestrichen – selbst ältere WebVR-Implementierungen kennen sie oft nicht. Vor dem Aufruf per typeof vrDisplay.getImmediatePose === 'function' prüfen.
  • Nicht zum Rendern verwenden: Ohne Vorhersage entsteht sichtbare Latenz (Motion-to-Photon-Verzögerung), was Übelkeit auslösen kann.
  • Die Felder von VRPose können null sein, wenn das Gerät z. B. keine Positionsverfolgung bietet (VRDisplayCapabilities.hasPosition).
  • WebVR erforderte in Browsern zeitweise einen sicheren Kontext (HTTPS) und teils Nutzerfreigaben.