Signatur
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 beiinline-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
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);
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)');
}
// Wichtig · Fallstricke
- Nicht nur zwei Werte: Neben
"left"und"right"gibt es"none". Code, der nur links und rechts abfragt, bricht beiinline-Sitzungen und Smartphone-AR. - Reihenfolge nicht garantiert: Ermittle das Auge nicht über den Index in
pose.views, sondern immer überview.eye. - Schreibgeschützt: Zuweisungen an
eyewerden ignoriert, im Strict Mode lösen sie einenTypeErroraus. - 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 mitnavigator.xr?.isSessionSupported(). XRView-Objekte gelten nur für den aktuellen Frame. Speichere sie nicht über mehrere Frames hinweg.