Start · Sprachen · JavaScript · Referenz · XREquirectLayer.transform

XREquirectLayer.transform

Eigenschaft

Legt als <code>XRRigidTransform</code> Position und Ausrichtung einer equirektangulären Ebene relativ zu ihrem Referenzraum (<code>space</code>) fest.

seit JavaScript WebXR Layers API – experimentell (Chromium-basiert Kategorie: webapi

Signatur

XREquirectLayer.transform

Beschreibung

Die Eigenschaft transform einer XREquirectLayer enthält ein XRRigidTransform-Objekt. Es beschreibt den Versatz (position) und die Ausrichtung (orientation) der Ebene relativ zu dem Referenzraum, der in XREquirectLayer.space hinterlegt ist. Da eine equirektanguläre Ebene auf die Innenseite einer Kugel projiziert wird, bestimmt transform vor allem den Mittelpunkt dieser Kugel und ihre Drehung. So legt man zum Beispiel fest, in welche Richtung die „Vorderseite“ eines 360°-Panoramas oder -Videos zeigt.

Die Eigenschaft kann gelesen und geschrieben werden. Man setzt sie meist schon beim Erzeugen über XRWebGLBinding.createEquirectLayer() oder XRMediaBinding.createEquirectLayer() (Option transform). Später lässt sie sich zur Laufzeit ersetzen, etwa um ein Panorama zu drehen. Weil XRRigidTransform unveränderlich ist, muss man dafür immer ein neues Objekt zuweisen. Die Felder eines bestehenden Objekts lassen sich nicht ändern.

Typische Einsatzfälle sind 360°-Videoplayer, Panorama-Fotobetrachter und Skyboxen in WebXR-Anwendungen. Der Compositor zeichnet die Ebene direkt und damit in hoher Qualität, ohne dass die Szene selbst neu gerendert werden muss.

Rückgabewert

Typ
XRRigidTransform
Beschreibung
Ein XRRigidTransform mit position (DOMPointReadOnly), orientation (Quaternion als DOMPointReadOnly), matrix und inverse. Wird beim Erzeugen kein Wert angegeben, ist es die Identitätstransformation.

Beispiele

360°-Video-Ebene mit Transformation erzeugen

const session = await navigator.xr.requestSession('immersive-vr', {
  requiredFeatures: ['layers']
});
const refSpace = await session.requestReferenceSpace('local');

const video = document.querySelector('video');
const mediaBinding = new XRMediaBinding(session);

// Kugelmittelpunkt 1,6 m über dem Ursprung (Augenhöhe)
const layer = mediaBinding.createEquirectLayer(video, {
  space: refSpace,
  layout: 'mono',
  transform: new XRRigidTransform({ x: 0, y: 1.6, z: 0 })
});

session.updateRenderState({ layers: [layer] });
console.log(layer.transform.position.y);
1.6

Panorama zur Laufzeit um 90° drehen

// Quaternion für eine Drehung um die Y-Achse
const yRotation = (deg) => {
  const rad = (deg * Math.PI) / 180;
  return { x: 0, y: Math.sin(rad / 2), z: 0, w: Math.cos(rad / 2) };
};

// XRRigidTransform ist unveränderlich – neues Objekt zuweisen
const { position } = layer.transform;
layer.transform = new XRRigidTransform(
  { x: position.x, y: position.y, z: position.z },
  yRotation(90)
);

console.log(layer.transform.orientation.y.toFixed(3));
0.707

Aktuelle Transformation auslesen

const { position, orientation } = layer.transform;
console.log(`Position: ${position.x}, ${position.y}, ${position.z}`);
console.log(`Orientierung (w): ${orientation.w}`);
Position: 0, 1.6, 0 Orientierung (w): 0.7071067811865476

// Wichtig · Fallstricke

  • Kompatibilität: Die WebXR Layers API ist experimentell und wird im Wesentlichen nur von Chromium-basierten XR-Browsern unterstützt, etwa dem Meta Quest Browser. Firefox und Safari unterstützen sie nicht. Das Feature 'layers' muss bei requestSession() angefordert werden. Außerdem ist ein sicherer Kontext (HTTPS) nötig.
  • Nicht direkt verändern: layer.transform.position.x = 2 hat keine Wirkung, weil XRRigidTransform und seine DOMPointReadOnly-Werte schreibgeschützt sind. Weise immer ein neues XRRigidTransform zu.
  • Die Quaternion für orientation wird normalisiert. Ungültige Werte wie ein Nullvektor lösen einen Fehler aus.
  • Die Transformation gilt relativ zu layer.space. Wird der Referenzraum gewechselt, z. B. von 'local' auf 'local-floor', ändert sich die tatsächliche Position der Ebene.
  • Einen Skalierungsanteil gibt es nicht. Die Größe der Kugel wird über radius gesteuert, der sichtbare Ausschnitt über centralHorizontalAngle, upperVerticalAngle und lowerVerticalAngle.