Start · Sprachen · JavaScript · Referenz · XRReferenceSpaceEvent.referenceSpace

XRReferenceSpaceEvent.referenceSpace

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>XRReferenceSpace</code>-Objekt liefert, von dem das Ereignis (typischerweise <code>reset</code>) ausgelöst wurde.

seit JavaScript WebXR Device API – Chromium-Browser (Chrome/Edge 7 Kategorie: webapi

Signatur

XRReferenceSpaceEvent.referenceSpace

Beschreibung

Die schreibgeschützte Eigenschaft referenceSpace eines XRReferenceSpaceEvent verweist auf den XRReferenceSpace, der das Ereignis ausgelöst hat. Derzeit ist das einzige Ereignis dieses Typs reset. Es wird gefeuert, wenn der Browser bzw. das XR-Gerät den Ursprung des Referenzraums neu festlegt, etwa wenn der Nutzer die Ansicht neu zentriert oder das Tracking verloren gegangen ist und wiederhergestellt wurde.

Die Eigenschaft ist vor allem nützlich, wenn ein gemeinsamer Handler für mehrere Referenzräume registriert ist (z. B. local und bounded-floor). Über event.referenceSpace lässt sich dann feststellen, welcher Raum betroffen ist. Daraufhin kann die Anwendung zum Beispiel davon abgeleitete Räume neu berechnen (getOffsetReferenceSpace()), zwischengespeicherte Posen verwerfen oder bei XRBoundedReferenceSpace die Begrenzung (boundsGeometry) neu einlesen.

Der Wert entspricht in der Regel event.target. Er wird aber beim Erzeugen des Ereignisses fest gesetzt und lässt sich danach nicht mehr ändern.

Rückgabewert

Typ
XRReferenceSpace
Beschreibung
Der Referenzraum, von dem das Ereignis ausgeht. Das kann auch eine Unterklasse wie XRBoundedReferenceSpace sein.

Beispiele

Auf reset reagieren und den betroffenen Raum ermitteln

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

localSpace.addEventListener('reset', (event) => {
  // event.referenceSpace ist der Raum, der zurückgesetzt wurde
  console.log('Zurückgesetzt:', event.referenceSpace === localSpace);
  console.log('Neue Ursprungs-Transformation:', event.transform);
});
Zurückgesetzt: true Neue Ursprungs-Transformation: XRRigidTransform {…}

Gemeinsamer Handler für mehrere Referenzräume

const session = await navigator.xr.requestSession('immersive-vr', {
  optionalFeatures: ['bounded-floor']
});

const spaces = {
  local: await session.requestReferenceSpace('local'),
  floor: await session.requestReferenceSpace('bounded-floor').catch(() => null)
};

const handleReset = ({ referenceSpace }) => {
  if (referenceSpace instanceof XRBoundedReferenceSpace) {
    // Spielfeldgrenzen können sich geändert haben
    console.log('Neue Grenzpunkte:', referenceSpace.boundsGeometry.length);
  } else {
    console.log('Lokaler Raum neu zentriert');
  }
};

Object.values(spaces)
  .filter(Boolean)
  .forEach((space) => space.addEventListener('reset', handleReset));
Lokaler Raum neu zentriert

Abgeleiteten Offset-Raum nach reset neu aufbauen (onreset)

const session = await navigator.xr.requestSession('immersive-vr');
const baseSpace = await session.requestReferenceSpace('local');
const offset = new XRRigidTransform({ x: 0, y: -1.6, z: 0 });
let viewerSpace = baseSpace.getOffsetReferenceSpace(offset);

baseSpace.onreset = (event) => {
  // Offset-Raum auf Basis des zurückgesetzten Raums neu erzeugen
  viewerSpace = event.referenceSpace.getOffsetReferenceSpace(offset);
  console.log('Offset-Raum aktualisiert');
};
Offset-Raum aktualisiert

Ereignis manuell erzeugen (z. B. für Tests)

const session = await navigator.xr.requestSession('inline');
const space = await session.requestReferenceSpace('viewer');

const evt = new XRReferenceSpaceEvent('reset', { referenceSpace: space });
console.log(evt.referenceSpace === space);
true

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an event.referenceSpace wird ignoriert bzw. löst im Strict Mode einen TypeError aus.
  • Nur sichere Kontexte: WebXR steht nur über HTTPS (oder localhost) zur Verfügung. Außerdem kann eine Permissions Policy (xr-spatial-tracking) den Zugriff sperren.
  • Browser-Unterstützung: Chromium-basierte Browser (Chrome, Edge, Samsung Internet) und der Meta Quest Browser unterstützen WebXR. Safari und Firefox auf dem Desktop tun es nicht. Prüfe vorher mit 'xr' in navigator.
  • Kein Ereignis für jede Bewegung: reset wird nur bei einem Sprung des Ursprungs ausgelöst, nicht bei normaler Kopfbewegung. Nicht jede Plattform löst das Ereignis zuverlässig aus. Beim Raumtyp viewer tritt es praktisch nie auf.
  • event.transform kann null sein, wenn der Browser die Differenz zwischen altem und neuem Ursprung nicht kennt. Die Eigenschaft referenceSpace ist dagegen immer gesetzt.