Start · Sprachen · JavaScript · Referenz · XRCubeLayer.orientation

XRCubeLayer.orientation

Eigenschaft

Liest oder setzt die Ausrichtung einer <code>XRCubeLayer</code> als Einheitsquaternion (<code>DOMPointReadOnly</code>) relativ zum Referenzraum in <code>space</code>.

seit JavaScript Experimentell: WebXR Layers API (u. a. Meta Quest Kategorie: webapi

Signatur

XRCubeLayer.orientation

Beschreibung

Die Eigenschaft orientation der Schnittstelle XRCubeLayer legt fest, wie die Würfel-Ebene gegenüber ihrem Koordinatensystem (XRCubeLayer.space) gedreht ist. Der Wert ist ein DOMPointReadOnly, der eine Einheitsquaternion enthält: x, y und z bilden den Vektoranteil, w den Skalaranteil.

Eine Cube-Layer wird meist für Skyboxen und Umgebungs-Panoramen genutzt. Sie wird immer so gezeichnet, als läge sie unendlich weit entfernt. Deshalb spielt nur die Rotation des Referenzraums eine Rolle, seine Position wird ignoriert. Mit orientation dreht man die Umgebung, ohne die Texturen neu zu rendern. So lässt sich etwa der Himmel nach Norden ausrichten oder langsam rotieren lassen.

Die Eigenschaft ist les- und schreibbar. Einen Startwert übergibt man schon beim Erzeugen über die Option orientation von XRWebGLBinding.createCubeLayer(). Später weist man einfach einen neuen DOMPointReadOnly zu. Die Änderung wirkt ab dem nächsten Frame, in dem die Ebene in session.updateRenderState({ layers }) eingetragen ist.

Parameter

Name Typ Default Beschreibung
$value Pflicht DOMPointReadOnly DOMPointReadOnly(0, 0, 0, 1) Beim Setzen: Einheitsquaternion {x, y, z, w}, die die neue Ausrichtung beschreibt.

Rückgabewert

Typ
DOMPointReadOnly
Beschreibung
Die aktuelle Ausrichtung als Einheitsquaternion. Standardmäßig (0, 0, 0, 1), also keine Drehung.

Beispiele

Cube-Layer mit Anfangsausrichtung erzeugen

const session = await navigator.xr.requestSession('immersive-vr', {
  requiredFeatures: ['layers']
});
const gl = document.createElement('canvas').getContext('webgl2', { xrCompatible: true });
const binding = new XRWebGLBinding(session, gl);
const refSpace = await session.requestReferenceSpace('local');

// 90° um die Y-Achse: (0, sin(45°), 0, cos(45°))
const halb = Math.PI / 4;
const skybox = binding.createCubeLayer({
  space: refSpace,
  viewPixelWidth: 1024,
  viewPixelHeight: 1024,
  layout: 'mono',
  orientation: new DOMPointReadOnly(0, Math.sin(halb), 0, Math.cos(halb))
});

session.updateRenderState({ layers: [skybox] });
const { x, y, z, w } = skybox.orientation;
console.log(x, y.toFixed(3), z, w.toFixed(3));
0 0.707 0 0.707

Skybox pro Frame langsam drehen

// Hilfsfunktion: Quaternion für eine Drehung um die Y-Achse
const yRotation = (winkel) =>
  new DOMPointReadOnly(0, Math.sin(winkel / 2), 0, Math.cos(winkel / 2));

const onFrame = (time, frame) => {
  // eine volle Umdrehung pro Minute
  const winkel = (time / 60000) * 2 * Math.PI;
  skybox.orientation = yRotation(winkel);
  frame.session.requestAnimationFrame(onFrame);
};
session.requestAnimationFrame(onFrame);

Ausrichtung zurücksetzen und Einheitslänge prüfen

skybox.orientation = new DOMPointReadOnly(0, 0, 0, 1);

const { x, y, z, w } = skybox.orientation;
const laenge = Math.hypot(x, y, z, w);
console.log(`Keine Drehung: ${w === 1}, Länge: ${laenge}`);
Keine Drehung: true, Länge: 1

// Wichtig · Fallstricke

  • Experimentell: Die WebXR Layers API wird kaum unterstützt, vor allem vom Meta Quest Browser und von Chromium mit aktiviertem Flag. Firefox und Safari unterstützen sie nicht. Das Feature 'layers' muss bei requestSession() angefordert werden. Prüfe vorher mit 'XRCubeLayer' in window, ob die Schnittstelle vorhanden ist.
  • Nur Einheitsquaternionen: Die Quaternion sollte die Länge 1 haben. Ob ein nicht normierter Wert beim Setzen normiert, abgelehnt oder unverändert verwendet wird, hängt vom Browser ab und ist nicht verlässlich. Normiere deshalb selbst.
  • Der Wert ist ein unveränderlicher DOMPointReadOnly. layer.orientation.y = 1 hat keine Wirkung. Weise immer ein neues Objekt zu.
  • Die Position von space wird ignoriert. Eine Cube-Layer verschiebt sich nie mit, sie dreht sich nur.
  • Eine Cube-Layer kann nur in einem 'immersive-vr'-Kontext genutzt werden. Als Layout sind nur 'mono' oder 'stereo' erlaubt.