Start · Sprachen · JavaScript · Referenz · XRVisibilityMaskChangeEvent.session

XRVisibilityMaskChangeEvent.session

Eigenschaft

Schreibgeschützte Eigenschaft, die die <code>XRSession</code> zurückgibt, auf der das <code>visibilitymaskchange</code>-Ereignis ausgelöst wurde.

seit JavaScript Experimentell – nur einzelne Chromium-basierte Bro Kategorie: webapi

Signatur

XRVisibilityMaskChangeEvent.session

Beschreibung

Die Eigenschaft session des Interfaces XRVisibilityMaskChangeEvent verweist auf die XRSession, zu der das Ereignis gehört. Das Ereignis visibilitymaskchange wird auf einer XR-Sitzung ausgelöst, wenn das XR-Gerät eine neue oder geänderte Sichtbarkeitsmaske für eine Ansicht (z. B. das linke oder rechte Auge) meldet. Die Maske beschreibt, welcher Teil der Ansicht für den Nutzer überhaupt sichtbar ist. Durch die Linsenform von Headsets sind oft Bereiche am Rand nicht sichtbar.

Über session kommen Sie ohne Umweg über Closures oder globale Variablen an die Sitzung. Das ist nützlich, wenn derselbe Handler für mehrere Sitzungen registriert ist oder wenn Sie im Handler direkt Sitzungsdaten wie renderState oder visibilityState auslesen möchten.

Meist verwenden Sie die Eigenschaft zusammen mit eye, index, vertices und indices desselben Ereignisses. So können Sie die Maske der richtigen Sitzung und Ansicht zuordnen und anschließend zum Beispiel einen Stencil-Puffer füllen. Dann werden unsichtbare Pixel gar nicht erst gerendert, was Rechenzeit auf der GPU spart.

Rückgabewert

Typ
XRSession
Beschreibung
Die XRSession, auf der das Ereignis ausgelöst wurde. Der Wert ist schreibgeschützt und wird beim Erzeugen des Ereignisses festgelegt.

Beispiele

Sitzung im visibilitymaskchange-Handler auslesen

const startXR = async () => {
  const session = await navigator.xr.requestSession('immersive-vr');

  session.addEventListener('visibilitymaskchange', (event) => {
    // event.session ist dieselbe Sitzung wie oben
    console.log(event.session === session);
    console.log(`Neue Maske für Auge: ${event.eye}, Ansicht #${event.index}`);
    console.log(`Sitzungsstatus: ${event.session.visibilityState}`);
  });
};

document.querySelector('#vr-button').addEventListener('click', startXR);
true Neue Maske für Auge: left, Ansicht #0 Sitzungsstatus: visible

Ein Handler für mehrere Sitzungen mit Masken-Cache

// Masken je Sitzung und Ansicht speichern
const masksBySession = new WeakMap();

const onMaskChange = (event) => {
  const { session, index, vertices, indices } = event;
  if (!masksBySession.has(session)) {
    masksBySession.set(session, new Map());
  }
  masksBySession.get(session).set(index, {
    vertices: new Float32Array(vertices),
    indices: new Uint32Array(indices)
  });
  console.log(`Sitzung hat jetzt ${masksBySession.get(session).size} Maske(n)`);
};

const start = async (mode) => {
  const session = await navigator.xr.requestSession(mode);
  session.addEventListener('visibilitymaskchange', onMaskChange);
  session.addEventListener('end', () => masksBySession.delete(session), { once: true });
  return session;
};

document.querySelector('#vr-button').addEventListener('click', () => start('immersive-vr'));
Sitzung hat jetzt 1 Maske(n) Sitzung hat jetzt 2 Maske(n)

Alternative: on-Property und Funktionserkennung

const init = async () => {
  if (!('XRVisibilityMaskChangeEvent' in window)) {
    console.warn('Sichtbarkeitsmasken werden nicht unterstützt');
    return;
  }
  const session = await navigator.xr.requestSession('immersive-vr');
  session.onvisibilitymaskchange = (event) => {
    // Handler abmelden, sobald die Sitzung endet
    event.session.addEventListener('end', () => {
      event.session.onvisibilitymaskchange = null;
    }, { once: true });
    console.log('Maske aktualisiert:', event.vertices.length / 2, 'Eckpunkte');
  };
};

document.querySelector('#vr-button').addEventListener('click', init);
Maske aktualisiert: 32 Eckpunkte

// Wichtig · Fallstricke

  • Experimentell: XRVisibilityMaskChangeEvent ist bisher kaum verbreitet und nur in einzelnen Chromium-basierten Browsern auf passender XR-Hardware verfügbar. Prüfen Sie die Unterstützung vorher, z. B. mit 'XRVisibilityMaskChangeEvent' in window. Rechnen Sie außerdem damit, dass das Ereignis nie ausgelöst wird.
  • Sicherer Kontext: WebXR funktioniert nur über HTTPS (oder localhost). Sitzungen müssen durch eine Nutzeraktion wie einen Klick gestartet werden.
  • Schreibgeschützt: Eine Zuweisung an event.session wird ignoriert (im Strict Mode wirft sie einen TypeError).
  • Beendete Sitzungen: Nach dem end-Ereignis verweist session weiterhin auf das Objekt, die Sitzung ist aber nicht mehr nutzbar. Löschen Sie gecachte Masken dann, z. B. mit einer WeakMap, damit kein Speicherleck entsteht.
  • Kopieren Sie vertices und indices, wenn Sie sie später noch brauchen, statt sich auf die Daten des Ereignisobjekts zu verlassen.