Signatur
Beschreibung
Die schreibgeschützte Eigenschaft profiles einer XRInputSource liefert ein Array von Zeichenfolgen. Jede Zeichenfolge benennt ein Eingabeprofil, also eine Gerätekonfiguration wie "oculus-touch-v3", "valve-index" oder "generic-trigger-squeeze-thumbstick". Die Einträge sind nach absteigender Spezifität sortiert: Zuerst kommt das genaueste Profil, am Ende steht ein generischer Rückfallwert.
Gebraucht wird die Eigenschaft vor allem, um das passende 3D-Modell eines Controllers zu laden und die Tastenbelegung (z. B. welcher Index in gamepad.buttons der Trigger ist) richtig zuzuordnen. Die Profilnamen passen zur WebXR Input Profiles Registry. Deren Paket @webxr-input-profiles/motion-controllers geht das Array genau in dieser Reihenfolge durch und nimmt das erste Profil, für das Daten vorhanden sind.
Die Profilnamen sind kleingeschrieben und durch Bindestriche getrennt. Bei Eingabequellen ohne passendes Profil (z. B. bei manchen Blick- oder Bildschirm-Eingaben) kann das Array leer sein. Aus Datenschutzgründen darf der User Agent statt eines genauen Geräteprofils auch nur generische Profile melden.
Rückgabewert
Beispiele
Profile aller Eingabequellen protokollieren
const session = await navigator.xr.requestSession('immersive-vr');
session.addEventListener('inputsourceschange', (event) => {
for (const source of event.added) {
console.log(`${source.handedness}:`, source.profiles);
}
});
Passendes Controller-Modell mit Rückfall auswählen
// Modelle, die die Anwendung selbst mitliefert
const availableModels = {
'valve-index': '/models/index.glb',
'oculus-touch': '/models/touch.glb',
'generic-trigger-squeeze-thumbstick': '/models/generic.glb'
};
const pickModel = (inputSource) => {
// Das erste (spezifischste) Profil mit vorhandenem Modell gewinnt
const profile = inputSource.profiles.find((p) => p in availableModels);
return profile ? availableModels[profile] : '/models/fallback.glb';
};
session.addEventListener('inputsourceschange', ({ added }) => {
added.forEach((source) => console.log(pickModel(source)));
});
Handtracking von Controllern unterscheiden
const describeInput = (source) => {
if (source.hand) return 'Handtracking';
if (source.profiles.some((p) => p.startsWith('generic-touchscreen'))) {
return 'Touchscreen (AR)';
}
if (source.profiles.length === 0) return 'Unbekanntes Gerät';
return `Controller: ${source.profiles[0]}`;
};
for (const source of session.inputSources) {
console.log(describeInput(source));
}
// Wichtig · Fallstricke
- Reihenfolge beachten: Das Array von vorn nach hinten durchgehen, nicht nach einem einzelnen festen Namen suchen. So nutzt man bei unbekannten neuen Geräten automatisch das generische Profil am Ende.
- Nicht zur Gerätekennung missbrauchen: Browser dürfen aus Datenschutzgründen nur generische Profile melden, etwa wenn ein Controller zu selten ist. Profile deshalb als Hinweis behandeln und nicht als verlässliche Hardware-Kennung.
- Das Array ist eingefroren. Versuche, es zu verändern (
pushusw.), schlagen fehl und lösen im strikten Modus einenTypeErroraus. - Das Array kann leer sein, z. B. bei
targetRayMode === "gaze". Vor dem Zugriff aufprofiles[0]die Länge prüfen. - Die Profile einer Eingabequelle ändern sich nicht. Ändert sich etwas am Gerät, wird die Quelle über
inputsourceschangeentfernt und neu hinzugefügt. - Kompatibilität: Die Eigenschaft funktioniert nur in einem sicheren Kontext (HTTPS) und in Browsern mit WebXR (Chromium-basierte Browser, Meta Quest Browser). Safari auf visionOS unterstützt WebXR nur teilweise. Firefox auf dem Desktop unterstützt WebXR nicht.