Start · Sprachen · JavaScript · Referenz · XRView.isFirstPersonObserver

XRView.isFirstPersonObserver

Eigenschaft

Schreibgeschützter boolescher Wert, der angibt, ob ein <code>XRView</code> eine First-Person-Observer-Ansicht ist, etwa für Videoaufnahmen aus Sicht einer am Gerät angebrachten Kamera.

seit JavaScript Experimentell: WebXR First Person Observer Views ( Kategorie: webapi

Signatur

XRView.isFirstPersonObserver

Beschreibung

Die Eigenschaft isFirstPersonObserver des Interfaces XRView ist schreibgeschützt. Sie ist true, wenn die Ansicht eine First-Person-Observer-Ansicht ist. Gemeint ist eine zusätzliche, sekundäre Ansicht, die ungefähr aus Sicht des Nutzers aufgenommen wird, meist von einer Kamera am Headset. Ein typischer Fall ist die Mixed-Reality-Aufnahme, bei der virtuelle Inhalte über das Kamerabild gelegt werden, zum Beispiel für Screenshots, Videos oder Streaming. Bei den normalen Augen-Ansichten (eye ist "left" oder "right") ist der Wert false.

Solche Ansichten erscheinen nur in XRViewerPose.views, wenn die Sitzung mit dem Feature "secondary-views" angefordert wurde und das Gerät diese Ansicht gerade bereitstellt. Die Liste der Ansichten kann sich deshalb von Frame zu Frame ändern. Eine Anwendung sollte in jedem Frame über pose.views iterieren und darf nicht von genau zwei Ansichten ausgehen.

Mit der Eigenschaft kannst du die Darstellung für den Beobachter gezielt anpassen. Du kannst zum Beispiel Elemente ausblenden, die nur für den Träger gedacht sind (Debug-Overlays, Blickcursor, Hinweise direkt vor dem Gesicht). Oder du lässt in der Aufnahme teure Effekte weg, um Leistung zu sparen.

Beispiele

Sitzung mit sekundären Ansichten anfordern

const startXR = async () => {
  if (!navigator.xr) {
    console.log('WebXR nicht verfügbar');
    return;
  }
  // 'secondary-views' ist nötig, damit Observer-Ansichten geliefert werden
  const session = await navigator.xr.requestSession('immersive-ar', {
    optionalFeatures: ['secondary-views']
  });
  console.log('Sitzung gestartet:', session.enabledFeatures ?? 'unbekannt');
  return session;
};

startXR();
Sitzung gestartet: ["viewer", "local", "secondary-views"]

Alle Ansichten im Render-Loop zeichnen und Observer erkennen

const onXRFrame = (time, frame) => {
  const session = frame.session;
  session.requestAnimationFrame(onXRFrame);

  const pose = frame.getViewerPose(refSpace);
  if (!pose) return;

  const layer = session.renderState.baseLayer;
  gl.bindFramebuffer(gl.FRAMEBUFFER, layer.framebuffer);

  // Nicht von genau zwei Ansichten ausgehen!
  for (const view of pose.views) {
    const vp = layer.getViewport(view);
    gl.viewport(vp.x, vp.y, vp.width, vp.height);

    if (view.isFirstPersonObserver) {
      console.log('Observer-Ansicht:', vp.width, 'x', vp.height);
    }
    drawScene(view.projectionMatrix, view.transform.inverse.matrix);
  }
};
Observer-Ansicht: 1280 x 720

Debug-Overlay in der Aufnahme ausblenden

const renderView = (view) => {
  drawWorld(view);

  // Blickcursor und Debug-Infos nur für den Träger anzeigen,
  // nicht im aufgenommenen Video
  if (!view.isFirstPersonObserver) {
    drawGazeCursor(view);
    drawDebugHud(view);
  }
};

// Wichtig · Fallstricke

  • Experimentell: Die Eigenschaft gehört zum Modul WebXR First Person Observer Views. Nur wenige Browser und Geräte unterstützen sie, etwa Chromium-basierte Browser auf Mixed-Reality-Headsets. Prüfe die Unterstützung vorher, zum Beispiel mit 'isFirstPersonObserver' in XRView.prototype.
  • Ohne das Feature "secondary-views" in requiredFeatures oder optionalFeatures liefert der Browser keine Observer-Ansichten. Der Wert ist dann bei allen Ansichten false, oder die Eigenschaft fehlt ganz.
  • Die Anzahl der Ansichten kann sich während einer Sitzung ändern, zum Beispiel wenn eine Aufnahme startet oder stoppt. Lege Puffer, Framebuffer oder Matrizen daher nicht fest für zwei Ansichten an.
  • Observer-Ansichten haben oft eine andere Auflösung, ein anderes Seitenverhältnis und eine andere Projektion als die Augen-Ansichten. Verwende immer layer.getViewport(view) und view.projectionMatrix der jeweiligen Ansicht.
  • Datenschutz: Die Eigenschaft verrät nur, dass eine Aufnahme-Ansicht existiert. Sie gibt der Seite keinen Zugriff auf das Kamerabild.