Start · Sprachen · JavaScript · Referenz · VRPose.linearVelocity

VRPose.linearVelocity

Eigenschaft

Schreibgeschützte Eigenschaft, die die lineare Geschwindigkeit des <code>VRDisplay</code> als <code>Float32Array</code> [x, y, z] in Metern pro Sekunde liefert, oder <code>null</code>.

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

Signatur

VRPose.linearVelocity

Beschreibung

VRPose.linearVelocity gehört zur veralteten WebVR-API. Die Eigenschaft liefert die lineare Geschwindigkeit des Headsets (bzw. der Sensorquelle eines VRDisplay) zum Zeitpunkt VRPose.timestamp. Der Rückgabewert ist ein Float32Array mit drei Werten: der Geschwindigkeit entlang der x-, y- und z-Achse in Metern pro Sekunde.

Brauchbar ist der Wert vor allem für Vorhersage (Prediction) und Physik: Du kannst die Position des Kopfes für den nächsten Frame schätzen, um Latenz auszugleichen, oder eine Bewegungsgeschwindigkeit auf Objekte übertragen, z. B. wenn der Nutzer sich schnell nach vorne lehnt. Ein Beispiel ist die Formel position + linearVelocity * dt.

Unterstützt das Gerät keine Positionsverfolgung oder liefert es keine Geschwindigkeitsdaten, ist der Wert null. Prüfe deshalb vorher VRDisplay.capabilities.hasPosition und behandle null immer ausdrücklich.

Rückgabewert

Typ
Float32Array | null
Beschreibung
Ein Float32Array mit drei Elementen [vx, vy, vz] in m/s, oder null, wenn keine Geschwindigkeitsdaten verfügbar sind.

Beispiele

Geschwindigkeit pro Frame auslesen

const frameData = new VRFrameData();

navigator.getVRDisplays().then((displays) => {
  const vrDisplay = displays[0];
  if (!vrDisplay) return console.warn('Kein VR-Display gefunden');

  const loop = () => {
    vrDisplay.getFrameData(frameData);
    const v = frameData.pose.linearVelocity;

    if (v) {
      const [vx, vy, vz] = v;
      console.log(`Geschwindigkeit: x=${vx.toFixed(2)} y=${vy.toFixed(2)} z=${vz.toFixed(2)} m/s`);
    } else {
      console.log('Keine Geschwindigkeitsdaten verfügbar');
    }
    vrDisplay.requestAnimationFrame(loop);
  };
  vrDisplay.requestAnimationFrame(loop);
});
Geschwindigkeit: x=0.02 y=-0.01 z=0.35 m/s

Kopfposition für den nächsten Frame vorhersagen

// Einfache lineare Vorhersage: p' = p + v * dt
const predictPosition = (pose, dtSeconds) => {
  const { position, linearVelocity } = pose;
  if (!position) return null;
  if (!linearVelocity) return Float32Array.from(position);

  return Float32Array.from(position, (p, i) => p + linearVelocity[i] * dtSeconds);
};

// Beispiel mit Testdaten
const pose = {
  position: new Float32Array([0, 1.6, 0]),
  linearVelocity: new Float32Array([0.5, 0, -1])
};
console.log(predictPosition(pose, 1 / 90));
Float32Array(3) [0.00555..., 1.6, -0.01111...]

Betrag der Geschwindigkeit (Tempo) berechnen

const speed = (v) => (v ? Math.hypot(v[0], v[1], v[2]) : 0);

const v = new Float32Array([0.3, 0.4, 0]);
const tempo = speed(v);
console.log(`Tempo: ${tempo.toFixed(2)} m/s`);

if (tempo > 2) console.warn('Sehr schnelle Kopfbewegung – Komfort-Vignette einblenden');
Tempo: 0.50 m/s

// Wichtig · Fallstricke

  • Veraltet: WebVR wurde nie standardisiert und aus den meisten Browsern entfernt (Chrome, Firefox). Für neue Projekte nimm die WebXR Device API, dort gibt es XRPose.linearVelocity (als DOMPointReadOnly).
  • Der Wert kann null sein, etwa bei Geräten mit reiner Rotationsverfolgung (3DoF). Prüfe das vor dem Zugriff auf die Indizes.
  • Das zurückgegebene Float32Array kann bei jedem Aufruf von getFrameData() überschrieben werden. Wenn du Werte speichern willst, kopiere sie vorher (Float32Array.from(v)).
  • Die Einheit ist Meter pro Sekunde im Koordinatensystem der Sitz- bzw. Stehfläche. Wie genau der Wert ist, hängt stark von der Hardware ab.
  • Feature-Erkennung: 'getVRDisplays' in navigator.