Start · Sprachen · JavaScript · Referenz · new XRVisibilityMaskChangeEvent()

new XRVisibilityMaskChangeEvent()

Methode

Erzeugt ein neues <code>XRVisibilityMaskChangeEvent</code>, das eine geänderte Sichtbarkeitsmaske (Dreiecksnetz) für ein Auge bzw. eine Ansicht einer <code>XRSession</code> beschreibt.

seit JavaScript Experimentell: WebXR (Chromium-basierte Browser, n Kategorie: webapi

Signatur

new XRVisibilityMaskChangeEvent(type, options)

Beschreibung

Der Konstruktor XRVisibilityMaskChangeEvent() erstellt ein Ereignisobjekt vom Typ XRVisibilityMaskChangeEvent. Solche Ereignisse löst der Browser normalerweise selbst auf einer XRSession aus (Ereignistyp visibilitymaskchange), sobald das XR-Gerät mitteilt, welcher Bereich einer Ansicht tatsächlich sichtbar ist. Linsen von VR-Headsets verdecken meist Randbereiche des gerenderten Bildes – die Sichtbarkeitsmaske beschreibt den sichtbaren Bereich als Dreiecksnetz.

Anwendungen nutzen diese Maske, um nicht sichtbare Pixel gar nicht erst zu rendern (etwa über den Stencil- oder Depth-Buffer). Das spart Füllrate und GPU-Zeit, was bei hohen Bildraten im VR-Kontext spürbar ist.

Den Konstruktor selbst ruft man selten direkt auf – typische Einsatzzwecke sind Tests, Polyfills oder das Simulieren von Maskenänderungen, etwa um die eigene Render-Logik ohne echtes Headset zu prüfen. Alle Felder des Init-Objekts sind Pflicht; insbesondere wird eine gültige XRSession benötigt.

Parameter

Name Typ Default Beschreibung
$type Pflicht string Name des Ereignisses, in der Praxis "visibilitymaskchange".
$options Pflicht XRVisibilityMaskChangeEventInit Init-Objekt (erweitert EventInit, also auch bubbles, cancelable, composed) mit folgenden Pflichtfeldern:
  • session (XRSession): die Sitzung, zu der die Maske gehört.
  • eye ("left" | "right" | "none"): das Auge der betroffenen Ansicht.
  • index (number): Index der Ansicht in XRViewerPose.views.
  • vertices (Float32Array): 2D-Eckpunkte (x, y-Paare) des Maskennetzes im normalisierten Ansichtsraum.
  • indices (Uint32Array): Dreiecksindizes in vertices, je drei pro Dreieck.

Beispiele

Auf echte Maskenänderungen einer Sitzung reagieren

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

session.addEventListener('visibilitymaskchange', (event) => {
  // Maske pro Ansicht speichern und später in den Stencil-Buffer zeichnen
  masks.set(event.index, {
    eye: event.eye,
    vertices: event.vertices,
    indices: event.indices,
  });
  console.log(`Maske für ${event.eye}: ${event.indices.length / 3} Dreiecke`);
});
Maske für left: 24 Dreiecke Maske für right: 24 Dreiecke

Maskenänderung für Tests simulieren

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

// Einfaches Quadrat aus zwei Dreiecken als Testmaske
const vertices = new Float32Array([-1, -1, 1, -1, 1, 1, -1, 1]);
const indices = new Uint32Array([0, 1, 2, 0, 2, 3]);

const event = new XRVisibilityMaskChangeEvent('visibilitymaskchange', {
  session,
  eye: 'left',
  index: 0,
  vertices,
  indices,
});

console.log(event.type, event.eye, event.index, event.vertices.length);
session.dispatchEvent(event);
visibilitymaskchange left 0 8

Feature-Erkennung vor der Nutzung

const supportsMask = 'XRVisibilityMaskChangeEvent' in window;

if (!supportsMask) {
  console.warn('Sichtbarkeitsmasken werden nicht unterstützt – es wird das volle Bild gerendert.');
}
Sichtbarkeitsmasken werden nicht unterstützt – es wird das volle Bild gerendert.

// Wichtig · Fallstricke

  • Experimentell: Nur in einigen Chromium-basierten Browsern verfügbar, Firefox und Safari unterstützen die Schnittstelle nicht. Immer per Feature-Erkennung prüfen.
  • Nur in sicheren Kontexten (HTTPS) verfügbar; eine echte XRSession erfordert zudem eine Nutzergeste und ggf. eine Berechtigung.
  • Alle Felder des Init-Objekts sind Pflicht – fehlt z. B. session oder ist es keine XRSession, wirft der Konstruktor einen TypeError.
  • Selbst erzeugte und per dispatchEvent() ausgelöste Ereignisse haben isTrusted === false und verändern die tatsächliche Maske des Geräts nicht.
  • Eine leere Maske (keine Indizes) bedeutet, dass die gesamte Ansicht sichtbar ist – die Render-Logik sollte diesen Fall abfangen.