Start · Sprachen · JavaScript · Referenz · XRInputSource.profiles

XRInputSource.profiles

Eigenschaft

Schreibgeschütztes Array von Profil-Strings, die das Eingabegerät einer <code>XRInputSource</code> von spezifisch bis generisch beschreiben.

seit JavaScript WebXR Device API – Chrome/Edge 79+, Samsung Intern Kategorie: webapi

Signatur

XRInputSource.profiles

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

Typ
ReadonlyArray<string> (FrozenArray<DOMString>)
Beschreibung
Ein eingefrorenes Array von Profilnamen, sortiert vom spezifischsten zum allgemeinsten. Es kann leer sein.

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);
  }
});
left: ["oculus-touch-v3", "oculus-touch-v2", "oculus-touch", "generic-trigger-squeeze-thumbstick"] right: ["oculus-touch-v3", "oculus-touch-v2", "oculus-touch", "generic-trigger-squeeze-thumbstick"]

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)));
});
/models/touch.glb

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));
}
Controller: valve-index

// 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 (push usw.), schlagen fehl und lösen im strikten Modus einen TypeError aus.
  • Das Array kann leer sein, z. B. bei targetRayMode === "gaze". Vor dem Zugriff auf profiles[0] die Länge prüfen.
  • Die Profile einer Eingabequelle ändern sich nicht. Ändert sich etwas am Gerät, wird die Quelle über inputsourceschange entfernt 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.