Signatur
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
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);
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');
}
// 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
transposevonuniformMatrix4fvauffalsestehen. - 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.