将 Tone.js 与 Three.js 结合使用 - 如何获得定位音频?

问题描述 投票:0回答:2

我可以轻松地让 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()
方法,所以声音不是位置的。

非常感谢任何帮助!

three.js web-audio-api tone.js
2个回答
6
投票

我想通了,为将来搜索的人发布自我回答。您只需将 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 );

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);
© www.soinside.com 2019 - 2024. All rights reserved.