Signatur
Beschreibung
Die Eigenschaft hasPosition des GamepadPose-Interfaces zeigt an, ob der Controller Positionsdaten liefern kann. Ist sie true, enthalten GamepadPose.position sowie ggf. linearVelocity und linearAcceleration sinnvolle Werte. Ist sie false, kann der Controller höchstens seine Ausrichtung melden (3 Freiheitsgrade, 3DoF), etwa ein einfacher VR-Zeiger-Controller.
Man fragt hasPosition typischerweise einmalig nach dem Verbinden eines Gamepads ab, um die Darstellung in einer VR-Szene anzupassen: Controller mit Positionsverfolgung werden frei im Raum gerendert, reine Orientierungs-Controller werden an eine geschätzte Position (z. B. neben der Hüfte des Nutzers) „angeheftet“.
Die Eigenschaft gehört zur experimentellen Gamepad Extensions-Spezifikation, die zusammen mit WebVR entstand. Erreichbar ist sie über Gamepad.pose. Wichtig: Auch bei hasPosition === true kann position kurzzeitig null sein, wenn die Verfolgung (z. B. durch Verdeckung) verloren geht.
Rückgabewert
true, wenn das Gamepad Positionsinformationen verfolgen und liefern kann, sonst false.Beispiele
Fähigkeit beim Verbinden prüfen
window.addEventListener('gamepadconnected', (event) => {
const { pose, id } = event.gamepad;
if (!pose) {
console.log(`${id}: keine Pose-Unterstützung`);
return;
}
console.log(`${id}: Positionsverfolgung = ${pose.hasPosition}`);
});
Position im Render-Loop sicher auslesen
const DEFAULT_OFFSET = [0.2, -0.5, -0.3]; // geschätzte Hüftposition
const getControllerPosition = (gamepad) => {
const pose = gamepad?.pose;
if (pose?.hasPosition && pose.position) {
return Array.from(pose.position);
}
// 3DoF-Controller oder Tracking verloren: Ersatzposition
return DEFAULT_OFFSET;
};
const loop = () => {
for (const gp of navigator.getGamepads()) {
if (gp) console.log(gp.index, getControllerPosition(gp));
}
requestAnimationFrame(loop);
};
requestAnimationFrame(loop);
Controller nach Freiheitsgraden klassifizieren
const classify = (pose) => {
if (!pose) return 'kein Tracking';
if (pose.hasPosition && pose.hasOrientation) return '6DoF';
if (pose.hasOrientation) return '3DoF (nur Rotation)';
return 'unbekannt';
};
const gamepads = navigator.getGamepads().filter(Boolean);
gamepads.forEach((gp) => console.log(gp.id, '→', classify(gp.pose)));
// Wichtig · Fallstricke
- Experimentell und veraltet:
GamepadPosewar nur in Firefox (hinterdom.gamepad.extensions.enabled) bzw. in frühen WebVR-Builds verfügbar. Für neue Projekte die WebXR Device API verwenden (XRInputSource,XRFrame.getPose()). gamepad.posekannnulloderundefinedsein – immer mit optionaler Verkettung (?.) prüfen.hasPositionbeschreibt nur die Fähigkeit;positionkann trotzdemnullsein, wenn das Tracking vorübergehend ausfällt.- Die Gamepad-API liefert Daten meist nur in sicheren Kontexten (HTTPS) und nach einer Nutzerinteraktion mit dem Gerät.