Start · Sprachen · JavaScript · Referenz · AudioListener.forwardX

AudioListener.forwardX

Eigenschaft

Schreibgeschützter <code>AudioParam</code> für die x-Komponente des Vorwärtsvektors, also der Blickrichtung des Zuhörers im 3D-Audioraum. Standardwert: <code>0</code>.

seit JavaScript Baseline: alle modernen Browser (Firefox erst ab V Kategorie: webapi

Signatur

AudioListener.forwardX

Beschreibung

AudioListener.forwardX gehört zur räumlichen Audio-Verarbeitung der Web Audio API. Die Ausrichtung des Zuhörers wird durch zwei Vektoren beschrieben: den Vorwärtsvektor (forwardX, forwardY, forwardZ) für die Blickrichtung und den Aufwärtsvektor (upX, upY, upZ) für die Richtung „oben“. Zusammen legen sie fest, wie ein PannerNode Schallquellen relativ zum Zuhörer im Raum verteilt.

Die Eigenschaft selbst ist schreibgeschützt. Sie liefert aber ein AudioParam-Objekt, dessen value du ändern kannst. Du kannst auch Automatisierungsmethoden wie setValueAtTime(), linearRampToValueAtTime() oder setTargetAtTime() nutzen. So lassen sich Kopfdrehungen, etwa in Spielen oder VR-Anwendungen, zeitgenau und ohne Knackgeräusche umsetzen.

Standardmäßig zeigt der Vorwärtsvektor auf (0, 0, -1), der Zuhörer blickt also in die negative z-Richtung. forwardX hat deshalb den Standardwert 0. Ist der Wert positiv, dreht sich die Blickrichtung nach rechts (positive x-Achse), ist er negativ, nach links. Der Vektor muss nicht normiert sein, darf aber nicht die Länge null haben und nicht parallel zum Aufwärtsvektor stehen.

Rückgabewert

Typ
AudioParam
Beschreibung
Ein AudioParam mit der Automatisierungsrate "a-rate", dem Standardwert 0 und praktisch unbegrenztem Wertebereich (größte bzw. kleinste darstellbare Gleitkommazahl). Über .value liest oder setzt man den aktuellen Wert.

Beispiele

Aktuelle Blickrichtung auslesen und ändern

const ctx = new AudioContext();
const listener = ctx.listener;

console.log(listener.forwardX.value, listener.forwardY.value, listener.forwardZ.value);

// Zuhörer nach rechts (positive x-Achse) blicken lassen
listener.forwardX.value = 1;
listener.forwardZ.value = 0;
console.log(listener.forwardX.value);
0 0 -1 1

Kopfdrehung aus einem Winkel berechnen (z. B. Spielfigur)

const ctx = new AudioContext();
const { listener } = ctx;

// Winkel in Grad: 0 = geradeaus (-z), 90 = rechts (+x)
const setHeading = (degrees) => {
  const rad = (degrees * Math.PI) / 180;
  const t = ctx.currentTime;
  // setTargetAtTime vermeidet hörbare Sprünge
  listener.forwardX.setTargetAtTime(Math.sin(rad), t, 0.05);
  listener.forwardZ.setTargetAtTime(-Math.cos(rad), t, 0.05);
};

document.addEventListener('keydown', (e) => {
  if (e.key === 'ArrowRight') setHeading(90);
  if (e.key === 'ArrowLeft') setHeading(-90);
  if (e.key === 'ArrowUp') setHeading(0);
});

Fallback für ältere Browser ohne AudioParam-Orientierung

const ctx = new AudioContext();
const listener = ctx.listener;

const setOrientation = (fx, fy, fz, ux = 0, uy = 1, uz = 0) => {
  if (listener.forwardX) {
    listener.forwardX.value = fx;
    listener.forwardY.value = fy;
    listener.forwardZ.value = fz;
    listener.upX.value = ux;
    listener.upY.value = uy;
    listener.upZ.value = uz;
  } else {
    // veraltete API, z. B. in älteren Firefox-Versionen
    listener.setOrientation(fx, fy, fz, ux, uy, uz);
  }
};

setOrientation(1, 0, 0);
console.log('Orientierung gesetzt');
Orientierung gesetzt

// Wichtig · Fallstricke

  • Browser-Kompatibilität: In Chrome, Edge und Safari wird die Eigenschaft seit Langem unterstützt. Firefox bietet sie erst seit Version 138 an. In älteren Versionen gibt es nur die veraltete Methode AudioListener.setOrientation(). Prüfe deshalb vorher mit if (listener.forwardX), ob die Eigenschaft vorhanden ist.
  • Die Zuweisung listener.forwardX = 1 schlägt fehl, weil die Eigenschaft selbst schreibgeschützt ist. Richtig ist listener.forwardX.value = 1.
  • Der Vorwärtsvektor darf nicht parallel zum Aufwärtsvektor stehen (Standard: (0, 1, 0)), sonst ist die Ausrichtung nicht definiert.
  • Ob sich forwardX hörbar auswirkt, hängt davon ab, dass Schallquellen über einen PannerNode geleitet werden. Einfache Stereo-Signale bleiben unverändert.
  • Setzt du .value direkt, während Automatisierungsereignisse geplant sind, kann das je nach Browser ignoriert oder überschrieben werden. Brich geplante Ereignisse deshalb vorher mit cancelScheduledValues() ab.