Start · Sprachen · JavaScript · Referenz · VRFrameData.rightProjectionMatrix

VRFrameData.rightProjectionMatrix

Eigenschaft

Liefert ein schreibgeschütztes <code>Float32Array</code> mit 16 Werten: die 4×4-Projektionsmatrix, mit der das Bild für das rechte Auge gerendert wird.

seit JavaScript WebVR 1.1 (veraltet, nie Standard) – ersetzt durch deprecated seit ja Kategorie: webapi

Signatur

get VRFrameData.rightProjectionMatrix

Beschreibung

Die schreibgeschützte Eigenschaft rightProjectionMatrix der Schnittstelle VRFrameData gehört zur veralteten WebVR-API. Sie enthält ein Float32Array mit 16 Elementen. Diese Elemente bilden eine 4×4-Projektionsmatrix in spaltenweiser Anordnung (column-major), so wie WebGL sie erwartet. Die Matrix beschreibt Sichtfeld, Seitenverhältnis sowie Near- und Far-Clipping-Ebene für das rechte Auge des Headsets.

Die Werte werden jedes Mal aktualisiert, wenn man VRDisplay.getFrameData() mit dem VRFrameData-Objekt aufruft. Üblicherweise geschieht das einmal pro Frame innerhalb von VRDisplay.requestAnimationFrame(). Danach übergibt man die Matrix per gl.uniformMatrix4fv() an den Vertex-Shader. Das Gegenstück für das andere Auge ist leftProjectionMatrix. Zusammen mit rightViewMatrix (Kameraposition und -ausrichtung) entsteht daraus die vollständige Transformation für das rechte Auge.

Die Clipping-Ebenen stellt man über VRDisplay.depthNear und VRDisplay.depthFar ein. Diese Werte fließen beim nächsten Aufruf von getFrameData() in die Matrix ein.

Rückgabewert

Typ
Float32Array
Beschreibung
Ein Float32Array mit 16 Werten: die 4×4-Projektionsmatrix des rechten Auges in spaltenweiser Anordnung (column-major).

Beispiele

Stereo-Rendering: rechte Bildhälfte zeichnen

const frameData = new VRFrameData();

const renderFrame = () => {
  vrDisplay.requestAnimationFrame(renderFrame);
  vrDisplay.getFrameData(frameData);

  const w = canvas.width / 2;
  const h = canvas.height;

  // Linkes Auge
  gl.viewport(0, 0, w, h);
  gl.uniformMatrix4fv(projLoc, false, frameData.leftProjectionMatrix);
  gl.uniformMatrix4fv(viewLoc, false, frameData.leftViewMatrix);
  drawScene();

  // Rechtes Auge
  gl.viewport(w, 0, w, h);
  gl.uniformMatrix4fv(projLoc, false, frameData.rightProjectionMatrix);
  gl.uniformMatrix4fv(viewLoc, false, frameData.rightViewMatrix);
  drawScene();

  vrDisplay.submitFrame();
};

vrDisplay.requestAnimationFrame(renderFrame);

Matrix inspizieren und Clipping-Ebenen setzen

const [vrDisplay] = await navigator.getVRDisplays();
vrDisplay.depthNear = 0.1;
vrDisplay.depthFar = 1000;

const frameData = new VRFrameData();
vrDisplay.getFrameData(frameData);

const m = frameData.rightProjectionMatrix;
console.log(m.length);
console.log(m instanceof Float32Array);
16 true

Feature-Erkennung mit WebXR-Fallback

if ('xr' in navigator) {
  console.log('WebXR verwenden – projectionMatrix pro XRView');
} else if ('getVRDisplays' in navigator && 'VRFrameData' in window) {
  const frameData = new VRFrameData();
  console.log('WebVR verfügbar:', frameData.rightProjectionMatrix.length);
} else {
  console.log('Keine VR-Unterstützung');
}
WebXR verwenden – projectionMatrix pro XRView

// Wichtig · Fallstricke

Veraltet: WebVR wurde nie standardisiert und ist aus allen aktuellen Browsern entfernt. Früher lief es in Firefox und im Chrome für Android hinter einem Flag, außerdem im Samsung Internet und im Oculus Browser. Für neue Projekte nimmt man die WebXR Device API. Dort liefert jedes XRView eine eigene projectionMatrix.

  • Die Matrix ist erst nach einem Aufruf von vrDisplay.getFrameData(frameData) gültig. Vorher enthält sie Nullen oder Standardwerte.
  • Die Werte sind spaltenweise angeordnet. Deshalb muss der Parameter transpose von uniformMatrix4fv auf false stehen.
  • Das zurückgegebene Array kann beim nächsten Frame überschrieben werden. Wer Werte aufheben will, kopiert sie mit new Float32Array(frameData.rightProjectionMatrix).
  • Die Matrix ist bei Headsets oft asymmetrisch (Off-Axis-Projektion). Man sollte sie daher nicht durch eine selbst berechnete symmetrische Perspektivmatrix ersetzen.
  • WebVR setzt einen sicheren Kontext (HTTPS) voraus.