Start · Sprachen · JavaScript · Referenz · VRDisplay.isPresenting

VRDisplay.isPresenting

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob das <code>VRDisplay</code> gerade Inhalte präsentiert, also eine VR-Sitzung aktiv ist.

seit JavaScript WebVR 1.1 (veraltet, durch WebXR ersetzt; nie Base deprecated seit ja Kategorie: webapi

Signatur

VRDisplay.isPresenting

Beschreibung

Die schreibgeschützte Eigenschaft isPresenting der Schnittstelle VRDisplay ist true, solange das Display Inhalte zeigt. Das ist der Fall, nachdem VRDisplay.requestPresent() erfolgreich aufgelöst wurde und bevor VRDisplay.exitPresent() aufgerufen wurde oder der Browser die Präsentation beendet hat. In allen anderen Fällen ist der Wert false.

Typische Einsätze: Man schaltet damit die Beschriftung eines „VR betreten/verlassen“-Buttons um, wählt in der Render-Schleife zwischen Stereo-Rendering (getFrameData(), submitFrame()) und normaler Monoansicht oder verhindert, dass requestPresent() doppelt aufgerufen wird.

Ändert sich der Zustand, feuert das window-Ereignis vrdisplaypresentchange. Den Wert von isPresenting liest man am besten in diesem Ereignis-Handler aus, statt ihn laufend abzufragen.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das VRDisplay gerade präsentiert, sonst false.

Beispiele

Präsentation per Button umschalten

const button = document.querySelector('#vr-toggle');
const canvas = document.querySelector('canvas');

const init = async () => {
  if (!navigator.getVRDisplays) {
    button.textContent = 'WebVR nicht unterstützt';
    button.disabled = true;
    return;
  }
  const [vrDisplay] = await navigator.getVRDisplays();
  if (!vrDisplay) return;

  button.addEventListener('click', async () => {
    if (vrDisplay.isPresenting) {
      await vrDisplay.exitPresent();
    } else {
      // requestPresent muss durch eine Nutzeraktion ausgelöst werden
      await vrDisplay.requestPresent([{ source: canvas }]);
    }
  });

  window.addEventListener('vrdisplaypresentchange', () => {
    button.textContent = vrDisplay.isPresenting ? 'VR verlassen' : 'VR betreten';
    console.log('isPresenting:', vrDisplay.isPresenting);
  });
};

init();
isPresenting: true isPresenting: false

Render-Schleife abhängig vom Präsentationszustand

const canvas = document.querySelector('canvas');
const gl = canvas.getContext('webgl');
const frameData = new VRFrameData();

const drawScene = (projection, view) => {
  // Szene mit den übergebenen Matrizen zeichnen ...
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
};

const startLoop = (vrDisplay) => {
  const render = () => {
    if (vrDisplay.isPresenting) {
      vrDisplay.getFrameData(frameData);
      const w = canvas.width / 2;
      gl.viewport(0, 0, w, canvas.height);
      drawScene(frameData.leftProjectionMatrix, frameData.leftViewMatrix);
      gl.viewport(w, 0, w, canvas.height);
      drawScene(frameData.rightProjectionMatrix, frameData.rightViewMatrix);
      vrDisplay.submitFrame();
      vrDisplay.requestAnimationFrame(render);
    } else {
      gl.viewport(0, 0, canvas.width, canvas.height);
      drawScene(null, null); // normale Monoansicht
      window.requestAnimationFrame(render);
    }
  };
  render();
};

navigator.getVRDisplays?.().then(([d]) => d && startLoop(d));

Doppelten requestPresent-Aufruf verhindern

const enterVR = async (vrDisplay, canvas) => {
  if (vrDisplay.isPresenting) {
    console.log('Präsentation läuft bereits');
    return;
  }
  try {
    await vrDisplay.requestPresent([{ source: canvas }]);
    console.log('Gestartet:', vrDisplay.isPresenting);
  } catch (err) {
    console.error('requestPresent fehlgeschlagen:', err);
  }
};
Gestartet: true

// Wichtig · Fallstricke

Veraltet: Die WebVR-API und damit VRDisplay gelten als veraltet und wurden durch die WebXR Device API ersetzt. Browser haben WebVR nur experimentell unterstützt, etwa ältere Firefox-Versionen, Chrome hinter einem Flag und Oculus Browser. Aktuelle Browser haben die Unterstützung entfernt. In WebXR übernimmt eine aktive XRSession diese Rolle (navigator.xr.requestSession() bzw. das end-Ereignis der Sitzung).

  • Vor dem Zugriff immer prüfen, ob navigator.getVRDisplays existiert.
  • isPresenting wird erst true, nachdem das Promise von requestPresent() aufgelöst wurde, nicht schon beim Aufruf.
  • Der Browser kann die Präsentation selbst beenden, z. B. wenn das Headset abgenommen wird. Deshalb auf vrdisplaypresentchange reagieren, statt sich auf einen eigenen Zustand zu verlassen.
  • Während der Präsentation vrDisplay.requestAnimationFrame() statt window.requestAnimationFrame() verwenden, sonst stimmt die Bildrate des Headsets nicht.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung hat keine Wirkung.