Signatur
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
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();
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]) }));
// 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.angularVelocityalsDOMPointReadOnlybereitstellt. - 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 mitArray.from(av). - Vor der Nutzung mit Feature-Erkennung absichern:
if ('getVRDisplays' in navigator).