Start · Sprachen · JavaScript · Referenz · XRReferenceSpaceEvent.transform

XRReferenceSpaceEvent.transform

Eigenschaft

Liefert als <code>XRRigidTransform</code> die neue Position und Orientierung des nativen Ursprungs des Referenzraums, angegeben im Koordinatensystem vor dem Ereignis.

seit JavaScript WebXR Device API – Chromium-basierte Browser (Chro Kategorie: webapi

Signatur

XRReferenceSpaceEvent.transform

Beschreibung

Die schreibgeschützte Eigenschaft transform eines XRReferenceSpaceEvent beschreibt, wie sich der native Ursprung eines XRReferenceSpace durch das Ereignis verschoben hat. Derzeit gibt es nur einen Ereignistyp dieser Art: reset. Er wird ausgelöst, wenn das XR-System den Ursprung neu festlegt, z. B. weil der Nutzer das Tracking neu zentriert, das Headset nach einem Tracking-Verlust neu initialisiert wurde oder die Grenzen eines bounded-floor-Raums neu eingerichtet wurden.

Der Wert ist ein XRRigidTransform. Er gibt die Pose des neuen Ursprungs im alten Koordinatensystem an. Haben Sie Objekte, Wegpunkte oder Ankerpositionen in Koordinaten des alten Referenzraums gespeichert, rechnen Sie diese mit transform.inverse in das neue System um. Dann bleiben virtuelle Inhalte an ihrem Platz in der realen Welt, statt mit dem Ursprung mitzuspringen.

Kann das System die Verschiebung nicht bestimmen (etwa nach einem vollständigen Tracking-Verlust), ist transform null. Ihre Anwendung sollte die Szene dann sinnvoll neu ausrichten, statt eine Korrektur zu versuchen.

Rückgabewert

Typ
XRRigidTransform | null
Beschreibung
Die Pose des neuen nativen Ursprungs, angegeben im Koordinatensystem vor dem Ereignis, oder null, wenn die Verschiebung unbekannt ist.

Beispiele

Auf ein reset-Ereignis reagieren (addEventListener)

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

refSpace.addEventListener('reset', (event) => {
  const t = event.transform;
  if (t) {
    const { x, y, z } = t.position;
    console.log(`Ursprung verschoben um (${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)})`);
  } else {
    console.log('Ursprung zurückgesetzt – Verschiebung unbekannt');
  }
});
Ursprung verschoben um (0.35, 0.00, -1.20)

Gespeicherte Objektpositionen in das neue Koordinatensystem umrechnen

// Punkt mit einer spaltenweise gespeicherten 4x4-Matrix transformieren
const transformPoint = (m, p) => ({
  x: m[0] * p.x + m[4] * p.y + m[8]  * p.z + m[12],
  y: m[1] * p.x + m[5] * p.y + m[9]  * p.z + m[13],
  z: m[2] * p.x + m[6] * p.y + m[10] * p.z + m[14]
});

// Positionen virtueller Objekte, gespeichert im Referenzraum
const placedObjects = [
  { name: 'Würfel', position: { x: 1, y: 0, z: -2 } }
];

refSpace.onreset = (event) => {
  if (!event.transform) {
    placedObjects.length = 0; // Neu platzieren lassen
    return;
  }
  // alt -> neu: Umkehrung der Pose des neuen Ursprungs
  const m = event.transform.inverse.matrix;
  for (const obj of placedObjects) {
    obj.position = transformPoint(m, obj.position);
  }
  console.log(placedObjects[0].position);
};
{ x: 0.65, y: 0, z: -0.8 } // Beispielwerte, je nach Verschiebung

Ereignis zu Testzwecken selbst erzeugen

const fakeTransform = new XRRigidTransform({ x: 0.5, y: 0, z: 0 });
const evt = new XRReferenceSpaceEvent('reset', {
  referenceSpace: refSpace,
  transform: fakeTransform
});
refSpace.dispatchEvent(evt);
console.log(evt.transform.position.x);
0.5

// Wichtig · Fallstricke

  • Richtung beachten: transform gibt die Pose des neuen Ursprungs im alten System an. Um alte Koordinaten in neue umzurechnen, brauchen Sie transform.inverse. Diese Richtung wird leicht verwechselt.
  • Auf null prüfen: Ist die Verschiebung unbekannt, ist der Wert null. Lesen Sie ihn deshalb nie ohne Prüfung aus.
  • Von Ihnen mit getOffsetReferenceSpace() abgeleitete Räume folgen dem neuen Ursprung automatisch. Selbst gespeicherte Rohkoordinaten müssen Sie dagegen selbst umrechnen.
  • XRAnchor-Posen (Erweiterung für räumliche Anker) werden vom System aktuell gehalten und brauchen in der Regel keine Korrektur.
  • Bei viewer-Referenzräumen gibt es kein reset-Ereignis.
  • Kompatibilität: Die Eigenschaft funktioniert nur in sicheren Kontexten (HTTPS) und in Browsern mit WebXR-Unterstützung (Chrome/Edge, Meta Quest Browser, Samsung Internet). Safari und Firefox-Desktop unterstützen sie nicht. Die Eigenschaft ist experimentell.