Signatur
Beschreibung
HMDVRDevice gehört zur ersten, experimentellen Fassung der WebVR API. Das Interface erbt von VRDevice und steht für die Anzeigeeinheit einer VR-Brille, also etwa ein Oculus Rift DK2 oder ein frühes HTC Vive. Die Kopfbewegung wurde dagegen über ein eigenes PositionSensorVRDevice gemeldet. Beide Objekte bekam man als Liste über navigator.getVRDevices(). Welcher Sensor zu welcher Brille gehört, erkannte man an der gemeinsamen hardwareUnitId.
Das Interface bietet zwei Methoden:
getEyeParameters(whichEye)gibt einVREyeParameters-Objekt für das linke ("left") oder rechte ("right") Auge zurück. Es enthält das minimale, maximale, empfohlene und aktuelle Sichtfeld, den Versatz des Auges (eyeTranslation) und den Bildbereich zum Rendern (renderRect).setFieldOfView(leftFOV, rightFOV, zNear, zFar)setzt das Sichtfeld für beide Augen sowie die nahe und die ferne Schnittebene (Clipping-Ebenen).
Von VRDevice geerbt sind die schreibgeschützten Eigenschaften hardwareUnitId, deviceId und deviceName.
Diese API ist überholt. Zuerst wurde sie durch WebVR 1.1 (VRDisplay, navigator.getVRDisplays()) ersetzt, heute durch die WebXR Device API (navigator.xr). Für neue Projekte sollte man HMDVRDevice nicht mehr verwenden. Der Eintrag hilft vor allem beim Verstehen und Umstellen von altem Code.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $whichEye Pflicht | "left" | "right" | Parameter von getEyeParameters(): Auge, dessen VREyeParameters abgefragt werden. |
|
| $leftFOV | VRFieldOfView | Parameter von setFieldOfView(): Sichtfeld des linken Auges (upDegrees, rightDegrees, downDegrees, leftDegrees). |
|
| $rightFOV | VRFieldOfView | Parameter von setFieldOfView(): Sichtfeld des rechten Auges. |
|
| $zNear | number | 0.01 | Parameter von setFieldOfView(): Abstand der nahen Schnittebene in Metern. |
| $zFar | number | 10000.0 | Parameter von setFieldOfView(): Abstand der fernen Schnittebene in Metern. |
Rückgabewert
navigator.getVRDevices(). Es gibt keinen öffentlichen Konstruktor. getEyeParameters() gibt VREyeParameters zurück, setFieldOfView() gibt undefined zurück.Beispiele
Head-Mounted Display ermitteln und passenden Sensor zuordnen
const findHmd = async () => {
if (!navigator.getVRDevices) {
console.log('Alte WebVR API nicht verfügbar');
return null;
}
const devices = await navigator.getVRDevices();
// Erstes Gerät, das eine VR-Brille ist
const hmd = devices.find((d) => d instanceof HMDVRDevice);
if (!hmd) return null;
// Positionssensor derselben Hardware-Einheit suchen
const sensor = devices.find(
(d) => d instanceof PositionSensorVRDevice && d.hardwareUnitId === hmd.hardwareUnitId
);
console.log(`Gefunden: ${hmd.deviceName}`);
return { hmd, sensor };
};
findHmd();
Augenparameter auslesen, um die Canvas-Größe festzulegen
const setupCanvas = (hmd, canvas) => {
const left = hmd.getEyeParameters('left');
const right = hmd.getEyeParameters('right');
// Beide Augen liegen nebeneinander auf einer gemeinsamen Canvas
canvas.width = left.renderRect.width + right.renderRect.width;
canvas.height = Math.max(left.renderRect.height, right.renderRect.height);
const fov = left.recommendedFieldOfView;
console.log(`Canvas: ${canvas.width}x${canvas.height}`);
console.log(`FOV links oben: ${fov.upDegrees}°`);
console.log('Augenabstand (x):', left.eyeTranslation.x);
};
Sichtfeld verkleinern, um Rechenzeit zu sparen
const reduceFov = (hmd, factor = 0.8) => {
const scale = (fov) => new VRFieldOfView(
fov.upDegrees * factor,
fov.rightDegrees * factor,
fov.downDegrees * factor,
fov.leftDegrees * factor
);
const leftFov = scale(hmd.getEyeParameters('left').recommendedFieldOfView);
const rightFov = scale(hmd.getEyeParameters('right').recommendedFieldOfView);
// Nahe Ebene 10 cm, ferne Ebene 500 m
hmd.setFieldOfView(leftFov, rightFov, 0.1, 500);
console.log(hmd.getEyeParameters('left').currentFieldOfView.upDegrees);
};
Funktionserkennung mit Vorrang für WebXR
const detectVr = async () => {
if (navigator.xr && await navigator.xr.isSessionSupported('immersive-vr')) {
return 'webxr';
}
if (navigator.getVRDisplays) return 'webvr-1.1';
if (navigator.getVRDevices) return 'webvr-legacy'; // HMDVRDevice
return 'keine';
};
detectVr().then((api) => console.log('VR-API:', api));