Start · Sprachen · JavaScript · Referenz · VRPose.angularAcceleration

VRPose.angularAcceleration

Eigenschaft

Schreibgeschützte Eigenschaft, die die Winkelbeschleunigung des <code>VRDisplay</code> zum Zeitpunkt der Pose als <code>Float32Array</code> [x, y, z] oder <code>null</code> liefert.

seit JavaScript WebVR 1.1 (veraltet, nicht standardisiert; nie Bas deprecated seit ja Kategorie: webapi

Signatur

VRPose.angularAcceleration

Beschreibung

VRPose.angularAcceleration gehört zur veralteten WebVR-API. Die Eigenschaft liefert einen Vektor mit drei Komponenten (x, y, z), der beschreibt, wie schnell sich die Drehgeschwindigkeit des Headsets (VRDisplay) gerade ändert. Der Wert bezieht sich auf den Zeitstempel des zugehörigen VRFrameData-Objekts.

Laut WebVR-Spezifikation wird der Wert in Radiant pro Sekunde zum Quadrat (rad/s²) angegeben. Die MDN-Beschreibung spricht von „Metern pro Sekunde pro Sekunde“, das ist aber ungenau: Meter pro Sekunde² gilt nur für linearAcceleration. Jede Komponente beschreibt die Beschleunigung der Drehung um die jeweilige Achse.

Gedacht ist der Wert vor allem für die Pose-Vorhersage. Aus Ausrichtung, angularVelocity und angularAcceleration lässt sich die Kopfhaltung für den nächsten Frame schätzen. Das senkt die gefühlte Latenz. Physik-Effekte, die auf schnelle Kopfbewegungen reagieren, können den Wert ebenfalls nutzen.

Kann die Hardware die Winkelbeschleunigung nicht liefern, ist der Wert null. Prüfe ihn deshalb immer, bevor du ihn verwendest.

Rückgabewert

Typ
Float32Array | null
Beschreibung
Ein Float32Array mit drei Werten [x, y, z] in rad/s² oder null, wenn das Gerät keine Winkelbeschleunigung meldet.

Beispiele

Winkelbeschleunigung im Render-Loop auslesen

const frameData = new VRFrameData();

const start = async () => {
  if (!navigator.getVRDisplays) {
    console.log('WebVR wird nicht unterstützt');
    return;
  }
  const [display] = await navigator.getVRDisplays();
  if (!display) return;

  const loop = () => {
    display.getFrameData(frameData);
    const acc = frameData.pose.angularAcceleration;
    if (acc) {
      const [x, y, z] = acc;
      console.log(`Winkelbeschl.: x=${x.toFixed(2)} y=${y.toFixed(2)} z=${z.toFixed(2)} rad/s²`);
    } else {
      console.log('Keine Winkelbeschleunigung verfügbar');
    }
    display.requestAnimationFrame(loop);
  };
  display.requestAnimationFrame(loop);
};

start();
Winkelbeschl.: x=0.12 y=-0.45 z=0.03 rad/s²

Stärke der Kopfbewegung (Betrag des Vektors) bestimmen

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

const checkJerk = (pose, threshold = 20) => {
  const a = magnitude(pose.angularAcceleration);
  if (a > threshold) {
    console.log(`Ruckartige Kopfbewegung erkannt: ${a.toFixed(1)} rad/s²`);
  }
  return a;
};

// Test mit einem nachgebauten Pose-Objekt
const fakePose = { angularAcceleration: new Float32Array([12, 18, 3]) };
checkJerk(fakePose);
Ruckartige Kopfbewegung erkannt: 21.8 rad/s²

Einfache Vorhersage der Winkelgeschwindigkeit

// v(t + dt) = v + a * dt, getrennt für jede Achse
const predictAngularVelocity = (pose, dtSeconds) => {
  const v = pose.angularVelocity;
  const a = pose.angularAcceleration;
  if (!v) return null;
  if (!a) return Float32Array.from(v);
  return Float32Array.from(v, (vi, i) => vi + a[i] * dtSeconds);
};

const pose = {
  angularVelocity: new Float32Array([0.5, 1.0, 0]),
  angularAcceleration: new Float32Array([2, -4, 0])
};
console.log(predictAngularVelocity(pose, 0.016));
Float32Array(3) [0.532, 0.936, 0]

// Wichtig · Fallstricke

  • Veraltet: WebVR wurde durch die WebXR Device API ersetzt. Es gab nur experimentelle Umsetzungen, etwa in älteren Firefox-Versionen, im Oculus/Samsung Internet oder in Chrome hinter einem Flag. Aktuelle Browser haben WebVR entfernt. Für neue Projekte nimm XRPose mit angularVelocity. WebXR bietet keine direkte Winkelbeschleunigung mehr an.
  • Einheit: Laut Spezifikation rad/s², nicht m/s². Die Angabe in Metern bei MDN ist irreführend.
  • null: Viele Geräte, besonders solche mit nur 3 Freiheitsgraden oder ohne passende Sensoren, liefern null. Ohne Prüfung führt das beim Destrukturieren zu einem TypeError.
  • Werte kopieren: VRFrameData wird meist in jedem Frame wiederverwendet. Wenn du Werte über mehrere Frames speichern willst, kopiere sie, zum Beispiel mit Float32Array.from(acc).
  • Die Messwerte sind oft verrauscht. Glätte sie vor der Weiterverarbeitung, etwa mit einem Tiefpassfilter.
  • WebVR läuft nur in einem sicheren Kontext (HTTPS).