Start · Sprachen · JavaScript · Referenz · XRQuadLayer.width

XRQuadLayer.width

Eigenschaft

Gibt die Breite eines <code>XRQuadLayer</code> in Metern an oder setzt sie. Damit wird die Größe der Ebene im 3D-Raum festgelegt.

seit JavaScript Experimentell (WebXR Layers API): Meta Quest Brows Kategorie: webapi

Signatur

XRQuadLayer.width

Beschreibung

Die Eigenschaft width eines XRQuadLayer legt fest, wie breit die rechteckige, flache Ebene in der virtuellen Szene erscheint. Die Angabe erfolgt in Metern im Koordinatensystem des Referenzraums, der beim Anlegen der Ebene über space übergeben wurde. Zusammen mit height bestimmt sie die physische Größe der Ebene. Die Pixelauflösung der Textur hängt davon nicht ab.

Quad-Ebenen eignen sich vor allem für Inhalte, die gestochen scharf aussehen müssen, etwa Text, Menüs, Videos oder 2D-Oberflächen in VR. Der Compositor zeichnet sie direkt und scharf, ohne dass sie zuerst in die Projektionsebene gerendert und neu abgetastet werden. Der Startwert kommt aus dem Feld width des XRQuadLayerInit-Objekts, das an XRWebGLBinding.createQuadLayer() übergeben wird. Fehlt die Angabe, gilt 1.0.

Die Eigenschaft ist les- und schreibbar. Ändert man sie während der Sitzung, wirkt sich das ab dem nächsten Frame aus. So lässt sich eine Ebene zum Beispiel animiert vergrößern, ohne sie neu anzulegen. Damit der Inhalt nicht verzerrt wird, sollte das Verhältnis width / height zum Verhältnis viewPixelWidth / viewPixelHeight der Textur passen.

Parameter

Name Typ Default Beschreibung
$value number 1.0 Nur beim Setzen: neue Breite der Ebene in Metern. Sollte eine positive, endliche Zahl sein.

Rückgabewert

Typ
number
Beschreibung
Die aktuelle Breite der Quad-Ebene in Metern, als Gleitkommazahl.

Beispiele

Quad-Ebene mit bestimmter Breite anlegen und auslesen

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

// 1,6 m breite Ebene im Seitenverhältnis 16:9
const quadLayer = binding.createQuadLayer({
  space: refSpace,
  viewPixelWidth: 1920,
  viewPixelHeight: 1080,
  width: 1.6,
  height: 0.9,
  transform: new XRRigidTransform({ x: 0, y: 1.5, z: -2 })
});

session.updateRenderState({ layers: [quadLayer] });
console.log(`Breite: ${quadLayer.width} m`);
Breite: 1.6 m

Breite animiert ändern und Seitenverhältnis beibehalten

const aspect = quadLayer.height / quadLayer.width;
const targetWidth = 2.4;

const onFrame = (time, frame) => {
  // Breite schrittweise an den Zielwert annähern
  const next = quadLayer.width + (targetWidth - quadLayer.width) * 0.1;
  quadLayer.width = next;
  quadLayer.height = next * aspect; // keine Verzerrung

  if (Math.abs(targetWidth - next) > 0.001) {
    frame.session.requestAnimationFrame(onFrame);
  }
};
session.requestAnimationFrame(onFrame);

Breite passend zur Texturauflösung berechnen

// Ebene mit 1 m Höhe; die Breite folgt aus dem Pixelformat
const pxW = 1280;
const pxH = 720;
const height = 1.0;

const menuLayer = binding.createQuadLayer({
  space: refSpace,
  viewPixelWidth: pxW,
  viewPixelHeight: pxH,
  height,
  width: height * (pxW / pxH)
});

console.log(menuLayer.width.toFixed(3));
1.778

// Wichtig · Fallstricke

  • Kompatibilität: Die WebXR Layers API ist experimentell. Zuverlässig unterstützt wird sie vor allem im Meta Quest Browser. In anderen Browsern fehlt sie oft oder ist nur über Flags aktivierbar. Beim Anfordern der Sitzung muss das Feature 'layers' angegeben werden, am besten als optionalFeatures mit einem Ausweichweg. Der WebXR-Layers-Polyfill von Immersive Web kann fehlende Unterstützung ausgleichen.
  • Meter statt Pixel: width ändert nur die Größe im Raum, nicht die Texturauflösung. Eine breitere Ebene mit gleicher viewPixelWidth wirkt deshalb unschärfer.
  • Verzerrung: Wenn width / height nicht zum Pixel-Seitenverhältnis passt, wird der Inhalt gestaucht oder gestreckt dargestellt.
  • Stereo: Bei layout: 'stereo-left-right' bezieht sich width auf die angezeigte Ebene, nicht auf die doppelt breite Textur.
  • Der Maßstab hängt von space und transform ab. Eine Skalierung ist über XRRigidTransform nicht möglich, deshalb ist width der richtige Weg, die Größe zu ändern.