Start · Sprachen · JavaScript · Referenz · VRFieldOfView.leftDegrees

VRFieldOfView.leftDegrees

Eigenschaft

Schreibgeschützte Eigenschaft, die angibt, um wie viele Grad sich das Sichtfeld eines Auges von der Blickmitte aus nach links erstreckt.

seit JavaScript WebVR 1.1 (veraltet, nicht standardisiert; ersetzt deprecated seit ja Kategorie: webapi

Signatur

VRFieldOfView.leftDegrees

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

Typ
number
Beschreibung
Winkel in Grad (nicht im Bogenmaß) zwischen Blickmitte und linker Grenze des Sichtfelds. Der Wert kann nur gelesen werden.

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();
left: leftDegrees = 50.0° right: leftDegrees = 42.5°

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));
0.941

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 VRFieldOfView sind 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 === rightDegrees gilt. 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.