Signatur
Beschreibung
Die Methode getState() der Schnittstelle PositionSensorVRDevice gehört zur frühen, inzwischen entfernten WebVR-API (Version 0.x). Sie liefert den Zustand des Positionssensors eines VR-Headsets (z. B. Oculus Rift DK2) für das aktuelle Frame, also den Wert, der zum laufenden window.requestAnimationFrame()-Callback passt. Der Browser kann dabei eine Vorhersage für den Zeitpunkt berechnen, an dem das Frame tatsächlich angezeigt wird. Das verringert die gefühlte Verzögerung beim Rendern.
Das zurückgegebene VRPositionState-Objekt enthält unter anderem timeStamp, hasPosition, hasOrientation, position (ein DOMPoint in Metern), orientation (ein DOMPoint als Quaternion x/y/z/w) sowie linearVelocity, angularVelocity, linearAcceleration und angularAcceleration. Werte, die der Sensor nicht liefern kann, sind null.
Brauchte man Rohdaten ohne Frame-Vorhersage, etwa für Physik oder Eingabelogik außerhalb der Render-Schleife, gab es als Gegenstück getImmediateState(). Mit resetSensor() ließ sich die aktuelle Kopfhaltung als neuer Nullpunkt festlegen.
Für neue Projekte kommt diese API nicht mehr in Frage. Der Nachfolger ist die WebXR Device API. Dort übernimmt XRFrame.getViewerPose() diese Aufgabe.
Rückgabewert
timeStamp, hasPosition, hasOrientation, position, orientation, linearVelocity, angularVelocity, linearAcceleration, angularAcceleration. Werte, die nicht verfügbar sind, sind null.Beispiele
Positionssensor finden und in der Render-Schleife abfragen
// Nur in alten WebVR-0.x-Builds lauffähig
const findSensor = async () => {
if (!navigator.getVRDevices) {
throw new Error('WebVR 0.x wird nicht unterstützt');
}
const devices = await navigator.getVRDevices();
return devices.find((d) => d instanceof PositionSensorVRDevice);
};
const start = async () => {
const sensor = await findSensor();
if (!sensor) return console.log('Kein Positionssensor gefunden');
const loop = () => {
const state = sensor.getState();
if (state.hasOrientation) {
const { x, y, z, w } = state.orientation;
console.log(`Quaternion: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}, ${w.toFixed(2)}`);
}
requestAnimationFrame(loop);
};
requestAnimationFrame(loop);
};
start().catch((err) => console.warn(err.message));
Kamera an Kopfposition und -ausrichtung koppeln
// Annahme: camera ist ein Three.js-PerspectiveCamera-Objekt, sensor ein PositionSensorVRDevice
const updateCamera = (sensor, camera) => {
const state = sensor.getState();
if (state.hasOrientation && state.orientation) {
const { x, y, z, w } = state.orientation;
camera.quaternion.set(x, y, z, w);
}
if (state.hasPosition && state.position) {
const { x, y, z } = state.position;
// Position in Metern, ggf. an Szenenmaßstab anpassen
camera.position.set(x, y + 1.6, z);
}
};
const render = () => {
updateCamera(sensor, camera);
renderer.render(scene, camera);
requestAnimationFrame(render);
};
// Aktuelle Blickrichtung als "vorne" festlegen
sensor.resetSensor();
requestAnimationFrame(render);
Feature-Erkennung mit Umstieg auf WebXR
const initVR = async () => {
if (navigator.xr && await navigator.xr.isSessionSupported('immersive-vr')) {
console.log('WebXR verfügbar – XRFrame.getViewerPose() verwenden');
return 'webxr';
}
if (navigator.getVRDevices) {
console.log('Nur veraltetes WebVR 0.x – PositionSensorVRDevice.getState()');
return 'webvr-legacy';
}
console.log('Kein VR-Support');
return 'none';
};
initVR();
// Wichtig · Fallstricke
- Veraltet und entfernt:
PositionSensorVRDeviceundnavigator.getVRDevices()gab es nur in experimentellen Builds (Firefox Nightly, spezielle Chromium-Builds). Auch der Nachfolger WebVR 1.1 (VRDisplay.getFrameData()) ist inzwischen abgeschafft. Stattdessen WebXR verwenden (XRSession,XRFrame.getViewerPose()). - Richtiger Aufrufzeitpunkt:
getState()nur innerhalb einesrequestAnimationFrame-Callbacks aufrufen. Nur dort passt die Vorhersage zum angezeigten Frame. Für Logik außerhalb des Renderns istgetImmediateState()gedacht. - null-Werte prüfen: Geräte, die nur die Ausrichtung erfassen (z. B. Oculus DK1), liefern
position === null. Vor dem Zugriff immerhasPositionbzw.hasOrientationprüfen. - Einheiten: Positionen sind in Metern angegeben, die Ausrichtung als Quaternion und nicht in Euler-Winkeln.
- Sicherheit/Datenschutz: Bewegungsdaten des Kopfes können sich für Fingerprinting eignen. Moderne APIs verlangen deshalb eine Nutzergeste und einen sicheren Kontext (HTTPS).