Start · Sprachen · JavaScript · Referenz · VRFrameData.pose

VRFrameData.pose

Eigenschaft

Schreibgeschützte Eigenschaft, die die <code>VRPose</code> (Position, Ausrichtung, Geschwindigkeiten) des <code>VRDisplay</code> zum Zeitpunkt <code>VRFrameData.timestamp</code> liefert.

seit JavaScript WebVR 1.1 (veraltet, nie Baseline, durch WebXR ers deprecated seit ja Kategorie: webapi

Signatur

VRFrameData.pose

Beschreibung

Die Eigenschaft pose eines VRFrameData-Objekts enthält ein VRPose-Objekt. Es beschreibt den Zustand des Headsets zum Zeitpunkt VRFrameData.timestamp: Position (position), Ausrichtung als Quaternion (orientation) sowie lineare und Winkelgeschwindigkeit bzw. -beschleunigung.

Den Wert erhältst du nicht direkt. Zuerst legst du mit new VRFrameData() ein wiederverwendbares Objekt an. Dann rufst du in jedem Frame VRDisplay.getFrameData(frameData) auf. Dabei werden pose und die Matrizen (leftViewMatrix, rightProjectionMatrix usw.) mit aktuellen Werten gefüllt.

Üblicherweise brauchst du die Pose für eigene Spiellogik, etwa um einen Blickstrahl (Raycast) zu berechnen, Objekte an den Kopf zu heften oder Bewegungen zu erkennen. Zum Rendern sind die fertigen View- und Projektionsmatrizen aus VRFrameData meist bequemer.

Rückgabewert

Typ
VRPose
Beschreibung
Ein VRPose-Objekt mit position, orientation, linearVelocity, linearAcceleration, angularVelocity und angularAcceleration (jeweils Float32Array oder null).

Beispiele

Pose in der Render-Schleife auslesen

const frameData = new VRFrameData();

const start = async () => {
  const [vrDisplay] = await navigator.getVRDisplays();
  if (!vrDisplay) return console.warn('Kein VR-Gerät gefunden');

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

    const { position, orientation } = frameData.pose;
    console.log('Position:', position, 'Orientierung:', orientation);
  };
  vrDisplay.requestAnimationFrame(onFrame);
};

start();
Position: Float32Array(3) [0.01, 1.62, -0.05] Orientierung: Float32Array(4) [0, 0.12, 0, 0.99]

Null-Werte sicher behandeln (3DoF-Geräte)

const getHeadPosition = (frameData) => {
  const { position } = frameData.pose;
  // Geräte ohne Positions-Tracking liefern null
  return position ? Array.from(position) : [0, 1.6, 0];
};

const frameData = new VRFrameData();
console.log(getHeadPosition(frameData));
[0, 1.6, 0]

Blickrichtung aus dem Orientierungs-Quaternion berechnen

const forwardFromQuat = ([x, y, z, w]) => [
  -2 * (x * z + w * y),
  -2 * (y * z - w * x),
  -(1 - 2 * (x * x + y * y))
];

const logGaze = (vrDisplay, frameData) => {
  vrDisplay.getFrameData(frameData);
  const { orientation } = frameData.pose;
  if (orientation) {
    console.log('Blickrichtung:', forwardFromQuat(orientation));
  }
};
Blickrichtung: [0, 0, -1]

// Wichtig · Fallstricke

  • Veraltet: Die WebVR-API ist abgekündigt und wurde aus fast allen Browsern entfernt. Früher gab es sie im Firefox (Desktop) und in Chrome nur hinter einem Flag bzw. als Origin Trial. Für neue Projekte solltest du WebXR nutzen (XRFrame.getViewerPose()).
  • Das Objekt in pose kann zwischen Frames wiederverwendet werden. Wenn du Werte über mehrere Frames speichern willst, kopiere sie, z. B. mit Array.from(pose.position).
  • Die Werte sind erst gültig, nachdem getFrameData() aufgerufen wurde. Davor und bei fehlendem Tracking können die Eigenschaften null sein.
  • Positionen werden in Metern angegeben. Das Quaternion hat die Reihenfolge [x, y, z, w].
  • Die API steht nur in sicheren Kontexten (HTTPS) zur Verfügung.