Hi guys,
ich versuche seit gestern mit der WebAudioAPI einen 3D Sound bei Alt:V umzusetzen.
Leider klappt es nicht ganz wie ich es mir wünsche - Bisher ist es kein Problem den Sound zu meiner Spielerposition abzuspielen, leider bekomme ich es aber nicht hin das meine Richtung (heading) von meinem Spieler den Sound entweder auf die Linke / Mitte oder rechte Seite packt... Entweder habe ich den falschen Ansatz, bin behindert oder irgendwas im Code ist falsch (was safe so ist).
Hier mein Code:
HTML/Javascript:
Code
alt.on("updatePlayerPosition", function(x, y, z, angle) {
if(!isPlaying) return;
panner.setPosition(x, y, z); // Update meiner eigenen Position wo ich gerade bin
panner.setOrientation(Math.cos(angle), -Math.sin(angle), 1); // Update von meinem heading (Wie mein Charakter gerade steht, was nicht geht und ich hilfe brauche)
});
function init() {
let posX = 0; // Position wo das "Radio" steht
let posY = 0; // Position wo das "Radio" steht
let posZ = 72; // Position wo das "Radio" steht
audioCtx = new AudioContext();
listener = audioCtx.listener;
if(listener.positionX) {
listener.positionX.value = posX;
listener.positionY.value = posY;
listener.positionZ.value = posZ-5;
} else {
listener.setPosition(posX, posY, posZ-5);
}
if(listener.forwardX) {
listener.forwardX.value = 0;
listener.forwardY.value = 0;
listener.forwardZ.value = -1;
listener.upX.value = 0;
listener.upY.value = 1;
listener.upZ.value = 0;
} else {
listener.setOrientation(0, 0, -1, 0, 1, 0);
}
const pannerModel = 'HRTF';
const innerCone = 0;
const outerCone = 180;
const outerGain = 0.2;
const distanceModel = 'linear';
const maxDistance = 20;
const refDistance = 1;
const rollOff = 10;
const positionX = 0;
const positionY = 0;
const positionZ = 72;
const orientationX = 0.0;
const orientationY = 0.0;
const orientationZ = -1.0;
// let's use the class method for creating our panner node and pass in all those parameters we've set.
panner = new PannerNode(audioCtx, {
panningModel: pannerModel,
distanceModel: distanceModel,
positionX: positionX,
positionY: positionY,
positionZ: positionZ,
orientationX: orientationX,
orientationY: orientationY,
orientationZ: orientationZ,
refDistance: refDistance,
maxDistance: maxDistance,
rolloffFactor: rollOff,
coneInnerAngle: innerCone,
coneOuterAngle: outerCone,
coneOuterGain: outerGain
})
}
Alles anzeigen
Hier noch der Clientside Code wie ich es übergebe:
Code
alt.setInterval(() => {
let pos = game.getEntityCoords(alt.Player.local.scriptID);
let heading = game.getEntityHeading(alt.Player.local.scriptID);
heading *= Math.PI / 180
mainView.emit("updatePlayerPosition", pos.x, pos.y, pos.z, heading);
}, 100);
Ich hoffe es gibt jemand der sich damit auskennt^^
Grüße