Signatur
Beschreibung
Die Eigenschaft minimumFieldOfView der Schnittstelle VREyeParameters gibt das kleinste Sichtfeld zurück, das das VR-Headset für ein bestimmtes Auge (links oder rechts) unterstützt. Der Wert ist ein VRFieldOfView-Objekt mit den vier Winkeln upDegrees, rightDegrees, downDegrees und leftDegrees, jeweils in Grad, gemessen von der Blickmitte aus.
Sie gehörte zu einem frühen Entwurf der WebVR-API. Dort hatte VREyeParameters mehrere Sichtfeld-Werte: minimumFieldOfView, maximumFieldOfView, recommendedFieldOfView und currentFieldOfView. Damit ließ sich prüfen, in welchem Bereich man über HMDVRDevice.setFieldOfView() ein eigenes Sichtfeld einstellen durfte, zum Beispiel um mit einem kleineren Sichtfeld die Renderlast zu senken.
Ab WebVR 1.0 fiel die Eigenschaft weg. Übrig blieb nur noch VREyeParameters.fieldOfView, das inzwischen ebenfalls veraltet ist. Neue Projekte sollten die WebXR Device API verwenden. Dort ist das Sichtfeld in der Projektionsmatrix jeder XRView enthalten (XRView.projectionMatrix).
Rückgabewert
upDegrees, rightDegrees, downDegrees und leftDegrees (jeweils number in Grad). Sie beschreiben das kleinste Sichtfeld, das für das Auge unterstützt wird.Beispiele
Minimales Sichtfeld beider Augen auslesen (alte WebVR-API)
// Nur in sehr alten Firefox-Versionen mit aktiviertem WebVR-Flag lauffähig
const logMinFov = async () => {
if (!navigator.getVRDevices) {
console.log('Alte WebVR-API nicht verfügbar');
return;
}
const devices = await navigator.getVRDevices();
const hmd = devices.find((d) => d instanceof HMDVRDevice);
if (!hmd) return console.log('Kein Headset gefunden');
for (const eye of ['left', 'right']) {
const { upDegrees, rightDegrees, downDegrees, leftDegrees } =
hmd.getEyeParameters(eye).minimumFieldOfView;
console.log(`${eye}: oben ${upDegrees}°, rechts ${rightDegrees}°, unten ${downDegrees}°, links ${leftDegrees}°`);
}
};
logMinFov();
Wunsch-Sichtfeld auf den unterstützten Bereich begrenzen
// Hält einen Winkel im Bereich [minimum, maximum]
const clampFov = (wanted, min, max) => {
const clamp = (v, lo, hi) => Math.min(Math.max(v, lo), hi);
return {
upDegrees: clamp(wanted.upDegrees, min.upDegrees, max.upDegrees),
rightDegrees: clamp(wanted.rightDegrees, min.rightDegrees, max.rightDegrees),
downDegrees: clamp(wanted.downDegrees, min.downDegrees, max.downDegrees),
leftDegrees: clamp(wanted.leftDegrees, min.leftDegrees, max.leftDegrees)
};
};
// Beispielwerte, so wie sie die alte API liefern würde
const params = {
minimumFieldOfView: { upDegrees: 10, rightDegrees: 10, downDegrees: 10, leftDegrees: 10 },
maximumFieldOfView: { upDegrees: 55, rightDegrees: 50, downDegrees: 55, leftDegrees: 50 }
};
const fov = clampFov(
{ upDegrees: 5, rightDegrees: 45, downDegrees: 70, leftDegrees: 45 },
params.minimumFieldOfView,
params.maximumFieldOfView
);
console.log(fov);
Moderne Alternative: Sichtfeld aus WebXR ableiten
// Vertikales Sichtfeld aus der Projektionsmatrix einer XRView berechnen
const startXR = async () => {
if (!navigator.xr || !(await navigator.xr.isSessionSupported('immersive-vr'))) {
console.log('WebXR (immersive-vr) nicht unterstützt');
return;
}
const session = await navigator.xr.requestSession('immersive-vr');
const refSpace = await session.requestReferenceSpace('local');
session.requestAnimationFrame((time, frame) => {
const pose = frame.getViewerPose(refSpace);
if (!pose) return;
for (const view of pose.views) {
const m = view.projectionMatrix;
const fovY = 2 * Math.atan(1 / m[5]) * (180 / Math.PI);
console.log(`${view.eye}: vertikales Sichtfeld ≈ ${fovY.toFixed(1)}°`);
}
});
};
// Muss durch eine Nutzeraktion ausgelöst werden
document.querySelector('#enter-vr')?.addEventListener('click', startXR);
// Wichtig · Fallstricke
- Veraltet und nicht standardisiert:
minimumFieldOfViewgab es nur in einem frühen WebVR-Entwurf, und nur Firefox hat es kurzzeitig hinter einem Flag umgesetzt. In keinem aktuellen Browser ist die Eigenschaft vorhanden. Der Zugriff liefert dortundefined, oder es gibt schonVREyeParametersselbst nicht. - In WebVR 1.0/1.1 kam stattdessen
VREyeParameters.fieldOfView. Auch diese Eigenschaft ist veraltet. Chrome und Firefox haben WebVR vollständig entfernt. - Für neuen Code die WebXR Device API verwenden. Das Sichtfeld steckt dort in
XRView.projectionMatrixund lässt sich nicht direkt festlegen. - Die Winkel beziehen sich jeweils auf die Blickmitte. Das Sichtfeld kann asymmetrisch sein, also zum Beispiel links und rechts verschiedene Werte haben. Man sollte also nicht vereinfacht einen einzigen Winkel annehmen.
- Vor dem Zugriff immer prüfen, ob die API vorhanden ist (
'getVRDevices' in navigatorbzw.'xr' in navigator).