Signatur
Beschreibung
Die schreibgeschützte Eigenschaft canPresent des Interfaces VRDisplayCapabilities gibt an, ob ein VRDisplay Inhalte darstellen kann. Ist sie true, handelt es sich meist um ein Head-Mounted Display (HMD), auf das mit VRDisplay.requestPresent() eine WebGL-Szene übertragen werden kann. Bei false liefert das Gerät nur Tracking-Daten, etwa ein reiner Positionssensor oder ein Magic-Window-Gerät.
Man fragt canPresent ab, bevor man einen „In VR ansehen“-Button anzeigt oder requestPresent() aufruft. So vermeidet man, dass die Anwendung Darstellung auf einem Gerät anfordert, das sie gar nicht kann. Das Objekt mit den Fähigkeiten bekommt man über VRDisplay.capabilities.
Die Eigenschaft gehört zur veralteten WebVR-API. Diese API wurde nie standardisiert und ist durch die WebXR Device API ersetzt worden. Für neue Projekte sollte man navigator.xr.isSessionSupported('immersive-vr') verwenden.
Rückgabewert
true, wenn das Display Inhalte darstellen kann (z. B. ein HMD), sonst false.Beispiele
Fähigkeiten aller VR-Displays auslesen
const listDisplays = async () => {
if (!navigator.getVRDisplays) {
console.log('WebVR wird nicht unterstützt');
return;
}
const displays = await navigator.getVRDisplays();
displays.forEach((display) => {
const { canPresent } = display.capabilities;
console.log(`${display.displayName}: canPresent = ${canPresent}`);
});
};
listDisplays();
VR-Button nur bei darstellungsfähigem Gerät anzeigen
const vrButton = document.querySelector('#enter-vr');
const canvas = document.querySelector('canvas');
const setupVR = async () => {
const [display] = (await navigator.getVRDisplays?.()) ?? [];
if (!display || !display.capabilities.canPresent) {
vrButton.hidden = true;
return;
}
vrButton.hidden = false;
vrButton.addEventListener('click', async () => {
// requestPresent muss in einer Benutzergeste aufgerufen werden
await display.requestPresent([{ source: canvas }]);
console.log('VR-Darstellung gestartet');
});
};
setupVR();
Moderne Alternative mit WebXR
const checkImmersiveVR = async () => {
if (!('xr' in navigator)) return false;
return navigator.xr.isSessionSupported('immersive-vr');
};
checkImmersiveVR().then((ok) => console.log('Immersive VR möglich:', ok));
// Wichtig · Fallstricke
- Veraltet: WebVR ist aus allen aktuellen Browsern entfernt worden bzw. war nie standardmäßig aktiviert. Unterstützt wurde die API nur in älteren Firefox-Versionen, im Firefox Reality Browser, im Oculus Browser und in Chrome/Edge hinter Flags. Nutze stattdessen die WebXR Device API.
- Prüfe immer zuerst, ob es
navigator.getVRDisplaysüberhaupt gibt, sonst tritt einTypeErrorauf. - Wenn
canPresenttrueist, heißt das nicht, dassrequestPresent()auch klappt. Der Aufruf braucht eine Benutzergeste und kann trotzdem abgelehnt werden. Deshalb sollte das zurückgegebene Promise immer mitcatchabgesichert werden. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ohne Fehlermeldung ignoriert, im Strict Mode löst sie einen
TypeErroraus. - WebVR und WebXR funktionieren nur in einem sicheren Kontext (HTTPS).