Signatur
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
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();
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, {}));
});
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));
};
// 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 === truegarantiert nicht, dass in jedem Frame Positionsdaten vorliegen –VRPose.positionkannnullsein.- Manche Browser liefern bei
falseeine 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).