Start · Sprachen · JavaScript · Referenz · GamepadPose.hasOrientation

GamepadPose.hasOrientation

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob das Gamepad Orientierungsdaten liefern kann, also ob <code>GamepadPose.orientation</code> sinnvoll befüllt wird.

seit JavaScript Experimentell, veraltet (WebVR/Gamepad Extensions) Kategorie: webapi

Signatur

GamepadPose.hasOrientation

Beschreibung

Die Eigenschaft hasOrientation der Schnittstelle GamepadPose gibt true zurück, wenn das Gamepad seine räumliche Ausrichtung (Rotation) erfassen kann. Das trifft typischerweise auf VR-Controller mit Gyroskop bzw. IMU zu, etwa Controller von Oculus Rift, HTC Vive oder Daydream. Ist der Wert false, kann das Gerät keine Orientierung liefern, und GamepadPose.orientation ist dann meist null.

Man fragt die Eigenschaft ab, bevor man auf orientation, angularVelocity oder angularAcceleration zugreift. So kann eine Anwendung zwischen Controllern mit 3DoF bzw. 6DoF und gewöhnlichen Gamepads ohne Bewegungssensoren unterscheiden und die Steuerung passend anpassen, z. B. einen Laserpointer für Controller mit Orientierung einblenden oder auf reine Knopf- und Achsensteuerung zurückfallen.

Der Wert beschreibt die Fähigkeit des Geräts und nicht, ob in diesem Moment gültige Daten vorliegen. Auch wenn hasOrientation auf true steht, kann orientation kurzzeitig null sein, etwa wenn das Tracking verloren geht. Das Pose-Objekt erreicht man über navigator.getGamepads()[i].pose.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das Gamepad Orientierungsdaten liefern kann, sonst false.

Beispiele

Orientierungsfähigkeit aller Gamepads prüfen

window.addEventListener('gamepadconnected', (event) => {
  const gp = event.gamepad;
  // pose gibt es nur in Browsern mit Gamepad Extensions
  const kannRotation = gp.pose?.hasOrientation ?? false;
  console.log(`${gp.id}: Orientierung ${kannRotation ? 'verfügbar' : 'nicht verfügbar'}`);
});
OpenVR Gamepad: Orientierung verfügbar

Orientierung im Render-Loop sicher auslesen

const update = () => {
  for (const gp of navigator.getGamepads()) {
    if (!gp || !gp.pose) continue;
    const { hasOrientation, orientation } = gp.pose;
    // Fähigkeit UND aktuelle Daten prüfen
    if (hasOrientation && orientation) {
      const [x, y, z, w] = orientation;
      console.log(`Quaternion: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}, ${w.toFixed(2)}`);
    }
  }
  requestAnimationFrame(update);
};
requestAnimationFrame(update);
Quaternion: 0.01, 0.71, 0.00, 0.70

Steuerungsmodus nach Controller-Typ wählen

const waehleSteuerung = (gamepad) => {
  const pose = gamepad.pose;
  if (pose?.hasOrientation && pose?.hasPosition) return '6DoF-Controller';
  if (pose?.hasOrientation) return '3DoF-Laserpointer';
  return 'Klassisches Gamepad';
};

const [erstes] = navigator.getGamepads().filter(Boolean);
if (erstes) console.log(waehleSteuerung(erstes));
3DoF-Laserpointer

// Wichtig · Fallstricke

Veraltet und experimentell: GamepadPose gehört zu den Gamepad Extensions der eingestellten WebVR-API. Firefox hat es früher unterstützt, meist nur hinter Einstellungen. Chrome hatte es nur in WebVR-Testversionen. In aktuellen Browsern fehlt gamepad.pose in der Regel ganz, deshalb immer mit optionaler Verkettung (?.) prüfen.

  • Für neue Projekte besser die WebXR Device API verwenden: XRInputSource mit gripSpace/targetRaySpace und XRFrame.getPose().
  • Aus hasOrientation === true folgt nicht, dass orientation immer gesetzt ist. Bei Tracking-Verlust kann der Wert null sein.
  • Die Gamepad-API steht nur in sicheren Kontexten (HTTPS) zur Verfügung und kann per Permissions-Policy gamepad gesperrt werden.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen werden stillschweigend ignoriert, im Strict Mode lösen sie einen TypeError aus.