Signatur
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
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);
});
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));
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');
// 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(alsDOMPointReadOnly). - Der Wert kann
nullsein, etwa bei Geräten mit reiner Rotationsverfolgung (3DoF). Prüfe das vor dem Zugriff auf die Indizes. - Das zurückgegebene
Float32Arraykann bei jedem Aufruf vongetFrameData()ü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.