Signatur
Beschreibung
Die schreibgeschützte Eigenschaft angularVelocity des GamepadPose-Interfaces beschreibt, wie schnell sich ein getrackter Controller (z. B. ein VR-Handcontroller) gerade dreht. Der Wert ist ein Float32Array mit drei Elementen, einem Vektor [x, y, z]. Seine Richtung gibt die Drehachse an, seine Länge die Drehgeschwindigkeit in Radiant pro Sekunde.
Du erreichst das GamepadPose-Objekt über gamepad.pose. Das zugehörige Gamepad bekommst du über navigator.getGamepads(). Die Winkelgeschwindigkeit hilft, Bewegungen vorherzusagen. So kannst du Latenz ausgleichen, wenn du den Controller rendern willst, oder physikalisch glaubwürdige Würfe umsetzen, bei denen sich ein geworfenes Objekt mit dem Schwung der Hand weiterdreht.
Ob die Hardware Winkelgeschwindigkeit überhaupt liefern kann, siehst du an pose.hasOrientation. Kann das Gerät keine Orientierung erfassen oder stehen gerade keine Daten bereit, ist der Wert null. Prüfe also immer vorher, ob ein Wert da ist.
Rückgabewert
Float32Array mit drei Werten [x, y, z] für den Winkelgeschwindigkeitsvektor in rad/s, oder null, wenn keine Daten vorliegen.Beispiele
Winkelgeschwindigkeit im Animations-Loop auslesen
const pollPose = () => {
for (const gp of navigator.getGamepads()) {
const velocity = gp?.pose?.angularVelocity;
if (velocity) {
const [x, y, z] = velocity;
console.log(`Controller ${gp.index}: x=${x.toFixed(2)} y=${y.toFixed(2)} z=${z.toFixed(2)} rad/s`);
}
}
requestAnimationFrame(pollPose);
};
window.addEventListener('gamepadconnected', () => requestAnimationFrame(pollPose));
Drehgeschwindigkeit als Betrag in Grad pro Sekunde
const angularSpeedDeg = (pose) => {
const v = pose?.angularVelocity;
if (!v) return null;
const radPerSec = Math.hypot(v[0], v[1], v[2]);
return radPerSec * 180 / Math.PI;
};
const [gp] = navigator.getGamepads();
const speed = angularSpeedDeg(gp?.pose);
console.log(speed === null ? 'Keine Pose-Daten' : `${speed.toFixed(1)} °/s`);
Wurfbewegung erkennen mit Feature-Erkennung
const supportsPose = 'GamepadPose' in window;
const THRESHOLD = 6; // rad/s, schnelle Handgelenksdrehung
const checkFlick = (gp) => {
if (!supportsPose || !gp.pose?.hasOrientation) return false;
const v = gp.pose.angularVelocity;
return v !== null && Math.hypot(...v) > THRESHOLD;
};
const [gp] = navigator.getGamepads();
if (gp && checkFlick(gp)) {
console.log('Schnelle Drehung erkannt – Objekt wird mit Drall geworfen');
}
// Wichtig · Fallstricke
- Veraltet und experimentell:
GamepadPosegehört zur eingestellten WebVR-Gamepad-Erweiterung. Nur Firefox unterstützt es, und auch dort nur hinter einem Flag. Chrome, Safari und Edge unterstützen es nicht. Für neue Projekte nimm die WebXR Device API (XRPose.angularVelocity,XRInputSource). - Der Wert kann
nullsein. Prüfe ihn deshalb immer mit optionaler Verkettung (?.) oder einem Null-Vergleich. - Die Einheit ist Radiant pro Sekunde, nicht Grad. Zum Umrechnen multiplizierst du mit
180 / Math.PI. navigator.getGamepads()liefert Momentaufnahmen. In manchen Browsern musst du die Werte in jedem Frame neu abfragen, statt ein altesGamepad-Objekt aufzubewahren.- Die Gamepad-API ist nur in sicheren Kontexten (HTTPS) zuverlässig verfügbar und kann durch eine Permissions Policy (
gamepad) gesperrt sein.