Start · Sprachen · JavaScript · Referenz · VRStageParameters.sittingToStandingTransform

VRStageParameters.sittingToStandingTransform

Eigenschaft

Nur lesbare Eigenschaft mit einer 4×4-Matrix (<code>Float32Array</code>), die Sitzraum-Koordinaten aus <code>VRFrameData</code> in den Stehraum (Raumkoordinaten) überführt.

seit JavaScript Veraltet (WebVR 1.1, nie standardisiert) – ersetzt deprecated seit ja Kategorie: webapi

Signatur

VRStageParameters.sittingToStandingTransform

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

Typ
Float32Array
Beschreibung
Eine 4×4-Matrix mit 16 Werten in spaltenweiser Anordnung, die Sitzraum- in Stehraum-Koordinaten transformiert. Typischerweise enthält sie vor allem eine Translation in Y-Richtung (Augenhöhe über dem Boden).

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');
}
Höhe des Sitzursprungs über dem Boden: 1.65 m

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]);
1.6

// 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 stageParameters regelmäßig bzw. pro Frame neu abfragen statt einmalig zu cachen.
  • display.stageParameters kann null sein – immer prüfen.