Start · Sprachen · JavaScript · Referenz · VRDisplayCapabilities.hasPosition

VRDisplayCapabilities.hasPosition

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob ein VR-Display die Position des Nutzers im Raum verfolgen kann (6DoF statt nur Orientierung).

seit JavaScript WebVR 1.1 (veraltet, nicht standardisiert; durch W deprecated seit ja Kategorie: webapi

Signatur

VRDisplayCapabilities.hasPosition

Beschreibung

Die schreibgeschützte Eigenschaft hasPosition der Schnittstelle VRDisplayCapabilities liefert true, wenn das angeschlossene VR-Display Positionsdaten verfolgen und über VRPose.position zurückgeben kann. Ist sie false, liefert das Gerät nur Orientierungsdaten (3 Freiheitsgrade, z. B. einfache Smartphone-Halterungen wie Cardboard).

Man fragt die Eigenschaft typischerweise direkt nach dem Ermitteln der Displays über navigator.getVRDisplays() ab, um die Szene passend einzurichten: Bei Positions-Tracking kann sich der Nutzer physisch im Raum bewegen (Room-Scale), ohne Tracking sollte die Anwendung eine feste Kopfhöhe oder eine alternative Fortbewegung (Controller, Teleportation) anbieten.

Wichtig: Auch wenn hasPosition true ist, kann VRPose.position vorübergehend null sein – etwa wenn das Headset den Sichtbereich der Tracking-Sensoren verlässt. Robuster Code prüft daher beides.

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das Display Positions-Tracking unterstützt, sonst false.

Beispiele

Positions-Tracking beim Start prüfen

const initVR = async () => {
  if (!navigator.getVRDisplays) {
    console.log('WebVR wird nicht unterstützt');
    return;
  }
  const displays = await navigator.getVRDisplays();
  if (displays.length === 0) {
    console.log('Kein VR-Display gefunden');
    return;
  }
  const display = displays[0];
  const { hasPosition } = display.capabilities;
  console.log(`${display.displayName}: Positions-Tracking = ${hasPosition}`);
};

initVR();
Oculus Rift CV1: Positions-Tracking = true

Szene je nach Tracking-Fähigkeit konfigurieren

const STANDARD_KOPFHOEHE = 1.6; // Meter

const setupCamera = (display, camera) => {
  if (display.capabilities.hasPosition) {
    // Echte Kopfposition verwenden (Room-Scale)
    camera.useTrackedPosition = true;
  } else {
    // Nur Orientierung: feste Höhe simulieren
    camera.useTrackedPosition = false;
    camera.position = [0, STANDARD_KOPFHOEHE, 0];
  }
  return camera;
};

navigator.getVRDisplays().then(([display]) => {
  if (display) console.log(setupCamera(display, {}));
});
{ useTrackedPosition: false, position: [0, 1.6, 0] }

Pose sicher auslesen (Position kann null sein)

const frameData = new VRFrameData();

const renderLoop = (display) => {
  display.getFrameData(frameData);
  const { position } = frameData.pose;
  if (display.capabilities.hasPosition && position) {
    console.log('Kopfposition:', Array.from(position));
  } else {
    console.log('Keine Positionsdaten in diesem Frame');
  }
  display.requestAnimationFrame(() => renderLoop(display));
};
Kopfposition: [0.02, 1.58, -0.11]

// Wichtig · Fallstricke

Veraltet: Die WebVR-API war nie ein offizieller Standard und wurde aus allen gängigen Browsern entfernt bzw. war nur hinter Flags oder in speziellen Builds (Firefox, Chrome für Android/Daydream, Samsung Internet, Oculus Browser) verfügbar. Für neue Projekte die WebXR Device API verwenden – dort entspricht der Referenzraum-Typ ('local', 'local-floor', 'bounded-floor') bzw. XRPose.emulatedPosition in etwa dieser Information.

  • hasPosition === true garantiert nicht, dass in jedem Frame Positionsdaten vorliegen – VRPose.position kann null sein.
  • Manche Browser liefern bei false eine per Nackenmodell emulierte Position; diese nicht als echtes Tracking behandeln.
  • Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode ggf. TypeError).
  • WebVR erfordert in der Regel einen sicheren Kontext (HTTPS).