Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

XRSession: visibilitymaskchange-Ereignis

Experimentell: Dies ist eine experimentelle Technologie
Überprüfen Sie die Browser-Kompatibilitätstabelle sorgfältig vor der Verwendung auf produktiven Webseiten.

Sicherer Kontext: Diese Funktion ist nur in sicheren Kontexten (HTTPS) in einigen oder allen unterstützenden Browsern verfügbar.

Das visibilitymaskchange-Ereignis wird an eine XRSession gesendet, wenn sich der für den Benutzer sichtbare Teil einer XRView ändert.

Beachten Sie, dass die Ansicht mit einem bestimmten Auge verbunden ist und der sichtbare Teil für den Benutzer durch eine Sichtbarkeitsmaske definiert ist. Weitere Informationen finden Sie in der XRVisibilityMaskChangeEvent-Schnittstelle.

Dies ermöglicht Leistungsverbesserungen, indem der Browser nur den sichtbaren Teil der aktualisierten Ansicht zeichnet.

Syntax

Verwenden Sie den Ereignisnamen in Methoden wie addEventListener() oder setzen Sie eine Ereignishandler-Eigenschaft.

js
addEventListener("visibilitymaskchange", (event) => { })

onvisibilitymaskchange = (event) => { }

Ereignistyp

Ein XRVisibilityMaskChangeEvent. Erbt von Event.

Event XRVisibilityMaskChangeEvent

Beispiele

Three.js-Beispiel

Dieses Snippet zeigt, wie visibilitymaskchange verwendet werden könnte, um in einer Three.js-Anwendung nur den sichtbaren Teil der XRView zu zeichnen. Die neue Ansicht muss mit der XRView.projectionMatrix der entsprechenden XRView und einem Standard-XRRigidTransform gezeichnet werden.

js
session.addEventListener("visibilitymaskchange", onVisibilityMaskChange);

function onVisibilityMaskChange(event) {
  const geometry = new BufferGeometry();
  geometry.setIndex(new BufferAttribute(event.indices, 1));
  const vertices = new Float32Array((event.vertices.length / 2) * 3);
  let x = 0,
    y = 0;
  while (x < event.vertices.length) {
    vertices[y++] = event.vertices[x++];
    vertices[y++] = event.vertices[x++];
    vertices[y++] = -1;
  }

  geometry.setAttribute("position", new BufferAttribute(vertices, 3));

  const mask = event.eye === "left" ? leftEyeMask : rightEyeMask;
  const matrix = cameras[event.eye === "left" ? 0 : 1].projectionMatrix;
  mask.geometry = geometry;
  mask.material = new ShaderMaterial({
    vertexShader: _visibility_mask_vertex,
    fragmentShader: _visibility_mask_fragment,
    uniforms: {
      clipMatrix: { value: matrix },
    },
  });

  maskScene = new Scene();
  maskScene.add(leftEyeMask);
  maskScene.add(rightEyeMask);
}

Der Code-Schnipsel stammt aus diesem Fork von WebXRManager.js.

Spezifikationen

Spezifikation
WebXR Device API
# eventdef-xrsession-visibilitymaskchange

Browser-Kompatibilität