使用Tone.js和Three.js - 如何获取位置音频?

5
我可以轻松地让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()方法,因此声音没有位置感。
非常感谢任何帮助!
2个回答

8

我弄清楚了,为那些将来搜索的人发布自己的答案。您只需要设置 Tone.js 的context与 PositionalAudio 对象相同,然后将该对象的setNodeSource设置为 Tone.js 振荡器,将其添加到一些几何体中,就可以生成由 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 );

谢谢 @B-30,你分享你找到的解决方案非常好。它帮助我更快地入门了。 - Harrys Kavan
尝试在AFRAME中使用此代码,但setNodeSource引发DOMException InvalidAccessError异常。https://glitch.com/edit/#!/aframe-tonejs-position-audio - Ti Hausmann
1
似乎自2019年以来,Three.js和Tone.js发生了很大变化。 例如,Tone.context不再具有那样的setter,而是使用Tone.setContext。 你能发布更新后的代码吗? - Guy Luz
1
@GuyLuz,很抱歉我在2019年(感谢Covid)退出了游戏,但我收到了来自仍然活跃的Stack账户的提醒,关于这个评论,我想让你知道你需要自己探索,可能使用Tone.setContext将其设置为sound1上下文。祝你好运!网络上的空间音频真是太棒了,也许你已经激励我重新投入其中。 - B-30
谢谢你的回答,目前我卡在了 sound1.setNodeSource (oscillator1); 这一行上,因为它在 TypeScript 中无法接受。希望你正在做自己喜欢的事情,这非常重要。 - Guy Luz

0

对于未来寻找此类解决方案的任何人,我已经通过音频文件使其工作:

// 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接