Signatur
Beschreibung
Das Interface VRPose gehört zur veralteten WebVR API. Es liefert den Zustand eines VR-Sensors, meist des Head-Mounted Displays (HMD), zu einem bestimmten Zeitpunkt. Eine Instanz erzeugt man nie selbst. Man liest sie über VRFrameData.pose aus, nachdem VRDisplay.getFrameData() aufgerufen wurde. In früheren Versionen gab es dafür auch VRDisplay.getPose(), das inzwischen ebenfalls veraltet ist.
Alle Eigenschaften sind schreibgeschützt und liefern entweder ein Float32Array oder null, wenn der Sensor den Wert nicht bereitstellen kann:
position: Position als Vektor[x, y, z]in Metern, relativ zum Ursprung des Sitz- oder Stehraums.linearVelocity: lineare Geschwindigkeit in Metern pro Sekunde.linearAcceleration: lineare Beschleunigung in Metern pro Sekunde².orientation: Orientierung als Quaternion[x, y, z, w].angularVelocity: Winkelgeschwindigkeit in Radiant pro Sekunde.angularAcceleration: Winkelbeschleunigung in Radiant pro Sekunde².
Typischerweise wird die Pose in jedem Frame einer VRDisplay.requestAnimationFrame()-Schleife gelesen, um die Kamera einer 3D-Szene (z. B. WebGL) nachzuführen. Die Werte für Geschwindigkeit und Beschleunigung dienen vor allem dazu, Bewegungen vorherzusagen und so die Latenz auszugleichen.
Für neue Projekte sollte man VRPose nicht mehr verwenden. Der Nachfolger ist die WebXR Device API mit XRPose und XRViewerPose.
Rückgabewert
VRFrameData.pose. Jede Eigenschaft liefert ein Float32Array oder null.Beispiele
Pose pro Frame auslesen
// Nur in Browsern mit WebVR-Unterstützung (z. B. alter Firefox)
const startVR = async () => {
if (!navigator.getVRDisplays) {
console.log('WebVR wird nicht unterstützt');
return;
}
const [display] = await navigator.getVRDisplays();
if (!display) return;
const frameData = new VRFrameData();
const onFrame = () => {
display.getFrameData(frameData);
const { position, orientation } = frameData.pose;
if (position) {
console.log(`Position: ${Array.from(position).map(v => v.toFixed(2)).join(', ')}`);
}
if (orientation) {
console.log(`Orientierung: ${Array.from(orientation).map(v => v.toFixed(2)).join(', ')}`);
}
display.requestAnimationFrame(onFrame);
};
display.requestAnimationFrame(onFrame);
};
startVR();
Bewegung vorhersagen mit linearVelocity
// Einfache lineare Vorhersage der Kopfposition für dt Sekunden
const predictPosition = (pose, dt) => {
if (!pose.position) return null;
const p = Array.from(pose.position);
const v = pose.linearVelocity ? Array.from(pose.linearVelocity) : [0, 0, 0];
const a = pose.linearAcceleration ? Array.from(pose.linearAcceleration) : [0, 0, 0];
return p.map((pi, i) => pi + v[i] * dt + 0.5 * a[i] * dt * dt);
};
// Beispiel mit einem simulierten Pose-Objekt
const fakePose = {
position: new Float32Array([0, 1.6, 0]),
linearVelocity: new Float32Array([0.5, 0, 0]),
linearAcceleration: null
};
console.log(predictPosition(fakePose, 0.02));
Feature-Erkennung mit Fallback auf WebXR
const detectVR = async () => {
if ('xr' in navigator && await navigator.xr.isSessionSupported('immersive-vr')) {
return 'WebXR (XRViewerPose statt VRPose verwenden)';
}
if ('getVRDisplays' in navigator) {
return 'WebVR (VRPose verfügbar, veraltet)';
}
return 'Keine VR-API verfügbar';
};
detectVR().then(console.log);
// Wichtig · Fallstricke
Veraltet: WebVR wurde nie standardisiert und ist aus Chrome, Edge und Firefox entfernt. Verwende stattdessen die WebXR Device API mit XRFrame.getViewerPose() und XRPose. Für ältere Inhalte gibt es das Polyfill webxr-polyfill.
- Jede Eigenschaft kann
nullsein. Bei Geräten, die nur die Orientierung erfassen (3DoF, z. B. einfache Handy-Halterungen), istpositionmeistnull. Prüfe den Wert deshalb vor jedem Zugriff. getFrameData()überschreibt dasselbeVRFrameData-Objekt in jedem Frame. Wenn du Werte über mehrere Frames aufheben willst, kopiere sie, z. B. mitArray.from(pose.position)odernew Float32Array(pose.position).- Die Orientierung ist ein Quaternion und keine Eulerwinkel. Wenn du Winkel brauchst, musst du selbst umrechnen, z. B. mit gl-matrix oder Three.js.
- Die Eigenschaft
timestampund die MethodeVRDisplay.getPose()gab es nur in frühen Entwürfen. Verlasse dich nicht darauf. - WebVR-Funktionen stehen nur in sicheren Kontexten (HTTPS) zur Verfügung und brauchen je nach Browser eine Nutzerinteraktion.