Как воспроизводить и останавливать анимацию отдельных объектов three.js?

Начал недавно изучать three.js, скачал пример с офф сайта , попробовал сделать стоп анимации, если объект "собрался" и воспроизведение анимации по нажатию на кнопку.
function animate() {
			if (anim){
			id = requestAnimationFrame( animate );
			render();
			stats.update();
				if (uniforms.amplitude.value <= 0.0005) {
					anim = false;
				}
			}
		}
		function render() {
			timer += 0.001;
			uniforms.amplitude.value = 1.0 + Math.sin( timer* 50);
			controls.update();
			renderer.render( scene, camera );
		}
		document.getElementById("but").addEventListener("click", function(){
			anim = true;
			animate();
		});

Если полностью останавливать всю анимацию, то все нормально, но нельзя например покрутить камерой вокруг объекта.
Попробовал изменить функцию анимации, но в таком случае после каждого нажатия на кнопку, анимация "ускоряется", а "фпс" в левом верхнем углу пишется не 60, как обычно, а 200, 300, 600+ и тд.
function animate() {
			id = requestAnimationFrame( animate );
			if (anim){
				timer += 0.001;
				uniforms.amplitude.value = 1.0 + Math.sin( timer* 50);
				controls.update();
				renderer.render( scene, camera );
				if (uniforms.amplitude.value <= 0.0005) {
					anim = false;
				}
			} else { 
				render(); 
			}
      stats.update();
		}
		function render() {
			controls.update();
			renderer.render( scene, camera );
		}

Подскажите в чем проблема этого ускорения анимации, или как можно по другому воспроизводить анимации отдельных объектов.
  • Вопрос задан
  • 783 просмотра
Пригласить эксперта
Ответы на вопрос 1
Odenzzz
@Odenzzz Автор вопроса
В общем у меня получилось пофиксить это путем остановки анимации перед каждым повторным ее вызовом
function animate() {
					if (anim) {
						cancelAnimationFrame(id)
						id = requestAnimationFrame( animate );
						explode();
					} else {
						cancelAnimationFrame(id)
						id = requestAnimationFrame( animate );
						render(); 
					}
			stats.update();
		}

Не знаю на сколько это правильно или оптимально, но по крайней мере работает так как надо.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы