Signatur
Beschreibung
Die Eigenschaft linearAcceleration des VRPose-Interfaces gibt die lineare Beschleunigung des VR-Headsets (VRDisplay) zum Zeitpunkt der Pose zurück. Der Rückgabewert ist ein Float32Array mit drei Komponenten [x, y, z] in Metern pro Sekunde zum Quadrat (m/s²). Das Koordinatensystem ist dasselbe wie bei VRPose.position: x zeigt nach rechts, y nach oben, und negatives z zeigt nach vorn.
Der Wert ist vor allem für Bewegungsvorhersage (Prediction) nützlich. Zusammen mit linearVelocity und position lässt sich abschätzen, wo sich der Kopf in einigen Millisekunden befindet. So kann man Latenz ausgleichen oder physikbasierte Effekte umsetzen, etwa Stoßerkennung oder Partikel, die der Kopfbewegung folgen.
Unterstützt die Hardware keine Beschleunigungsdaten, ist der Wert null. Ob Positionsdaten überhaupt verfügbar sind, zeigt VRDisplay.capabilities.hasPosition. Die Pose bekommt man pro Frame über VRFrameData.pose, nachdem man VRDisplay.getFrameData() aufgerufen hat.
Rückgabewert
Float32Array mit drei Werten [x, y, z] in m/s² oder null, wenn das Gerät keine Beschleunigungsdaten liefert.Beispiele
Beschleunigung pro Frame auslesen
const frameData = new VRFrameData();
const start = async () => {
const [vrDisplay] = await navigator.getVRDisplays();
if (!vrDisplay) return console.log('Kein VR-Gerät gefunden');
const loop = () => {
vrDisplay.getFrameData(frameData);
const acc = frameData.pose.linearAcceleration;
if (acc) {
console.log(`Beschleunigung: x=${acc[0].toFixed(2)} y=${acc[1].toFixed(2)} z=${acc[2].toFixed(2)} m/s²`);
} else {
console.log('Keine Beschleunigungsdaten verfügbar');
}
vrDisplay.requestAnimationFrame(loop);
};
vrDisplay.requestAnimationFrame(loop);
};
start();
Kopfposition vorhersagen (Latenzausgleich)
// p(t) = p0 + v*t + 0.5*a*t²
const predictPosition = (pose, dtSeconds) => {
const p = pose.position;
if (!p) return null;
const v = pose.linearVelocity ?? [0, 0, 0];
const a = pose.linearAcceleration ?? [0, 0, 0];
return [0, 1, 2].map(i => p[i] + v[i] * dtSeconds + 0.5 * a[i] * dtSeconds ** 2);
};
// Beispiel mit simulierten Werten
const fakePose = {
position: new Float32Array([0, 1.6, 0]),
linearVelocity: new Float32Array([0.5, 0, 0]),
linearAcceleration: new Float32Array([2, 0, 0])
};
console.log(predictPosition(fakePose, 0.02));
Ruckartige Bewegungen erkennen
const JERK_THRESHOLD = 15; // m/s²
const magnitude = ([x, y, z]) => Math.hypot(x, y, z);
const checkSuddenMove = (pose) => {
const acc = pose.linearAcceleration;
if (acc && magnitude(acc) > JERK_THRESHOLD) {
console.warn('Starke Kopfbewegung erkannt – Komfort-Vignette aktivieren');
return true;
}
return false;
};
checkSuddenMove({ linearAcceleration: new Float32Array([12, 9, 3]) });
// Wichtig · Fallstricke
Veraltet: Die WebVR API ist ein nie fertiggestellter Entwurf. Sie wurde aus den Browsern entfernt und durch die WebXR Device API ersetzt. Unterstützt wurde sie nur zeitweise, etwa in Firefox (Windows), älteren Versionen von Chrome für Android (Daydream, hinter einem Flag) und im Samsung Internet. Für neue Projekte XRPose und XRRigidTransform verwenden. Eine Entsprechung zu linearAcceleration gibt es in WebXR nicht; XRPose bietet nur linearVelocity und angularVelocity.
- Der Wert kann auch bei vorhandenem Gerät
nullsein, zum Beispiel bei Headsets, die nur die Ausrichtung erfassen (3DoF). Deshalb immer aufnullprüfen. - Die Rohdaten der Beschleunigung sind oft verrauscht. Vor dem Einsatz in einer Vorhersage einen Tiefpassfilter anwenden.
- Das zurückgegebene Array nicht dauerhaft speichern, denn der Browser kann es beim nächsten Frame wiederverwenden. Bei Bedarf mit
Float32Array.from()kopieren. - WebVR benötigt einen sicheren Kontext (HTTPS). Außerdem kann eine Berechtigungsrichtlinie (
xr-spatial-tracking) den Zugriff einschränken.