Signatur
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
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'}`);
});
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);
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));
// 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:
XRInputSourcemitgripSpace/targetRaySpaceundXRFrame.getPose(). - Aus
hasOrientation === truefolgt nicht, dassorientationimmer gesetzt ist. Bei Tracking-Verlust kann der Wertnullsein. - Die Gamepad-API steht nur in sicheren Kontexten (HTTPS) zur Verfügung und kann per Permissions-Policy
gamepadgesperrt werden. - Die Eigenschaft ist schreibgeschützt. Zuweisungen werden stillschweigend ignoriert, im Strict Mode lösen sie einen
TypeErroraus.