Signatur
Beschreibung
Die Eigenschaft leftDegrees des Interfaces VRFieldOfView gibt als Gleitkommazahl an, um wie viele Grad sich das Sichtfeld eines Auges von der optischen Mittelachse aus nach links erstreckt. Zusammen mit upDegrees, rightDegrees und downDegrees beschreibt sie den Sichtkegel, den ein VR-Headset für ein Auge darstellt.
Ein VRFieldOfView-Objekt bekommt man in der WebVR-API über VRDisplay.getEyeParameters("left" | "right").fieldOfView. Mit den vier Winkeln lässt sich eine asymmetrische Projektionsmatrix berechnen. Die Asymmetrie ist wichtig, weil bei den meisten Headsets das Sichtfeld zur Nase hin kleiner ist als nach außen. Deshalb unterscheidet sich leftDegrees in der Regel zwischen linkem und rechtem Auge.
In der Praxis spielt die Eigenschaft kaum noch eine Rolle: WebVR 1.1 wurde vollständig durch die WebXR Device API abgelöst. Dort liefert XRView.projectionMatrix die fertige Projektionsmatrix, und man muss sie nicht mehr selbst aus Winkeln berechnen.
Rückgabewert
Beispiele
Linken Sichtfeldwinkel beider Augen auslesen
const showFov = async () => {
if (!navigator.getVRDisplays) {
console.log('WebVR wird nicht unterstützt');
return;
}
const [display] = await navigator.getVRDisplays();
if (!display) return;
for (const eye of ['left', 'right']) {
const fov = display.getEyeParameters(eye).fieldOfView;
console.log(`${eye}: leftDegrees = ${fov.leftDegrees.toFixed(1)}°`);
}
};
showFov();
Asymmetrische Projektionsmatrix aus dem Sichtfeld berechnen
// Erzeugt eine 4x4-Matrix (spaltenweise, WebGL-kompatibel)
const projectionFromFov = (fov, near = 0.1, far = 1000) => {
const toRad = (d) => (d * 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
]);
};
// Test mit einem Beispielobjekt (gleiche Form wie VRFieldOfView)
const fov = { upDegrees: 45, downDegrees: 45, leftDegrees: 50, rightDegrees: 40 };
console.log(projectionFromFov(fov)[0].toFixed(3));
Moderne Alternative mit WebXR
// In WebXR gibt es kein leftDegrees mehr – die Matrix ist schon fertig
const onXRFrame = (time, frame) => {
const pose = frame.getViewerPose(refSpace);
if (pose) {
for (const view of pose.views) {
const m = view.projectionMatrix; // Float32Array(16)
// Horizontalen Sichtfeld-Gesamtwinkel aus der Matrix zurückrechnen
const hFov = 2 * Math.atan(1 / m[0]) * 180 / Math.PI;
console.log(view.eye, hFov.toFixed(1));
}
}
frame.session.requestAnimationFrame(onXRFrame);
};
// Wichtig · Fallstricke
- Veraltet: WebVR und damit
VRFieldOfViewsind nicht standardisiert und veraltet. Außer in älteren Firefox-Versionen und frühen Chromium-/Oculus-Browsern mit gesetzten Flags hat nie ein Browser sie dauerhaft ausgeliefert. Für neue Projekte ist die WebXR Device API zu verwenden. - Der Wert ist in Grad angegeben. Vor der Übergabe an
Math.tan()muss er ins Bogenmaß umgerechnet werden. Wird das vergessen, entsteht eine stark verzerrte Darstellung. - Man darf nicht davon ausgehen, dass
leftDegrees === rightDegreesgilt. Das Sichtfeld ist meist asymmetrisch und zwischen den Augen gespiegelt. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird stillschweigend ignoriert und wirft im Strict Mode einen
TypeError. - Die WebVR-API steht nur in sicheren Kontexten (HTTPS) zur Verfügung und kann per Permissions Policy gesperrt sein.