Start · Sprachen · JavaScript · Referenz · VRFieldOfView.upDegrees

VRFieldOfView.upDegrees

Eigenschaft

Schreibgeschützte Eigenschaft: gibt an, um wie viel Grad sich das Sichtfeld eines Auges ausgehend von der Blickachse nach oben erstreckt.

seit JavaScript WebVR 1.1 (veraltet, nicht standardisiert – durch deprecated seit ja Kategorie: webapi

Signatur

VRFieldOfView.upDegrees

Beschreibung

Die schreibgeschützte Eigenschaft upDegrees eines VRFieldOfView-Objekts gibt als Gleitkommazahl an, um wie viel Grad sich das Sichtfeld von der zentralen Blickachse aus nach oben erstreckt. Zusammen mit downDegrees, leftDegrees und rightDegrees ergibt sich daraus ein (oft asymmetrischer) Sichtkegel für ein einzelnes Auge.

Ein VRFieldOfView-Objekt erhält man in der alten WebVR-API über VRDisplay.getEyeParameters("left" | "right").fieldOfView. Die vier Winkel verwendet man, um für jedes Auge eine passende Projektionsmatrix zu berechnen – etwa wenn man keine Bibliothek einsetzt und VRFrameData.leftProjectionMatrix nicht verwenden möchte.

Da Headsets meist asymmetrische Linsen haben, sind upDegrees und downDegrees häufig nicht gleich groß. Das vertikale Gesamtsichtfeld ist die Summe upDegrees + downDegrees.

Rückgabewert

Typ
number
Beschreibung
Winkel in Grad (nicht Bogenmaß), um den sich das Sichtfeld von der Blickachse nach oben erstreckt, z. B. 45.

Beispiele

Oberen Sichtfeldwinkel des linken Auges auslesen

const displays = await navigator.getVRDisplays();
if (displays.length > 0) {
  const vrDisplay = displays[0];
  const { fieldOfView } = vrDisplay.getEyeParameters('left');
  console.log(`Sichtfeld nach oben: ${fieldOfView.upDegrees}°`);
}
Sichtfeld nach oben: 45°

Vertikales Gesamtsichtfeld berechnen

const verticalFov = (fov) => fov.upDegrees + fov.downDegrees;

const [vrDisplay] = await navigator.getVRDisplays();
const left = vrDisplay.getEyeParameters('left').fieldOfView;
console.log(`Vertikal: ${verticalFov(left).toFixed(1)}°`);
Vertikal: 90.0°

Asymmetrische Projektionsmatrix aus dem Sichtfeld erzeugen

const toRad = (deg) => (deg * Math.PI) / 180;

const projectionFromFov = (fov, near = 0.1, far = 1000) => {
  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);
  // Spaltenweise (WebGL-Konvention)
  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
  ]);
};

// Auch ohne Headset testbar mit einem Beispielobjekt:
const fov = { upDegrees: 45, downDegrees: 45, leftDegrees: 45, rightDegrees: 45 };
console.log(projectionFromFov(fov)[5]);
1

// Wichtig · Fallstricke

Veraltet: Die gesamte WebVR-API (inkl. VRFieldOfView) ist nie standardisiert worden und wurde durch die WebXR Device API ersetzt. Aktuelle Browser unterstützen sie praktisch nicht mehr; sie war nur in älteren Firefox-Versionen, Edge (Legacy) und Chrome hinter Flags verfügbar. Für neue Projekte XRView.projectionMatrix verwenden.

  • Der Wert ist in Grad angegeben – vor Math.tan() ins Bogenmaß umrechnen.
  • Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im strikten Modus ggf. TypeError).
  • Nicht davon ausgehen, dass upDegrees === downDegrees gilt – Sichtfelder sind häufig asymmetrisch.
  • Immer per Feature-Erkennung prüfen: if ('getVRDisplays' in navigator).