Signatur
Beschreibung
Die Methode getImmediatePose() der veralteten WebVR-Schnittstelle VRDisplay liefert die Pose des Headsets zum Zeitpunkt des Aufrufs, also die tatsächlich gemessenen Sensordaten, ohne dass der Browser sie auf den Zeitpunkt der nächsten Bildanzeige hochrechnet.
Im Unterschied zu VRDisplay.getPose(), das eine vorhergesagte Pose für das nächste Frame liefert und damit die Latenz ausgleicht, ist getImmediatePose() für Fälle gedacht, in denen Rohdaten wichtiger sind als flüssiges Rendering: etwa für Analyse, Protokollierung, Kalibrierung oder das Platzieren von Objekten an der tatsächlichen aktuellen Kopfposition.
Zum Rendern von Szenen sollte diese Methode nicht verwendet werden, weil die Darstellung ohne Vorhersage spürbar hinterherhinkt, was Übelkeit fördern kann. In späteren Entwürfen der WebVR-1.1-Spezifikation wurde die Methode bereits wieder entfernt und durch VRDisplay.getFrameData() ersetzt.
Rückgabewert
VRPose-Objekt mit position, orientation, linearVelocity, angularVelocity usw. (jeweils Float32Array oder null, falls das Gerät diese Werte nicht liefert).Beispiele
Aktuelle Kopfposition ohne Vorhersage auslesen
const logImmediatePose = 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-Gerät gefunden');
return;
}
const vrDisplay = displays[0];
const pose = vrDisplay.getImmediatePose();
// position/orientation können null sein (z. B. 3DoF-Headsets)
if (pose.position) {
const [x, y, z] = pose.position;
console.log(`Position: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`);
}
if (pose.orientation) {
console.log('Ausrichtung (Quaternion):', Array.from(pose.orientation));
}
};
logImmediatePose();
Vorhergesagte und tatsächliche Pose vergleichen
const comparePoses = (vrDisplay) => {
const predicted = vrDisplay.getPose();
const immediate = vrDisplay.getImmediatePose();
if (predicted.orientation && immediate.orientation) {
const diff = Array.from(predicted.orientation)
.map((v, i) => Math.abs(v - immediate.orientation[i]));
console.log('Abweichung pro Komponente:', diff.map((d) => d.toFixed(4)));
}
};
navigator.getVRDisplays?.().then(([display]) => {
if (display) comparePoses(display);
});
Moderne Alternative mit WebXR
// WebXR ersetzt WebVR vollständig
const startXR = async () => {
if (!(await navigator.xr?.isSessionSupported('immersive-vr'))) return;
const session = await navigator.xr.requestSession('immersive-vr');
const refSpace = await session.requestReferenceSpace('local');
session.requestAnimationFrame((time, frame) => {
const pose = frame.getViewerPose(refSpace);
if (pose) {
const { x, y, z } = pose.transform.position;
console.log('Viewer-Position:', x, y, z);
}
});
};
// Wichtig · Fallstricke
- Veraltet: Die gesamte WebVR-API ist obsolet und wurde aus Chrome, Firefox und Edge entfernt. Für neue Projekte ausschließlich die WebXR Device API verwenden (
XRFrame.getViewerPose()). getImmediatePose()war nur im ursprünglichen WebVR-1.0-Entwurf vorhanden und wurde schon in WebVR 1.1 zugunsten vongetFrameData()gestrichen – selbst ältere WebVR-Implementierungen kennen sie oft nicht. Vor dem Aufruf pertypeof vrDisplay.getImmediatePose === 'function'prüfen.- Nicht zum Rendern verwenden: Ohne Vorhersage entsteht sichtbare Latenz (Motion-to-Photon-Verzögerung), was Übelkeit auslösen kann.
- Die Felder von
VRPosekönnennullsein, wenn das Gerät z. B. keine Positionsverfolgung bietet (VRDisplayCapabilities.hasPosition). - WebVR erforderte in Browsern zeitweise einen sicheren Kontext (HTTPS) und teils Nutzerfreigaben.