Signatur
Beschreibung
getImmediateState() gehört zur Schnittstelle PositionSensorVRDevice aus der frühen, experimentellen WebVR-API. Die Methode liest den Positionssensor eines VR-Headsets (z. B. Oculus Rift DK2) sofort aus und liefert ein VRPositionState-Objekt. Darin stehen position, orientation, lineare und Winkelgeschwindigkeit, Beschleunigungen und ein timeStamp.
Die Schwestermethode getState() liefert dagegen einen vorhergesagten Zustand für den Zeitpunkt, an dem das nächste Bild angezeigt wird. Für das Rendern ist getState() die bessere Wahl, weil die Vorhersage die Latenz ausgleicht. getImmediateState() passt dagegen gut, wenn Sie Rohdaten ohne Vorhersage brauchen, etwa für Physik, Kalibrierung, Logging oder Treffertests.
Ob die Werte gültig sind, sagen die Flags hasPosition und hasOrientation. Geräte ohne Positionsverfolgung (z. B. Cardboard) liefern nur eine Ausrichtung, position ist dann null. Werte, die nicht gemeldet werden, sind ebenfalls null.
Wichtig: Diese API wurde nie standardisiert. Sie wurde erst durch WebVR 1.1 (VRDisplay.getFrameData()) ersetzt und danach vollständig durch die WebXR Device API. Für neuen Code sollten Sie ausschließlich WebXR verwenden.
Rückgabewert
timeStamp, hasPosition, position (DOMPoint in Metern oder null), linearVelocity, linearAcceleration, hasOrientation, orientation (Quaternion als DOMPoint oder null), angularVelocity und angularAcceleration.Beispiele
Positionssensor finden und aktuellen Zustand lesen
// Alte WebVR-API (0.x): Geräte auflisten und Positionssensor herausfiltern
const findeSensor = async () => {
if (!navigator.getVRDevices) {
console.warn('Alte WebVR-API wird nicht unterstützt.');
return null;
}
const geraete = await navigator.getVRDevices();
return geraete.find((g) => g instanceof PositionSensorVRDevice) ?? null;
};
const sensor = await findeSensor();
if (sensor) {
const zustand = sensor.getImmediateState();
if (zustand.hasOrientation) {
const { x, y, z, w } = zustand.orientation;
console.log(`Ausrichtung: ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}, ${w.toFixed(2)}`);
}
if (zustand.hasPosition) {
const { x, y, z } = zustand.position;
console.log(`Position (m): ${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`);
}
}
Rohdaten fürs Logging, vorhergesagten Zustand fürs Rendern
const starteSchleife = (sensor, zeichneSzene) => {
const log = [];
const frame = () => {
// Vorhergesagter Zustand für das nächste Bild: fürs Rendern
const vorhersage = sensor.getState();
zeichneSzene(vorhersage.orientation, vorhersage.position);
// Echter aktueller Zustand: für Analyse und Physik
const jetzt = sensor.getImmediateState();
log.push({
t: jetzt.timeStamp,
winkelGeschw: jetzt.angularVelocity
? [jetzt.angularVelocity.x, jetzt.angularVelocity.y, jetzt.angularVelocity.z]
: null
});
requestAnimationFrame(frame);
};
requestAnimationFrame(frame);
return log;
};
Moderner Ersatz mit WebXR
// Heute: WebXR statt PositionSensorVRDevice
if (navigator.xr && await navigator.xr.isSessionSupported('immersive-vr')) {
const session = await navigator.xr.requestSession('immersive-vr');
const refSpace = await session.requestReferenceSpace('local');
session.requestAnimationFrame(function onFrame(time, frame) {
const pose = frame.getViewerPose(refSpace);
if (pose) {
const { position, orientation } = pose.transform;
console.log(position.x, position.y, position.z, orientation.w);
}
session.requestAnimationFrame(onFrame);
});
}
// Wichtig · Fallstricke
- Veraltet und entfernt:
PositionSensorVRDevice,navigator.getVRDevices()undgetImmediateState()gab es nur in experimentellen Builds hinter Flags. Aktuelle Browser unterstützen sie nicht mehr. Nutzen Sie die WebXR Device API (XRFrame.getViewerPose()). - Die MDN-Kurzbeschreibung nennt fälschlich
VRDisplay. Die Methode gehört zuPositionSensorVRDevice.VRDisplayist die Nachfolge-Schnittstelle aus WebVR 1.1 und kennt diese Methode nicht. - Fürs Rendern sollten Sie
getState()verwenden. Wenn Sie mitgetImmediateState()rendern, entstehen sichtbare Verzögerungen und Übelkeit (Motion-to-Photon-Latenz). - Prüfen Sie immer
hasPosition/hasOrientationund die Werte aufnull, bevor Sie darauf zugreifen. - Prüfen Sie vor der Nutzung, ob die API vorhanden ist (
'getVRDevices' in navigator), sonst gibt es einenTypeError.