Signatur
Beschreibung
Die Eigenschaft maxDistance eines PannerNode ist eine Gleitkommazahl (double). Sie gibt an, ab welcher Entfernung zwischen Schallquelle und AudioListener die Lautstärke nicht mehr weiter sinkt. Der Wert lässt sich lesen und schreiben. Standardmäßig ist er 10000, die Einheit ist dieselbe wie bei den Positionskoordinaten (frei wählbar, z. B. Meter).
Am wichtigsten ist maxDistance beim Entfernungsmodell distanceModel = "linear". Dort bestimmt der Wert, wo die lineare Dämpfung endet: Die Entfernung wird auf den Bereich zwischen refDistance und maxDistance begrenzt. Die Verstärkung berechnet sich dann so: 1 - rolloffFactor * (d - refDistance) / (maxDistance - refDistance). Bei rolloffFactor = 1 ist die Quelle ab maxDistance also völlig stumm.
Bei den Modellen "inverse" (Standard) und "exponential" hat maxDistance laut Spezifikation keinen Einfluss. Diese Modelle begrenzen die Entfernung nur nach unten, nämlich auf refDistance. Typische Einsatzfälle sind Spiele, 3D-Szenen und virtuelle Räume, in denen Geräusche ab einer bestimmten Entfernung nicht mehr (oder nur noch sehr leise) zu hören sein sollen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $wert | number | 10000 | Beim Schreiben: neue maximale Entfernung. Muss eine positive Zahl sein (größer als 0). |
Rückgabewert
double.Beispiele
Wert lesen und setzen
const ctx = new AudioContext();
const panner = new PannerNode(ctx);
console.log(panner.maxDistance); // Standardwert
panner.maxDistance = 50;
console.log(panner.maxDistance);
Lineares Ausblenden bis 30 Meter in einer Spielszene
const ctx = new AudioContext();
const panner = new PannerNode(ctx, {
panningModel: 'HRTF',
distanceModel: 'linear', // nur hier wirkt maxDistance
refDistance: 1,
maxDistance: 30,
rolloffFactor: 1,
positionX: 0,
positionY: 0,
positionZ: -5
});
const osc = new OscillatorNode(ctx, { frequency: 440 });
osc.connect(panner).connect(ctx.destination);
osc.start();
// Quelle entfernt sich: ab 30 Einheiten ist sie stumm
let z = -5;
const timer = setInterval(() => {
z -= 1;
panner.positionZ.value = z;
if (z < -40) {
clearInterval(timer);
osc.stop();
}
}, 100);
Verstärkung für das lineare Modell nachrechnen
const linearGain = ({ refDistance, maxDistance, rolloffFactor }, distance) => {
const d = Math.min(Math.max(distance, refDistance), maxDistance);
return 1 - rolloffFactor * (d - refDistance) / (maxDistance - refDistance);
};
const opts = { refDistance: 1, maxDistance: 21, rolloffFactor: 1 };
for (const dist of [1, 11, 21, 100]) {
console.log(dist, linearGain(opts, dist).toFixed(2));
}
Ungültige Werte abfangen
const ctx = new AudioContext();
const panner = ctx.createPanner();
try {
panner.maxDistance = 0;
} catch (err) {
console.log(err.name);
}
console.log(panner.maxDistance);
// Wichtig · Fallstricke
- RangeError: Wird ein Wert kleiner oder gleich
0gesetzt, wirft der Browser einenRangeError. Der bisherige Wert bleibt dann erhalten. - Wirkt fast nur beim linearen Modell: Bei
"inverse"(Standard) und"exponential"ändertmaxDistancelaut Spezifikation nichts. Soll eine Quelle ab einer bestimmten Entfernung verstummen, mussdistanceModel = "linear"gesetzt sein. - Nicht automatisierbar:
maxDistanceist ein einfacher Zahlenwert und keinAudioParam. Methoden wielinearRampToValueAtTime()stehen deshalb nicht zur Verfügung. - Lautstärke unter dem Nullwert: Ist
rolloffFactorkleiner als1, bleibt die Quelle auch jenseits vonmaxDistancehörbar, mit der Restlautstärke1 - rolloffFactor. - Kompatibilität: Wird von allen modernen Browsern unterstützt. Die Einstellung über den Konstruktor (
new PannerNode(ctx, { maxDistance })) gibt es erst in neueren Versionen. In sehr alten Safari-Versionen ist nurwebkitAudioContextmitcreatePanner()verfügbar.