Start · Sprachen · JavaScript · Referenz · VRFieldOfView.rightDegrees

VRFieldOfView.rightDegrees

Eigenschaft

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

seit JavaScript WebVR 1.1 (veraltet, nie standardisiert – ersetzt deprecated seit ja Kategorie: webapi

Signatur

VRFieldOfView.rightDegrees

Beschreibung

Die schreibgeschützte Eigenschaft rightDegrees des VRFieldOfView-Objekts liefert den Winkel in Grad, um den sich das Sichtfeld eines Auges von der Blickachse (Mitte) nach rechts erstreckt. Zusammen mit upDegrees, downDegrees und leftDegrees beschreibt sie das asymmetrische Sichtfeld (Frustum) eines Auges im Head-Mounted-Display.

Ein VRFieldOfView-Objekt bekommt man über die Eigenschaft fieldOfView eines VREyeParameters-Objekts, das VRDisplay.getEyeParameters('left') bzw. getEyeParameters('right') zurückgibt. Früher brauchte man die vier Winkel, um eine eigene Projektionsmatrix zu berechnen. Ab WebVR 1.1 liefert VRFrameData diese Matrizen aber schon fertig berechnet (leftProjectionMatrix, rightProjectionMatrix).

Die gesamte WebVR-API ist veraltet. Für neue Projekte ist die WebXR Device API gedacht: Dort stellt XRView.projectionMatrix die Projektionsdaten bereit, und ein Gegenstück zu VRFieldOfView gibt es nicht mehr.

Rückgabewert

Typ
number
Beschreibung
Ein Gleitkommawert (double) mit dem Winkel in Grad, um den sich das Sichtfeld von der Mitte nach rechts erstreckt. Beim linken Auge ist der Wert oft kleiner als beim rechten, weil das Sichtfeld zur Nase hin eingeschränkt ist.

Beispiele

Sichtfeld des rechten Auges auslesen

const showFov = async () => {
  if (!navigator.getVRDisplays) {
    console.log('WebVR wird nicht unterstützt.');
    return;
  }
  const [display] = await navigator.getVRDisplays();
  if (!display) {
    console.log('Kein VR-Gerät gefunden.');
    return;
  }
  const fov = display.getEyeParameters('right').fieldOfView;
  console.log(`Rechts: ${fov.rightDegrees}°`);
};

showFov();
Rechts: 50°

Horizontales Gesamt-Sichtfeld beider Augen berechnen

const horizontalFov = (display) => {
  const left = display.getEyeParameters('left').fieldOfView;
  const right = display.getEyeParameters('right').fieldOfView;
  return {
    linkesAuge: left.leftDegrees + left.rightDegrees,
    rechtesAuge: right.leftDegrees + right.rightDegrees
  };
};

navigator.getVRDisplays?.().then(([display]) => {
  if (display) console.table(horizontalFov(display));
});
{ linkesAuge: 95, rechtesAuge: 95 }

Projektionsmatrix aus den vier Winkeln berechnen (Legacy-Ansatz)

const fovToProjection = (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 Objekt, das wie ein VRFieldOfView aufgebaut ist
const m = fovToProjection({ upDegrees: 45, downDegrees: 45, leftDegrees: 45, rightDegrees: 45 });
console.log(m[0].toFixed(2));
1.00

// Wichtig · Fallstricke

  • Veraltet und nicht standardisiert: WebVR war nur zeitweise verfügbar, etwa in Firefox (bis Version 97 entfernt), in Chrome hinter einem Flag und im Samsung Internet. In aktuellen Browsern gibt es die API nicht mehr. Stattdessen WebXR verwenden (navigator.xr, XRView.projectionMatrix).
  • Die Eigenschaft ist schreibgeschützt. Wer ihr einen Wert zuweist, bekommt keine Wirkung (im Strict Mode einen TypeError).
  • Der Wert ist in Grad angegeben, nicht im Bogenmaß. Vor Math.tan() muss man ihn also umrechnen.
  • Das Sichtfeld ist meistens asymmetrisch. Man sollte deshalb nicht annehmen, dass leftDegrees === rightDegrees gilt.
  • Ab WebVR 1.1 sollte man die fertigen Projektionsmatrizen aus VRFrameData verwenden und keine eigenen aus den Winkeln berechnen.