Signatur
Beschreibung
Die Eigenschaft sittingToStandingTransform der veralteten WebVR-Schnittstelle VRStageParameters liefert eine 4×4-Transformationsmatrix als Float32Array mit 16 Elementen in spaltenweiser Anordnung (column-major, wie in WebGL üblich). Sie beschreibt, wie Positionen und Ansichtsmatrizen aus dem Sitzraum – dessen Ursprung an der Kopfposition des Nutzers beim Start oder letzten resetPose() liegt – in den Stehraum umgerechnet werden, dessen Ursprung sich auf dem Boden in der Mitte der Spielfläche befindet.
Man braucht diese Matrix für Room-Scale-Anwendungen: Die von VRDisplay.getFrameData() gelieferten Matrizen (leftViewMatrix, rightViewMatrix) und die Pose beziehen sich auf den Sitzraum. Damit der virtuelle Boden mit dem realen Boden übereinstimmt, multipliziert man die Pose mit sittingToStandingTransform bzw. die Ansichtsmatrix mit deren Inversen.
Der Wert ist nur verfügbar, wenn das Gerät Raum-Tracking unterstützt; andernfalls ist VRDisplay.stageParameters selbst null. Zusammen mit sizeX und sizeZ lässt sich so die begehbare Fläche korrekt in der Szene darstellen.
Rückgabewert
Beispiele
Matrix auslesen und Augenhöhe ermitteln
const [display] = await navigator.getVRDisplays();
const stage = display?.stageParameters;
if (stage) {
const m = stage.sittingToStandingTransform;
// Translation steht bei column-major in den Indizes 12, 13, 14
console.log(`Höhe des Sitzursprungs über dem Boden: ${m[13].toFixed(2)} m`);
} else {
console.log('Kein Room-Scale-Tracking verfügbar');
}
Ansichtsmatrix in den Stehraum überführen (mit gl-matrix)
import { mat4 } from 'gl-matrix';
const frameData = new VRFrameData();
const standingView = mat4.create();
const invStanding = mat4.create();
const render = (display) => {
display.getFrameData(frameData);
const stage = display.stageParameters;
if (stage) {
// view_standing = view_sitting * inverse(sittingToStanding)
mat4.invert(invStanding, stage.sittingToStandingTransform);
mat4.multiply(standingView, frameData.leftViewMatrix, invStanding);
} else {
mat4.copy(standingView, frameData.leftViewMatrix);
}
// standingView an den Shader übergeben …
display.requestAnimationFrame(() => render(display));
};
Fallback ohne Stage-Parameter
const DEFAULT_EYE_HEIGHT = 1.6;
const getStandingMatrix = (display) => {
const stage = display.stageParameters;
if (stage) return stage.sittingToStandingTransform;
// Eigene Matrix: nur Y-Verschiebung um geschätzte Augenhöhe
const m = new Float32Array(16);
m[0] = m[5] = m[10] = m[15] = 1;
m[13] = DEFAULT_EYE_HEIGHT;
return m;
};
const [display] = await navigator.getVRDisplays();
console.log(getStandingMatrix(display)[13]);
// Wichtig · Fallstricke
Veraltet: Die gesamte WebVR-API (inkl. VRStageParameters) wurde nie standardisiert und ist aus allen aktuellen Browsern entfernt bzw. war nur hinter Flags oder in alten Firefox-/Oculus-Browser-Versionen verfügbar. Für neue Projekte die WebXR Device API verwenden – dort übernimmt ein Referenzraum vom Typ 'local-floor' oder 'bounded-floor' (XRSession.requestReferenceSpace()) diese Aufgabe.
- Die Matrix ist column-major; beim Zugriff auf einzelne Elemente (z. B. Translation an Index 12–14) nicht mit zeilenweiser Anordnung verwechseln.
- Für Ansichtsmatrizen muss die Inverse verwendet werden, für Posen bzw. Modellmatrizen die Matrix selbst – eine Verwechslung führt zu einer „unter dem Boden“ liegenden Kamera.
- Die Werte können sich ändern (z. B. nach Neukalibrierung des Raums); daher
stageParametersregelmäßig bzw. pro Frame neu abfragen statt einmalig zu cachen. display.stageParameterskannnullsein – immer prüfen.