Signatur
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();
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);
}
};
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"inrequiredFeaturesoderoptionalFeaturesliefert der Browser keine Observer-Ansichten. Der Wert ist dann bei allen Ansichtenfalse, 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)undview.projectionMatrixder jeweiligen Ansicht. - Datenschutz: Die Eigenschaft verrät nur, dass eine Aufnahme-Ansicht existiert. Sie gibt der Seite keinen Zugriff auf das Kamerabild.