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

VRDisplay.resetPose()

Methode

Setzt die Pose des <code>VRDisplay</code> zurück: Die aktuelle Position und Ausrichtung gelten danach als Ursprung bzw. Nullwerte.

seit JavaScript WebVR 1.1 (veraltet, nie standardisiert; durch Web deprecated seit ja Kategorie: webapi

Signatur

VRDisplay.prototype.resetPose()

Beschreibung

Die Methode resetPose() der veralteten WebVR-Schnittstelle VRDisplay legt die aktuelle VRPose.position und VRPose.orientation des Headsets als neuen Nullpunkt fest. Alle Posen, die danach über getFrameData() oder getPose() abgefragt werden, beziehen sich auf diesen neuen Ursprung.

Typischer Einsatz ist eine „Neu zentrieren“-Funktion. Wer sitzt und sich gedreht hat oder wessen Headset-Tracking abgedriftet ist, bekommt so wieder eine Ansicht, die nach vorne ausgerichtet ist. Oft liegt die Funktion auf einer Taste oder einem Button in der Oberfläche.

Bei Room-Scale-Erlebnissen, also Geräten mit capabilities.hasPosition und stageParameters, sollte man die Methode nur zurückhaltend aufrufen. Sie verschiebt das Koordinatensystem gegenüber dem echten Raum, und virtuelle Objekte passen dann womöglich nicht mehr zu den physischen Grenzen. Bei Geräten, die nur die Ausrichtung erfassen (3DoF), wird vor allem die Blickrichtung um die Hochachse (Yaw) zurückgesetzt.

Rückgabewert

Typ
void
Beschreibung
Kein Rückgabewert (undefined).

Beispiele

Ansicht per Taste neu zentrieren

// Das erste verfügbare VR-Display ermitteln
const init = async () => {
  if (!navigator.getVRDisplays) {
    console.log('WebVR wird nicht unterstützt');
    return;
  }
  const displays = await navigator.getVRDisplays();
  if (displays.length === 0) return;
  const vrDisplay = displays[0];

  // Taste „R“ setzt die Pose zurück
  window.addEventListener('keydown', (event) => {
    if (event.key === 'r') {
      vrDisplay.resetPose();
      console.log('Pose zurückgesetzt');
    }
  });
};

init();
Pose zurückgesetzt

Pose vor und nach dem Zurücksetzen vergleichen

const comparePose = async () => {
  const [vrDisplay] = await navigator.getVRDisplays();
  const frameData = new VRFrameData();

  vrDisplay.getFrameData(frameData);
  console.log('Vorher:', frameData.pose.orientation);

  vrDisplay.resetPose();

  // Die neue Pose wird erst im nächsten Frame sichtbar
  vrDisplay.requestAnimationFrame(() => {
    vrDisplay.getFrameData(frameData);
    console.log('Nachher:', frameData.pose.orientation);
  });
};

comparePose();
Vorher: Float32Array [0.02, 0.71, -0.01, 0.70] Nachher: Float32Array [0, 0, 0, 1] (ungefähr)

Beim Start der Präsentation automatisch zentrieren

const startVR = async (canvas) => {
  const [vrDisplay] = await navigator.getVRDisplays();
  await vrDisplay.requestPresent([{ source: canvas }]);

  // Nur bei Geräten ohne Room-Scale-Tracking zentrieren
  if (!vrDisplay.stageParameters) {
    vrDisplay.resetPose();
  }
};

document.querySelector('#enter-vr')
  .addEventListener('click', () => startVR(document.querySelector('canvas')));

// Wichtig · Fallstricke

Veraltet: Die gesamte WebVR-API (VRDisplay, navigator.getVRDisplays()) ist überholt und wurde aus den meisten Browsern entfernt. Chrome und Edge haben sie nur zeitweise hinter Flags angeboten, Firefox hat sie entfernt, und Safari hat sie nie unterstützt. Für neue Projekte ist die WebXR Device API gedacht.

  • In WebXR gibt es keine direkte Entsprechung. Stattdessen reagiert man auf das Ereignis reset eines XRReferenceSpace oder baut mit getOffsetReferenceSpace() einen verschobenen Bezugsraum.
  • In Room-Scale-Anwendungen kann resetPose() dazu führen, dass virtuelle und reale Raumgrenzen nicht mehr übereinstimmen.
  • Die Änderung wirkt sich erst auf Posen aus, die später abgefragt werden. Bereits ausgelesene VRFrameData-Objekte bleiben unverändert.
  • Vor dem Aufruf mit 'getVRDisplays' in navigator prüfen, ob die API überhaupt vorhanden ist.