Signatur
Beschreibung
Die schreibgeschützte Eigenschaft fieldOfView des Interfaces VREyeParameters gibt ein VRFieldOfView-Objekt zurück. Es beschreibt das aktuelle Sichtfeld eines Auges als vier Winkel in Grad: upDegrees, rightDegrees, downDegrees und leftDegrees, jeweils von der Blickmitte aus gemessen.
Das Sichtfeld kann sich zur Laufzeit ändern, etwa wenn der Benutzer den Augenabstand (IPD) oder die Linsen am Headset verstellt. Deshalb sollte man den Wert nicht einmalig zwischenspeichern, sondern regelmäßig über VRDisplay.getEyeParameters() neu abfragen.
Genutzt wurde die Eigenschaft vor allem, um eine eigene, asymmetrische Projektionsmatrix pro Auge zu berechnen. Seit WebVR 1.1 liefert VRFrameData aber schon fertige Matrizen (leftProjectionMatrix, rightProjectionMatrix). Deshalb wurde fieldOfView bereits innerhalb von WebVR als veraltet markiert.
Die ganze WebVR-API ist inzwischen veraltet. Für neue Projekte ist die WebXR Device API der richtige Weg. Dort liefert XRView.projectionMatrix die Projektion direkt.
Rückgabewert
upDegrees, rightDegrees, downDegrees und leftDegrees (in Grad).Beispiele
Sichtfeld des linken Auges auslesen
const displays = await navigator.getVRDisplays();
if (displays.length > 0) {
const vrDisplay = displays[0];
const leftEye = vrDisplay.getEyeParameters('left');
const fov = leftEye.fieldOfView;
console.log(`Oben: ${fov.upDegrees}°, Rechts: ${fov.rightDegrees}°`);
console.log(`Unten: ${fov.downDegrees}°, Links: ${fov.leftDegrees}°`);
}
Projektionsmatrix aus dem Sichtfeld berechnen
// Asymmetrische Perspektivmatrix (spaltenweise, WebGL-kompatibel)
const fovToProjection = (fov, near = 0.1, far = 1000) => {
const toRad = (deg) => (deg * Math.PI) / 180;
const up = Math.tan(toRad(fov.upDegrees));
const down = Math.tan(toRad(fov.downDegrees));
const left = Math.tan(toRad(fov.leftDegrees));
const right = Math.tan(toRad(fov.rightDegrees));
const xScale = 2 / (left + right);
const yScale = 2 / (up + down);
return new Float32Array([
xScale, 0, 0, 0,
0, yScale, 0, 0,
-((left - right) * xScale * 0.5), (up - down) * yScale * 0.5, far / (near - far), -1,
0, 0, (far * near) / (near - far), 0
]);
};
const [vrDisplay] = await navigator.getVRDisplays();
const matrix = fovToProjection(vrDisplay.getEyeParameters('right').fieldOfView);
console.log(matrix.length);
Mit Feature-Erkennung auf WebXR ausweichen
const logFieldOfView = async () => {
if ('xr' in navigator) {
console.log('WebXR verfügbar – XRView.projectionMatrix verwenden.');
return;
}
if (!('getVRDisplays' in navigator)) {
console.log('Weder WebXR noch WebVR werden unterstützt.');
return;
}
const [display] = await navigator.getVRDisplays();
if (!display) return;
for (const eye of ['left', 'right']) {
const { fieldOfView: fov } = display.getEyeParameters(eye);
const horizontal = fov.leftDegrees + fov.rightDegrees;
console.log(`${eye}: horizontales Sichtfeld ${horizontal}°`);
}
};
logFieldOfView();
// Wichtig · Fallstricke
Veraltet: fieldOfView ist schon in WebVR 1.1 als veraltet markiert, und die ganze WebVR-API wurde durch WebXR ersetzt. Sie war nie in allen Browsern verfügbar, sondern nur in älteren Firefox-Versionen, Samsung Internet, Oculus Browser und in Chrome hinter einem Flag. Aktuelle Browser unterstützen sie nicht mehr.
- Der Wert kann sich während der Sitzung ändern, zum Beispiel wenn der Benutzer IPD oder Linsen verstellt. Deshalb pro Frame bzw. beim Ereignis
vrdisplaypresentchangeneu auslesen. - Die Winkel sind in Grad angegeben, nicht im Bogenmaß. Vor
Math.tan()also umrechnen. - Das Sichtfeld ist meist asymmetrisch:
leftDegreesundrightDegreesunterscheiden sich pro Auge. Eine symmetrische Perspektivmatrix führt daher zu Verzerrungen. - Für die Projektion lieber
VRFrameData.leftProjectionMatrix/rightProjectionMatrixverwenden, in WebXRXRView.projectionMatrix. - WebVR und WebXR funktionieren nur in sicheren Kontexten (HTTPS).