Start · Sprachen · JavaScript · Referenz · HMDVRDevice

HMDVRDevice

Schnittstelle

Stellt in der frühen WebVR API ein Head-Mounted Display (VR-Brille) dar. Liefert Parameter für jedes Auge und erlaubt, das Sichtfeld zu setzen.

seit JavaScript Veraltet: nur in experimentellen Builds (Firefox N deprecated seit ja Kategorie: webapi

Signatur

interface HMDVRDevice extends VRDevice

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 ein VREyeParameters-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

Typ
HMDVRDevice
Beschreibung
Eine Instanz liefert nur 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();
Gefunden: Oculus Rift DK2 (bzw. „Alte WebVR API nicht verfügbar“ in aktuellen Browsern)

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);
};
Canvas: 1920x1080 FOV links oben: 45° Augenabstand (x): -0.032

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);
};
36

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));
VR-API: webxr