Signatur
Beschreibung
Die schreibgeschützte Eigenschaft stageParameters des VRDisplay-Interfaces gibt ein VRStageParameters-Objekt zurück, wenn das Headset Erlebnisse im Raummaßstab (engl. room-scale) unterstützt. Andernfalls ist der Wert null, zum Beispiel bei reinen 3DoF-Brillen ohne Positionsverfolgung oder wenn der Nutzer keine Spielfläche eingerichtet hat.
Das Objekt enthält die Eigenschaften sittingToStandingTransform (eine 4×4-Matrix als Float32Array, die Koordinaten aus dem Sitz-Bezugsraum in den Steh-Bezugsraum mit Ursprung auf dem Boden umrechnet), sizeX und sizeY (Breite und Tiefe der begehbaren Fläche in Metern). Damit kannst du den Boden auf die richtige Höhe setzen und virtuelle Objekte innerhalb der erreichbaren Fläche platzieren.
Weil sich die Spielfläche während einer Sitzung ändern kann (etwa durch eine neue Kalibrierung), solltest du den Wert nicht dauerhaft zwischenspeichern, sondern regelmäßig neu lesen, idealerweise einmal pro Frame oder nach dem Ereignis vrdisplaypresentchange.
Wichtig: Die gesamte WebVR-API ist veraltet und wurde durch die WebXR Device API ersetzt. Dort entspricht das dem Referenzraum 'bounded-floor' (XRBoundedReferenceSpace) mit der Eigenschaft boundsGeometry.
Rückgabewert
VRStageParameters-Objekt mit sittingToStandingTransform, sizeX und sizeY oder null, wenn das Gerät keine Raummaßstab-Daten liefert.Beispiele
Spielfläche eines Headsets auslesen
const zeigeSpielflaeche = 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 stage = displays[0].stageParameters;
if (stage) {
console.log(`Spielfläche: ${stage.sizeX.toFixed(2)} m × ${stage.sizeY.toFixed(2)} m`);
} else {
console.log('Kein Raummaßstab verfügbar');
}
};
zeigeSpielflaeche();
Bodenhöhe aus der Sitz-zu-Steh-Matrix bestimmen
const ermittleBodenhoehe = (vrDisplay) => {
const stage = vrDisplay.stageParameters;
if (!stage) {
// Rückfall: typische Augenhöhe im Stehen annehmen
return 1.65;
}
// Die Matrix ist spaltenweise gespeichert, Index 13 = Y-Verschiebung
const m = stage.sittingToStandingTransform;
return m[13];
};
navigator.getVRDisplays().then(([display]) => {
if (display) {
console.log('Y-Versatz zum Boden:', ermittleBodenhoehe(display));
}
});
Objekte innerhalb der Spielfläche platzieren (pro Frame)
const platziereInnerhalb = (stage) => {
const halbX = stage.sizeX / 2;
const halbZ = stage.sizeY / 2;
return {
x: (Math.random() * 2 - 1) * halbX,
y: 0,
z: (Math.random() * 2 - 1) * halbZ
};
};
navigator.getVRDisplays().then(([display]) => {
if (!display) return;
const frame = () => {
// Wert jedes Mal frisch lesen, er kann sich ändern
const stage = display.stageParameters;
if (stage) {
const pos = platziereInnerhalb(stage);
// hier z. B. ein 3D-Objekt an pos setzen
}
display.requestAnimationFrame(frame);
};
display.requestAnimationFrame(frame);
});
// Wichtig · Fallstricke
- Veraltet: WebVR wurde nie standardisiert und ist in aktuellen Browsern entfernt (Firefox ab Version 98, Chrome hat es nur hinter Flags bzw. Origin Trials angeboten). Für neue Projekte ausschließlich die WebXR Device API mit
requestReferenceSpace('bounded-floor')verwenden. - Immer auf
nullprüfen: Viele Geräte (z. B. Cardboard, Gear VR) oder nicht kalibrierte Systeme liefern keine Stage-Daten. - Die Spielfläche ist als achsenparalleles Rechteck um den Ursprung beschrieben. Unregelmäßige Grenzen lassen sich damit nicht abbilden, was erst WebXR mit
boundsGeometryermöglicht. - Den Wert nicht dauerhaft zwischenspeichern, da er sich nach einer Neukalibrierung ändern kann.
- Die API steht nur in sicheren Kontexten (HTTPS) und meist nur nach einer Nutzeraktion vollständig zur Verfügung.