Start · Sprachen · JavaScript · Referenz · VRPose

VRPose

Schnittstelle

Beschreibt den Zustand eines VR-Sensors zu einem Zeitpunkt: Orientierung, Position sowie Geschwindigkeit und Beschleunigung (linear und Winkel) als <code>Float32Array</code>.

seit JavaScript Veraltet (WebVR 1.1) – nie Baseline, in modernen B deprecated seit ja Kategorie: webapi

Signatur

interface VRPose

Beschreibung

Das Interface VRPose gehört zur veralteten WebVR API. Es liefert den Zustand eines VR-Sensors, meist des Head-Mounted Displays (HMD), zu einem bestimmten Zeitpunkt. Eine Instanz erzeugt man nie selbst. Man liest sie über VRFrameData.pose aus, nachdem VRDisplay.getFrameData() aufgerufen wurde. In früheren Versionen gab es dafür auch VRDisplay.getPose(), das inzwischen ebenfalls veraltet ist.

Alle Eigenschaften sind schreibgeschützt und liefern entweder ein Float32Array oder null, wenn der Sensor den Wert nicht bereitstellen kann:

  • position: Position als Vektor [x, y, z] in Metern, relativ zum Ursprung des Sitz- oder Stehraums.
  • linearVelocity: lineare Geschwindigkeit in Metern pro Sekunde.
  • linearAcceleration: lineare Beschleunigung in Metern pro Sekunde².
  • orientation: Orientierung als Quaternion [x, y, z, w].
  • angularVelocity: Winkelgeschwindigkeit in Radiant pro Sekunde.
  • angularAcceleration: Winkelbeschleunigung in Radiant pro Sekunde².

Typischerweise wird die Pose in jedem Frame einer VRDisplay.requestAnimationFrame()-Schleife gelesen, um die Kamera einer 3D-Szene (z. B. WebGL) nachzuführen. Die Werte für Geschwindigkeit und Beschleunigung dienen vor allem dazu, Bewegungen vorherzusagen und so die Latenz auszugleichen.

Für neue Projekte sollte man VRPose nicht mehr verwenden. Der Nachfolger ist die WebXR Device API mit XRPose und XRViewerPose.

Rückgabewert

Typ
VRPose
Beschreibung
Kein Konstruktor. Instanzen bekommt man über VRFrameData.pose. Jede Eigenschaft liefert ein Float32Array oder null.

Beispiele

Pose pro Frame auslesen

// Nur in Browsern mit WebVR-Unterstützung (z. B. alter Firefox)
const startVR = async () => {
  if (!navigator.getVRDisplays) {
    console.log('WebVR wird nicht unterstützt');
    return;
  }
  const [display] = await navigator.getVRDisplays();
  if (!display) return;

  const frameData = new VRFrameData();

  const onFrame = () => {
    display.getFrameData(frameData);
    const { position, orientation } = frameData.pose;

    if (position) {
      console.log(`Position: ${Array.from(position).map(v => v.toFixed(2)).join(', ')}`);
    }
    if (orientation) {
      console.log(`Orientierung: ${Array.from(orientation).map(v => v.toFixed(2)).join(', ')}`);
    }
    display.requestAnimationFrame(onFrame);
  };

  display.requestAnimationFrame(onFrame);
};

startVR();
Position: 0.01, 1.62, -0.05 Orientierung: 0.00, 0.12, 0.00, 0.99

Bewegung vorhersagen mit linearVelocity

// Einfache lineare Vorhersage der Kopfposition für dt Sekunden
const predictPosition = (pose, dt) => {
  if (!pose.position) return null;
  const p = Array.from(pose.position);
  const v = pose.linearVelocity ? Array.from(pose.linearVelocity) : [0, 0, 0];
  const a = pose.linearAcceleration ? Array.from(pose.linearAcceleration) : [0, 0, 0];
  return p.map((pi, i) => pi + v[i] * dt + 0.5 * a[i] * dt * dt);
};

// Beispiel mit einem simulierten Pose-Objekt
const fakePose = {
  position: new Float32Array([0, 1.6, 0]),
  linearVelocity: new Float32Array([0.5, 0, 0]),
  linearAcceleration: null
};

console.log(predictPosition(fakePose, 0.02));
[0.01, 1.600000023841858, 0]

Feature-Erkennung mit Fallback auf WebXR

const detectVR = async () => {
  if ('xr' in navigator && await navigator.xr.isSessionSupported('immersive-vr')) {
    return 'WebXR (XRViewerPose statt VRPose verwenden)';
  }
  if ('getVRDisplays' in navigator) {
    return 'WebVR (VRPose verfügbar, veraltet)';
  }
  return 'Keine VR-API verfügbar';
};

detectVR().then(console.log);
WebXR (XRViewerPose statt VRPose verwenden)

// Wichtig · Fallstricke

Veraltet: WebVR wurde nie standardisiert und ist aus Chrome, Edge und Firefox entfernt. Verwende stattdessen die WebXR Device API mit XRFrame.getViewerPose() und XRPose. Für ältere Inhalte gibt es das Polyfill webxr-polyfill.

  • Jede Eigenschaft kann null sein. Bei Geräten, die nur die Orientierung erfassen (3DoF, z. B. einfache Handy-Halterungen), ist position meist null. Prüfe den Wert deshalb vor jedem Zugriff.
  • getFrameData() überschreibt dasselbe VRFrameData-Objekt in jedem Frame. Wenn du Werte über mehrere Frames aufheben willst, kopiere sie, z. B. mit Array.from(pose.position) oder new Float32Array(pose.position).
  • Die Orientierung ist ein Quaternion und keine Eulerwinkel. Wenn du Winkel brauchst, musst du selbst umrechnen, z. B. mit gl-matrix oder Three.js.
  • Die Eigenschaft timestamp und die Methode VRDisplay.getPose() gab es nur in frühen Entwürfen. Verlasse dich nicht darauf.
  • WebVR-Funktionen stehen nur in sicheren Kontexten (HTTPS) zur Verfügung und brauchen je nach Browser eine Nutzerinteraktion.