Signatur
Beschreibung
AudioListener.upX ist ein schreibgeschützter AudioParam. Er enthält die x-Komponente des Aufwärtsvektors des Zuhörers in einer räumlichen Audioszene der Web Audio API. Zusammen mit upY und upZ bildet er einen Vektor, der angibt, wo sich der „Scheitel“ des Zuhörers befindet. Die Blickrichtung wird dagegen über forwardX, forwardY und forwardZ festgelegt.
Beide Vektoren zusammen bestimmen die Ausrichtung des Kopfes im Raum. Ein PannerNode berechnet daraus, ob eine Schallquelle links, rechts, oben oder unten zu hören ist. Den Aufwärtsvektor ändert man vor allem, wenn der Zuhörer den Kopf seitlich neigt (Rollen), etwa in Flugsimulationen, VR-Anwendungen oder bei einer 3D-Kamera mit Neigung.
Der Standardwert von upX ist 0; der vollständige Standardvektor ist (0, 1, 0), zeigt also entlang der positiven y-Achse. Weil die Eigenschaft ein AudioParam ist, setzt man ihren Wert über .value oder plant Änderungen über Automatisierungsmethoden wie setValueAtTime() oder linearRampToValueAtTime(). Das ergibt fließende Übergänge ohne Knackser. Die Eigenschaft selbst kann man nicht neu zuweisen.
Rückgabewert
AudioParam vom Typ a-rate, dessen value die x-Komponente des Aufwärtsvektors enthält (Standardwert 0, als 32-Bit-Gleitkommazahl gespeichert).Beispiele
Standardwert auslesen
const ctx = new AudioContext();
const { listener } = ctx;
console.log(listener.upX.value, listener.upY.value, listener.upZ.value);
console.log(listener.upX.defaultValue);
Kopf um 90° nach rechts neigen (mit Fallback)
const ctx = new AudioContext();
const listener = ctx.listener;
// Up-Vektor zeigt nun entlang der positiven x-Achse
if (listener.upX) {
listener.upX.value = 1;
listener.upY.value = 0;
listener.upZ.value = 0;
} else {
// Fallback für ältere Browser (z. B. Firefox)
listener.setOrientation(0, 0, -1, 1, 0, 0);
}
Weiche Rollbewegung in einer 3D-Szene
const ctx = new AudioContext();
const listener = ctx.listener;
const osc = new OscillatorNode(ctx, { frequency: 440 });
const panner = new PannerNode(ctx, {
panningModel: 'HRTF',
positionX: 2, positionY: 0, positionZ: -2
});
osc.connect(panner).connect(ctx.destination);
osc.start();
// Rollwinkel über 2 Sekunden von 0° auf 45° ändern
const roll = (deg) => (deg * Math.PI) / 180;
const now = ctx.currentTime;
const angle = roll(45);
listener.upX.setValueAtTime(0, now);
listener.upY.setValueAtTime(1, now);
listener.upX.linearRampToValueAtTime(Math.sin(angle), now + 2);
listener.upY.linearRampToValueAtTime(Math.cos(angle), now + 2);
Up-Vektor an eine Kamera-Rotation koppeln
const ctx = new AudioContext();
// z. B. bei jedem Frame aus einer 3D-Engine aufrufen
const syncListener = (up, forward) => {
const t = ctx.currentTime;
const l = ctx.listener;
l.upX.setTargetAtTime(up.x, t, 0.02);
l.upY.setTargetAtTime(up.y, t, 0.02);
l.upZ.setTargetAtTime(up.z, t, 0.02);
l.forwardX.setTargetAtTime(forward.x, t, 0.02);
l.forwardY.setTargetAtTime(forward.y, t, 0.02);
l.forwardZ.setTargetAtTime(forward.z, t, 0.02);
};
syncListener({ x: 0, y: 1, z: 0 }, { x: 0, y: 0, z: -1 });
// Wichtig · Fallstricke
- Schreibgeschützt:
listener.upX = 1hat keine Wirkung. Setzen Sie stattdessenlistener.upX.valueoder verwenden Sie Automatisierungsmethoden. - Orthogonalität: Aufwärts- und Blickrichtungsvektor sollten senkrecht zueinander stehen und nicht parallel sein. Sonst ist die Ausrichtung nicht eindeutig und das Panning kann sich unerwartet verhalten. Die Länge der Vektoren spielt keine Rolle, sie werden intern normalisiert.
- Browser-Kompatibilität: Firefox unterstützt
upX/upY/upZbislang nicht; dort istlistener.upXundefined. Prüfen Sie die Unterstützung per Feature-Erkennung und greifen Sie auf das veraltetesetOrientation()zurück. - Direktes Setzen von
.value, während Automatisierungsereignisse geplant sind, kann ignoriert werden. VorhercancelScheduledValues()aufrufen. - Der Wert wirkt sich nur auf
PannerNode-Knoten im selbenAudioContextaus. OhnePannerNodehat er keinen hörbaren Effekt. - Browser starten einen
AudioContextoft angehalten (Autoplay-Richtlinie). Rufen Siectx.resume()nach einer Nutzerinteraktion auf.