我可以轻松地让 Tone.js 在 Three.js 世界中生成音调,只需调用,例如,
oscillator = new Tone.Oscillator(440, "sine").toMaster();
,但我不知道如何将该音调连接到 Three.js 世界中的 AudioListener使它成为一个定位声音。有人知道怎么做这个吗?
使用 Three.js 中内置的振荡器,它按照 Three.js audio-sandbox 示例完美运行,它使用
oscillator = listener.context.createOscillator();
所以我假设这证明我需要将 Tone.js 输出连接到 AudioContext听众,但我不知道该怎么做,而且我也无法在网上找到任何关于它的信息。我能找到的任何例子都简单地使用上面的toMaster()
方法,所以声音不是位置的。
非常感谢任何帮助!
我想通了,为将来搜索的人发布自我回答。您只需将 Tone.js 的
context
设置为与 PositionalAudio 对象相同,然后将该对象的 setNodeSource
设置为 Tone.js 振荡器,将其添加到一些几何体中,嘿,presto,位置音频由Tone.js:
var mesh1 = new THREE.Mesh( geometry, material ); //geometry, material defined elsewhere
scene.add(mesh1);
listener = new THREE.AudioListener();
camera.add( listener );
var sound1 = new THREE.PositionalAudio( listener );
Tone.context = sound1.context;
var oscillator1 = new Tone.Oscillator(440, "sine");
sound1.setNodeSource (oscillator1);
mesh1.add( sound1 );
对于将来寻找此内容的任何人,我使用音频文件进行了此操作:
// declare the listener:
const listener = new THREE.AudioListener();
camera.add( listener );
// set mesh (make sure to set material & geometry before
sphere = new THREE.Mesh(geometry, material1);
//set positional audio
let sound1 = new THREE.PositionalAudio( listener );
Tone.setContext(sound1.context);
let player = new Tone.Player
({
url: "sound/test2.wav",
loop: true,
autostart: true, //as a lot of browsers don't auto play audio
});
sound1.setNodeSource(player);
sound1.setRefDistance( 3 );
sphere.add(sound1);