Start · Sprachen · JavaScript · Referenz · XRVisibilityMaskChangeEvent.eye

XRVisibilityMaskChangeEvent.eye

Eigenschaft

Schreibgeschützte Eigenschaft, die angibt, für welches Auge (<code>"left"</code>, <code>"right"</code> oder <code>"none"</code>) die gelieferte Sichtbarkeitsmaske gilt.

seit JavaScript Experimentell – WebXR (nur in wenigen Chromium-bas Kategorie: webapi

Signatur

XRVisibilityMaskChangeEvent.eye

Beschreibung

Die Eigenschaft eye eines XRVisibilityMaskChangeEvent gibt an, auf welches Auge sich die im Ereignis enthaltene Sichtbarkeitsmaske (vertices und indices) bezieht. Der Wert ist vom Typ XREye und kann "left", "right" oder "none" sein. "none" steht für Ansichten, die keinem bestimmten Auge zugeordnet sind, etwa bei monoskopischer Darstellung oder zusätzlichen Ansichten.

Das Ereignis visibilitymaskchange wird auf der XRSession ausgelöst, sobald das Gerät eine neue oder geänderte Maske meldet. Die Maske beschreibt den Bereich jeder Ansicht, der durch die Linsen tatsächlich sichtbar ist. Pixel außerhalb davon muss man nicht rendern.

In der Praxis nutzt man eye zusammen mit index bzw. view, um die Maskengeometrie der richtigen Ansicht zuzuordnen. Mit der Geometrie füllt man dann z. B. den Stencil- oder Tiefenpuffer vorab, damit der Fragment-Shader unsichtbare Randbereiche überspringt. Das spart GPU-Leistung.

Rückgabewert

Typ
XREye ("left" | "right" | "none")
Beschreibung
Eine Zeichenkette, die das Auge der betroffenen Ansicht angibt.

Beispiele

Masken pro Auge mit addEventListener speichern

const masks = new Map();

const session = await navigator.xr.requestSession('immersive-vr');

session.addEventListener('visibilitymaskchange', (event) => {
  // Maske für das jeweilige Auge ablegen
  masks.set(event.eye, {
    vertices: event.vertices, // Float32Array (x, y)
    indices: event.indices    // Uint32Array (Dreiecke)
  });
  console.log(`Neue Maske für Auge: ${event.eye}, Dreiecke: ${event.indices.length / 3}`);
});
Neue Maske für Auge: left, Dreiecke: 64 Neue Maske für Auge: right, Dreiecke: 64

Über die on-Property und Zuordnung im Render-Loop

const maskByEye = {};

session.onvisibilitymaskchange = (event) => {
  maskByEye[event.eye] = event.vertices;
};

const onFrame = (time, frame) => {
  const pose = frame.getViewerPose(refSpace);
  if (pose) {
    for (const view of pose.views) {
      const mask = maskByEye[view.eye];
      if (mask) {
        // Maske z. B. in den Stencil-Puffer zeichnen (eigene Funktion)
        drawStencilMask(view, mask);
      }
      renderScene(view);
    }
  }
  session.requestAnimationFrame(onFrame);
};

session.requestAnimationFrame(onFrame);

Werte von eye auswerten

session.addEventListener('visibilitymaskchange', ({ eye, index }) => {
  switch (eye) {
    case 'left':
      console.log(`Linkes Auge (View-Index ${index})`);
      break;
    case 'right':
      console.log(`Rechtes Auge (View-Index ${index})`);
      break;
    default:
      console.log(`Ansicht ohne Augenzuordnung (Index ${index})`);
  }
});
Linkes Auge (View-Index 0) Rechtes Auge (View-Index 1)

// Wichtig · Fallstricke

  • Experimentell: Die Eigenschaft wird bisher kaum unterstützt (vor allem in Chromium-basierten XR-Browsern wie dem Meta-Quest-Browser). Vorher prüfen, z. B. mit 'onvisibilitymaskchange' in XRSession.prototype.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen haben keine Wirkung.
  • eye reicht nicht immer als eindeutiger Schlüssel: Bei mehr als zwei Ansichten können mehrere Ansichten den Wert "none" haben. Nutzen Sie dann besser index oder view.
  • Das Ereignis kann während einer Sitzung mehrfach auftreten. Ersetzen Sie deshalb gespeicherte Masken und hängen Sie keine neuen an.
  • Nur in sicheren Kontexten (HTTPS) und in immersiven Sitzungen verfügbar.