Signatur
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
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();
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);
}
};
// 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.getVRDisplaysexistiert. isPresentingwird ersttrue, nachdem das Promise vonrequestPresent()aufgelöst wurde, nicht schon beim Aufruf.- Der Browser kann die Präsentation selbst beenden, z. B. wenn das Headset abgenommen wird. Deshalb auf
vrdisplaypresentchangereagieren, statt sich auf einen eigenen Zustand zu verlassen. - Während der Präsentation
vrDisplay.requestAnimationFrame()stattwindow.requestAnimationFrame()verwenden, sonst stimmt die Bildrate des Headsets nicht. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung hat keine Wirkung.