Start · Sprachen · JavaScript · Referenz · XRTransientInputHitTestResult.inputSource

XRTransientInputHitTestResult.inputSource

Eigenschaft

Schreibgeschützte Eigenschaft, die die <code>XRInputSource</code> liefert, für die das <code>results</code>-Array dieses Hit-Test-Ergebnisses berechnet wurde.

seit JavaScript WebXR Hit Test Module – Chromium-basierte Browser Kategorie: webapi

Signatur

XRTransientInputHitTestResult.inputSource

Beschreibung

Die schreibgeschützte Eigenschaft inputSource der Schnittstelle XRTransientInputHitTestResult gibt das XRInputSource-Objekt zurück, zu dem dieses Ergebnis gehört. Aus dem Strahl (target ray) genau dieser Eingabequelle wurden die Treffer im Array results berechnet.

Transiente Eingabequellen gibt es nur für kurze Zeit, zum Beispiel beim Tippen auf den Bildschirm in einer Handheld-AR-Sitzung auf dem Smartphone. Über XRSession.requestHitTestSourceForTransientInput() meldet man einen Hit Test für alle Eingaben mit einem bestimmten Profil an (etwa "generic-touchscreen"). In jedem Frame liefert XRFrame.getHitTestResultsForTransientInput() dann ein Array mit XRTransientInputHitTestResult-Objekten zurück, eines pro aktiver Eingabequelle.

Mit inputSource ordnet man jedes Ergebnis seiner Eingabe zu. Das ist vor allem bei Multitouch wichtig: Man kann so Finger auseinanderhalten, die handedness oder die profiles abfragen oder das Ergebnis mit der Eingabequelle aus select-Events abgleichen.

Rückgabewert

Typ
XRInputSource
Beschreibung
Die transiente Eingabequelle, deren Zielstrahl für die Berechnung von results verwendet wurde. Für ein bestimmtes Ergebnisobjekt ändert sich der Wert nicht.

Beispiele

Treffer pro Touch-Eingabe auswerten

const session = await navigator.xr.requestSession('immersive-ar', {
  requiredFeatures: ['hit-test']
});
const refSpace = await session.requestReferenceSpace('local');

const transientSource = await session.requestHitTestSourceForTransientInput({
  profile: 'generic-touchscreen'
});

const onFrame = (time, frame) => {
  const perInput = frame.getHitTestResultsForTransientInput(transientSource);

  for (const result of perInput) {
    const source = result.inputSource; // XRInputSource dieses Fingers
    if (result.results.length > 0) {
      const pose = result.results[0].getPose(refSpace);
      console.log(source.profiles, pose.transform.position);
    }
  }
  session.requestAnimationFrame(onFrame);
};
session.requestAnimationFrame(onFrame);
["generic-touchscreen"] DOMPointReadOnly {x: 0.12, y: -1.4, z: -0.8, w: 1}

Ergebnis mit dem select-Event der Eingabequelle abgleichen

// Merkt sich den letzten Treffer je Eingabequelle
const lastHits = new Map();

const onFrame = (time, frame) => {
  for (const r of frame.getHitTestResultsForTransientInput(transientSource)) {
    if (r.results.length) {
      lastHits.set(r.inputSource, r.results[0].getPose(refSpace));
    }
  }
  session.requestAnimationFrame(onFrame);
};
session.requestAnimationFrame(onFrame);

session.addEventListener('select', (event) => {
  const pose = lastHits.get(event.inputSource);
  if (pose) {
    placeObjectAt(pose.transform.matrix); // eigene Funktion
    console.log('Objekt platziert');
  }
  lastHits.delete(event.inputSource);
});
Objekt platziert

Nur Eingaben der rechten Hand berücksichtigen

const rightHandHits = (frame, source) =>
  frame.getHitTestResultsForTransientInput(source)
    .filter((r) => r.inputSource.handedness === 'right');

// im Frame-Callback:
// const hits = rightHandHits(frame, transientSource);
// console.log(hits.length);

// Wichtig · Fallstricke

  • Kompatibilität: Das WebXR Hit Test Module ist experimentell. Es wird im Wesentlichen nur von Chromium-Browsern unter Android mit ARCore unterstützt. Firefox und Safari unterstützen es nicht. Vorher mit navigator.xr?.isSessionSupported('immersive-ar') prüfen und das Feature 'hit-test' anfordern.
  • Funktioniert nur in einem sicheren Kontext (HTTPS) und in einer aktiven XR-Sitzung.
  • Transiente Eingabequellen sind kurzlebig. Das XRInputSource-Objekt ist nach dem Ende der Berührung ungültig. Referenzen, die man zum Beispiel in einer Map gespeichert hat, sollte man bei selectend oder inputsourceschange wieder entfernen, sonst entstehen Speicherlecks.
  • Das Array results kann leer sein, auch wenn inputSource gesetzt ist. Vor dem Zugriff auf results[0] immer die Länge prüfen.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert bzw. löst im Strict Mode einen TypeError aus.