2016-02-19 16 views
6

Chcemy zrobić efekt przenikania między dwoma dźwiękami. staram Tween.JS za to, ale nie jest to zrobić sprawnie, jak chcę ...Three.js jak wyciszyć dźwięk?

var sound_b_1 = new THREE.PositionalAudio(listener); 
sound_b_1.load('mysound.ogg'); 
sound_b_1.setRefDistance(20); 
sound_b_1.setVolume(1); 
sound_b_1.autoplay = true; 
scene.add(sound_b_1); 

var volume = {x : 1}; // tweens not work without object 
// using Tween.js 
new TWEEN.Tween(volume).to({ 
    x: 0 
}, 1000).onUpdate(function() { 
    sound_b_1.setVolume(this.x); 
}).onComplete(function() { 
    sound_b_1.stop(); 
}).start(); 

Hot to zrobić za pomocą Tween lub inne sposoby?

+3

więc masz kod nie działa? możesz stworzyć skrzypce? – gaitat

Odpowiedz

2

Nie widzę niczego złego w podanym kodzie, działa dobrze dla mnie, tylko że nie jest kompletny. Trzeba zadzwonić TWEEN.update(time) w swojej funkcji renderowania/aktualizacji:

kompletny kod:

var scene = new THREE.Scene(); 
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); 

var renderer = new THREE.WebGLRenderer(); 
renderer.setSize(window.innerWidth, window.innerHeight); 
document.body.appendChild(renderer.domElement); 

camera.position.z = 5; 

var listener = new THREE.AudioListener(); 
var sound_b_1 = new THREE.PositionalAudio(listener) 
sound_b_1.load('mysound.ogg'); 
sound_b_1.setRefDistance(20); 
sound_b_1.setVolume(1); 
sound_b_1.autoplay = true; 
scene.add(sound_b_1); 

var volume = {x : 1}; // tweens not work without object 
// using Tween.js 
new TWEEN.Tween(volume).to({ 
    x: 0 
}, 1000).onUpdate(function() { 
    sound_b_1.setVolume(this.x); 
}).onComplete(function() { 
    sound_b_1.stop(); 
}).start(); 

var time = 0; // incrementing time variable 
var render = function() { 
    requestAnimationFrame(render); 
    // normally the render render function is called 60 times a second. 
    // convert to milliseconds 
    time += ((1/60) * 1000); 
    TWEEN.update(time); 

    renderer.render(scene, camera); 
}; 
//setTimeout(()=>{sound_b_1.stop();}, 5000); 
render(); 

Spowoduje mysound.ogg zacząć grać przy pełnej objętości, a następnie interpolowane liniowo do objętości nie w ogóle, a następnie zatrzymać gra.

Jeśli chcesz inny klip audio, aby rozpocząć odtwarzanie po prostu zrobić to samo, ale niech rozpoczęcia głośności na 0 i interpolacji do 1.