Signatur
Beschreibung
Die schreibgeschützte Eigenschaft position des VRPose-Interfaces gibt die Position des VRDisplay (z. B. eines VR-Headsets) zum Zeitpunkt der Pose-Abfrage als Float32Array mit drei Werten zurück: [x, y, z]. Die Werte sind in Metern angegeben und beziehen sich auf den Ursprung des Tracking-Raums, also meist auf die Position des Sensors bzw. die Stelle, an der die Kalibrierung erfolgt ist.
Das Koordinatensystem ist rechtshändig: positives x zeigt nach rechts, positives y nach oben und negatives z nach vorn (vom Nutzer weg). Mit diesen Werten wird typischerweise die Kamera einer 3D-Szene verschoben, damit Kopfbewegungen im Raum (Positional Tracking) nachgebildet werden.
Unterstützt das Gerät kein Positions-Tracking (etwa reine 3DoF-Brillen wie frühe Cardboard-Lösungen), ist der Wert null. Ob Positions-Tracking möglich ist, lässt sich vorab über VRDisplay.capabilities.hasPosition prüfen. Die aktuelle Pose erhält man in der Regel über VRFrameData.pose nach einem Aufruf von VRDisplay.getFrameData().
Rückgabewert
Float32Array mit drei Einträgen [x, y, z] in Metern relativ zum Tracking-Ursprung, oder null, wenn das Gerät keine Positionsdaten liefern kann.Beispiele
Position im Render-Loop auslesen
const frameData = new VRFrameData();
navigator.getVRDisplays().then((displays) => {
if (displays.length === 0) return;
const vrDisplay = displays[0];
const onFrame = () => {
vrDisplay.getFrameData(frameData);
const pos = frameData.pose.position;
if (pos) {
const [x, y, z] = pos;
console.log(`Kopf: x=${x.toFixed(2)} y=${y.toFixed(2)} z=${z.toFixed(2)}`);
}
vrDisplay.requestAnimationFrame(onFrame);
};
vrDisplay.requestAnimationFrame(onFrame);
});
Fallback für Geräte ohne Positions-Tracking
const getHeadPosition = (vrDisplay, frameData) => {
if (!vrDisplay.capabilities.hasPosition) {
// 3DoF-Gerät: feste Augenhöhe annehmen
return [0, 1.6, 0];
}
vrDisplay.getFrameData(frameData);
const pos = frameData.pose.position;
// Wert kann kurzzeitig null sein (Tracking verloren)
return pos ? Array.from(pos) : [0, 1.6, 0];
};
const [display] = await navigator.getVRDisplays();
console.log(getHeadPosition(display, new VRFrameData()));
Kamera einer three.js-Szene verschieben
// camera: THREE.PerspectiveCamera
const applyPose = (camera, pose) => {
if (pose.position) {
camera.position.fromArray(pose.position);
}
if (pose.orientation) {
camera.quaternion.fromArray(pose.orientation);
}
camera.updateMatrixWorld();
};
// Wichtig · Fallstricke
- Veraltet: Die gesamte WebVR-API (inkl.
VRPose) ist obsolet und wurde durch die WebXR Device API ersetzt. Dort entsprichtXRPose.transform.position(einDOMPointReadOnly) dieser Eigenschaft. Für neue Projekte ausschließlich WebXR verwenden. - Browser-Unterstützung: Nur in älteren Firefox-Versionen, Edge (EdgeHTML) und Chrome hinter Flag bzw. Origin-Trial verfügbar; in aktuellen Browsern entfernt. Immer per
'getVRDisplays' in navigatorprüfen. - null-Prüfung: Der Wert ist
nullbei 3DoF-Geräten und kann auch kurzfristignullwerden, wenn das Tracking verloren geht – vor dem Zugriff immer prüfen. - Das zurückgegebene
Float32Arraykann bei jedem Frame durch ein neues Objekt ersetzt werden; Referenzen nicht über Frames hinweg zwischenspeichern, sondern Werte kopieren (z. B.Array.from()). - Werte sind in Metern; für Szenen mit anderem Maßstab muss entsprechend skaliert werden.