Start · Sprachen · JavaScript · Referenz · GamepadPose.angularVelocity

GamepadPose.angularVelocity

Eigenschaft

Liefert die Winkelgeschwindigkeit des Controllers als <code>Float32Array</code> mit drei Werten (x, y, z) in Radiant pro Sekunde oder <code>null</code>.

seit JavaScript Experimentell (WebVR-Gamepad-Erweiterung), veralte Kategorie: webapi

Signatur

GamepadPose.angularVelocity

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

Typ
Float32Array | null
Beschreibung
Ein 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));
Controller 0: x=0.12 y=-1.57 z=0.03 rad/s

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`);
90.0 °/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: GamepadPose gehö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 null sein. 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 altes Gamepad-Objekt aufzubewahren.
  • Die Gamepad-API ist nur in sicheren Kontexten (HTTPS) zuverlässig verfügbar und kann durch eine Permissions Policy (gamepad) gesperrt sein.