Start · Sprachen · JavaScript · Referenz · XRView.eye

XRView.eye

Eigenschaft

Schreibgeschützter String, der angibt, für welches Auge ein <code>XRView</code> gerendert wird: <code>"left"</code>, <code>"right"</code> oder <code>"none"</code>.

seit JavaScript WebXR Device API – experimentell, v. a. Chromium-b Kategorie: webapi

Signatur

XRView.eye

Beschreibung

Die schreibgeschützte Eigenschaft eye des Interfaces XRView gibt einen Wert des Aufzählungstyps XREye zurück. Er zeigt an, welchem Auge die Ansicht zugeordnet ist. Diese Ansicht erhältst du pro Frame über XRViewerPose.views.

  • "left": Die Ansicht ist für das linke Auge.
  • "right": Die Ansicht ist für das rechte Auge.
  • "none": Die Ansicht gehört zu keinem bestimmten Auge. Das ist bei monoskopischen Ausgaben der Fall, etwa bei inline-Sitzungen oder Handheld-AR auf Smartphones.

Meist brauchst du die Eigenschaft gar nicht, denn Viewport (XRWebGLLayer.getViewport(view)), Projektionsmatrix und Transformation hängen bereits am jeweiligen XRView. Nützlich wird eye, wenn du Inhalte gezielt nur für ein Auge darstellen willst: stereoskopische Fotos und Videos (links und rechts getrennt aufgenommen), Debug-Hilfen oder augenabhängige Nachbearbeitung.

Verlass dich nicht darauf, dass views genau zwei Einträge in der Reihenfolge links → rechts enthält. Manche Geräte liefern eine einzige Ansicht mit "none", andere zusätzliche Ansichten (z. B. über die Erweiterung secondary-views). Prüf deshalb immer den Wert von eye, statt dich auf den Index zu stützen.

Rückgabewert

Typ
"left" | "right" | "none" (XREye)
Beschreibung
Ein String aus dem Aufzählungstyp XREye. Er gibt das Auge an, für das die Ansicht gerendert wird, oder "none" bei monoskopischer Ausgabe.

Beispiele

Ansichten im Render-Loop protokollieren

// Voraussetzung: laufende XRSession und Referenzraum
const onXRFrame = (time, frame) => {
  const session = frame.session;
  session.requestAnimationFrame(onXRFrame);

  const pose = frame.getViewerPose(refSpace);
  if (!pose) return;

  for (const view of pose.views) {
    const viewport = session.renderState.baseLayer.getViewport(view);
    console.log(`Auge: ${view.eye}, Viewport: ${viewport.x},${viewport.y} ${viewport.width}x${viewport.height}`);
  }
};

session.requestAnimationFrame(onXRFrame);
Auge: left, Viewport: 0,0 1440x1600 Auge: right, Viewport: 1440,0 1440x1600

Stereoskopisches Foto: passende Bildhälfte pro Auge

// Ein Side-by-Side-Bild enthält links das Bild fürs linke, rechts das fürs rechte Auge.
// Liefert die UV-Verschiebung und -Skalierung für den Shader.
const getStereoUV = (view) => {
  switch (view.eye) {
    case 'left':
      return { offsetX: 0.0, scaleX: 0.5 };
    case 'right':
      return { offsetX: 0.5, scaleX: 0.5 };
    default: // 'none' – monoskopisch: linke Hälfte als Ersatz
      return { offsetX: 0.0, scaleX: 0.5 };
  }
};

for (const view of pose.views) {
  const { offsetX, scaleX } = getStereoUV(view);
  gl.uniform2f(uvTransformLocation, offsetX, scaleX);
  drawPhotoSphere(view);
}

Prüfen, ob Stereo-Ausgabe vorliegt

const isStereo = (pose) =>
  pose.views.some((view) => view.eye === 'left') &&
  pose.views.some((view) => view.eye === 'right');

const pose = frame.getViewerPose(refSpace);
if (pose) {
  console.log(isStereo(pose) ? 'Stereo-Headset erkannt' : 'Monoskopische Ausgabe (z. B. Smartphone-AR)');
}
Stereo-Headset erkannt

// Wichtig · Fallstricke

  • Nicht nur zwei Werte: Neben "left" und "right" gibt es "none". Code, der nur links und rechts abfragt, bricht bei inline-Sitzungen und Smartphone-AR.
  • Reihenfolge nicht garantiert: Ermittle das Auge nicht über den Index in pose.views, sondern immer über view.eye.
  • Schreibgeschützt: Zuweisungen an eye werden ignoriert, im Strict Mode lösen sie einen TypeError aus.
  • Kompatibilität: WebXR ist experimentell. Unterstützt wird es vor allem in Chromium-basierten Browsern und im Meta Quest Browser, Firefox und Safari unterstützen es auf dem Desktop nicht. Die API ist nur in sicheren Kontexten (HTTPS) verfügbar und kann per Permissions-Policy (xr-spatial-tracking) gesperrt sein. Prüf vorab mit navigator.xr?.isSessionSupported().
  • XRView-Objekte gelten nur für den aktuellen Frame. Speichere sie nicht über mehrere Frames hinweg.