Signatur
Beschreibung
Das Interface PositionSensorVRDevice gehörte zur ursprünglichen, vor Version 1.0 entwickelten WebVR API. Es steht für den Positionssensor einer VR-Hardware, meist des Head-Mounted Displays (HMD). Darüber konnte eine Webanwendung abfragen, wo sich der Kopf des Nutzers im Raum befindet und in welche Richtung er schaut. Mit diesen Daten wurde anschließend die virtuelle Kamera einer WebGL-Szene ausgerichtet.
Instanzen wurden nicht selbst erzeugt, sondern über navigator.getVRDevices() abgerufen. Diese Methode liefert ein Promise mit einem Array aller erkannten VRDevice-Objekte. Die Positionssensoren filterte man dann mit instanceof PositionSensorVRDevice heraus. Von VRDevice erbt das Interface die Eigenschaften hardwareUnitId, deviceId und deviceName. Über hardwareUnitId ließ sich ein Sensor dem zugehörigen HMDVRDevice zuordnen.
Diese Methoden gibt es:
getState(): Gibt einVRPositionState-Objekt mit dem Sensorzustand zurück, den der Browser für den nächsten darzustellenden Frame vorausberechnet. Das ist der empfohlene Weg für das Rendering.getImmediateState(): Gibt den aktuellen Zustand ohne Vorhersage zurück, zum Beispiel für Logik, die nichts mit dem Rendering zu tun hat.resetSensor(): Legt die aktuelle Position und Ausrichtung als neuen Nullpunkt fest und kalibriert den Sensor damit neu.
Das Objekt VRPositionState enthält timeStamp, hasPosition, position, linearVelocity, linearAcceleration, hasOrientation, orientation (ein Quaternion als DOMPoint), angularVelocity und angularAcceleration. Wichtig: In neuem Code sollte dieses Interface nicht mehr verwendet werden. Nachfolger war zunächst VRDisplay aus WebVR 1.1, heute ist es die WebXR Device API.
Rückgabewert
navigator.getVRDevices() erfüllt wird.Beispiele
Positionssensor ermitteln (mit Funktionsprüfung)
const findPositionSensor = async () => {
// Prüfen, ob die alte WebVR API überhaupt vorhanden ist
if (!('getVRDevices' in navigator) || typeof PositionSensorVRDevice === 'undefined') {
console.log('Alte WebVR API nicht verfügbar – bitte WebXR verwenden.');
return null;
}
const devices = await navigator.getVRDevices();
const sensor = devices.find((d) => d instanceof PositionSensorVRDevice);
if (sensor) {
console.log(`Sensor gefunden: ${sensor.deviceName} (${sensor.hardwareUnitId})`);
}
return sensor ?? null;
};
findPositionSensor();
Kamera pro Frame mit getState() aktualisieren
const startTracking = (sensor, camera) => {
const loop = () => {
const state = sensor.getState();
if (state.hasOrientation && state.orientation) {
const { x, y, z, w } = state.orientation; // Quaternion
camera.quaternion = [x, y, z, w];
}
if (state.hasPosition && state.position) {
const { x, y, z } = state.position;
camera.position = [x, y, z];
}
requestAnimationFrame(loop);
};
requestAnimationFrame(loop);
};
// Aufruf, z. B. nach findPositionSensor():
// const camera = { position: [0, 0, 0], quaternion: [0, 0, 0, 1] };
// startTracking(sensor, camera);
Sensor per Tastendruck neu kalibrieren und Sofortzustand loggen
const bindResetKey = (sensor) => {
window.addEventListener('keydown', (event) => {
if (event.key === 'r') {
sensor.resetSensor(); // aktuelle Pose wird neuer Nullpunkt
const now = sensor.getImmediateState();
console.log('Zurückgesetzt, Zeitstempel:', now.timeStamp);
}
});
};
// Wichtig · Fallstricke
Veraltet und entfernt: PositionSensorVRDevice gab es nur in experimentellen Builds, etwa in Firefox Nightly und in speziellen Chromium-Builds von 2014/2015. In keinem aktuellen Browser ist das Interface vorhanden. Schon WebVR 1.1 ersetzte es durch VRDisplay.getPose() bzw. getFrameData(), und heute ist XRSession / XRFrame.getViewerPose() aus der WebXR Device API der Standard.
- Prüfe immer vorher, ob die API vorhanden ist (
'getVRDevices' in navigator). Ohne diese Prüfung bricht das Skript mit einemReferenceErrorab. hasPositionist bei Geräten ohne Positionstracking (z. B. frühe Oculus-DK1- oder Cardboard-Setups)false. In diesem Fall istpositionnull.- Für das Rendering
getState()verwenden, nichtgetImmediateState(). NurgetState()enthält die Vorhersage für den nächsten Frame, und ohne sie wirkt die Darstellung verzögert. Das kann Übelkeit auslösen. - Sensordaten zur Kopfbewegung können sich für Fingerprinting eignen. Moderne APIs verlangen deshalb eine Nutzergeste und einen sicheren Kontext (HTTPS).