Start · Sprachen · JavaScript · Referenz · VRPose.position

VRPose.position

Eigenschaft

Schreibgeschützte Eigenschaft, die die Position des <code>VRDisplay</code> zum aktuellen Zeitpunkt als 3D-Vektor (<code>Float32Array</code> mit x, y, z in Metern) liefert.

seit JavaScript Veraltet (WebVR 1.1) – durch WebXR ersetzt; nie Ba deprecated seit ja Kategorie: webapi

Signatur

VRPose.position

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

Typ
Float32Array | null
Beschreibung
Ein 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);
});
Kopf: x=0.03 y=1.62 z=-0.10

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()));
[0, 1.6, 0]

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 entspricht XRPose.transform.position (ein DOMPointReadOnly) 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 navigator prüfen.
  • null-Prüfung: Der Wert ist null bei 3DoF-Geräten und kann auch kurzfristig null werden, wenn das Tracking verloren geht – vor dem Zugriff immer prüfen.
  • Das zurückgegebene Float32Array kann 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.