Start · Sprachen · JavaScript · Referenz · VRPose.angularVelocity

VRPose.angularVelocity

Eigenschaft

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

seit JavaScript WebVR 1.1 (veraltet, nie Baseline; ersetzt durch W deprecated seit ja Kategorie: webapi

Signatur

VRPose.angularVelocity

Beschreibung

Die Eigenschaft angularVelocity des VRPose-Interfaces aus der veralteten WebVR-API gibt einen Vektor mit drei Werten zurück. Er beschreibt, wie schnell sich das VR-Headset (VRDisplay) im Moment der Abfrage um die x-, y- und z-Achse dreht, gemessen in Radiant pro Sekunde.

Nützlich ist der Wert für die Bewegungsvorhersage: Man kann die Ausrichtung für den Zeitpunkt der Bildausgabe hochrechnen und so die gefühlte Latenz senken. Außerdem lässt er sich für Effekte einsetzen, die von der Kopfbewegung abhängen, etwa Bewegungsunschärfe, oder um schnelle Kopfdrehungen zu erkennen.

Den Wert erhält man über VRFrameData.pose, nachdem VRDisplay.getFrameData() aufgerufen wurde. Kann das Gerät keine Winkelgeschwindigkeit melden, ist die Eigenschaft null. Ob das so ist, zeigt vorab VRDisplay.capabilities.hasOrientation.

Rückgabewert

Typ
Float32Array | null
Beschreibung
Ein Float32Array mit drei Einträgen [x, y, z] für die Winkelgeschwindigkeit in rad/s oder null, wenn das Gerät den Wert nicht liefert.

Beispiele

Winkelgeschwindigkeit pro Frame auslesen

const frameData = new VRFrameData();

const init = async () => {
  const [vrDisplay] = await navigator.getVRDisplays();
  if (!vrDisplay) return console.log('Kein VR-Gerät gefunden');

  const loop = () => {
    vrDisplay.getFrameData(frameData);
    const av = frameData.pose.angularVelocity;
    if (av) {
      console.log(`Drehung: x=${av[0].toFixed(2)} y=${av[1].toFixed(2)} z=${av[2].toFixed(2)} rad/s`);
    }
    vrDisplay.requestAnimationFrame(loop);
  };
  vrDisplay.requestAnimationFrame(loop);
};

init();
Drehung: x=0.01 y=-0.35 z=0.00 rad/s

Schnelle Kopfdrehung erkennen

const SCHWELLE = 3; // rad/s

const istSchnelleDrehung = (pose) => {
  const av = pose.angularVelocity;
  if (!av) return false;
  const betrag = Math.hypot(av[0], av[1], av[2]);
  return betrag > SCHWELLE;
};

// in der Render-Schleife:
// if (istSchnelleDrehung(frameData.pose)) aktiviereBewegungsunschaerfe();

Einfache Vorhersage des Gierwinkels

// Gierwinkel (Drehung um y) für die nächsten 16 ms hochrechnen
const vorhersageGier = (aktuelleGier, pose, dtSek = 0.016) => {
  const av = pose.angularVelocity;
  return av ? aktuelleGier + av[1] * dtSek : aktuelleGier;
};

console.log(vorhersageGier(1.0, { angularVelocity: new Float32Array([0, 0.5, 0]) }));
1.008

// Wichtig · Fallstricke

  • Veraltet: WebVR ist aus der Spezifikation entfernt und wird von aktuellen Browsern praktisch nicht mehr unterstützt (früher nur in Firefox und in einigen Chromium-Builds per Flag). Für neue Projekte gibt es die WebXR Device API, die Geschwindigkeiten über XRPose.angularVelocity als DOMPointReadOnly bereitstellt.
  • Prüfe den Wert immer auf null, bevor du ihn verwendest.
  • Die Werte sind ein Momentaufnahme-Vektor und keine Quaternion. Die Einheit ist rad/s, nicht Grad.
  • Das Array kann bei jedem getFrameData()-Aufruf überschrieben werden. Brauchst du den Wert später noch, kopiere ihn, zum Beispiel mit Array.from(av).
  • Vor der Nutzung mit Feature-Erkennung absichern: if ('getVRDisplays' in navigator).