Я изучал Three.js и наткнулся на эти примеры от Nat Geo. Мне было интересно, знает ли кто-нибудь, как заставить колесо прокрутки контролировать ход анимации и как она смешивается с обычным видом их веб-сайта ... В первом примере кажется, что элемент webgl находится в фоновом режиме с обычным html элементы плавают над ним, но я не понимаю, как они синхронизировали анимацию с этим.
Если у кого-то есть представление о том, как они были созданы, я был бы признателен!
https://www.nationalgeographic.com/science/2017/09/cassini-saturn-nasa-3d-grand-tour/#enceladus
https://www.nationalgeographic.com/science/2016/11/exploring-mars-map-panorama-pictures/



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Прокрутка - это событие браузера.
Я специально не просматривал связанные страницы, вместо этого я опишу более общий сценарий.
Как только вы поймете, как работает событие, легко увидеть, что можно отслеживать, как далеко вы прокручивали текущую страницу. Посмотрите на расстояние прокрутки как на своего рода триггер: когда вы пройдете расстояние X, должно произойти что-то конкретное.
Рассмотрим приведенный ниже фрагмент, в котором пересечение определенных пороговых значений меняет цвет фона кнопки:
var button = document.getElementById("myButton");
var position = 0;
function scrollHandler(e) {
e.preventDefault();
if (e.wheelDeltaY > 0 || position !== 0) {
position += e.wheelDeltaY;
}
console.info(position);
if (position < 500) {
button.style.background = "";
}
if (position > 500) {
button.style.background = "red";
}
if (position > 1000) {
button.style.background = "green";
}
}
button.addEventListener("mousewheel", scrollHandler);
button.addEventListener("DOMMouseScroll", scrollHandler);<input id = "myButton" type = "button" value = "BUTTON!" />Запустите фрагмент кода, затем наведите указатель мыши на кнопку и прокрутите вверх / вниз.
Для анимации вам нужен время.
var uniTime = gl.getUniformLocation( prg, "uniTime" );
gl.uniform1f( uniTime, time );
Но вы можете обмануть и использовать количество прокрутки вместо реального времени. Например, если вам нужно, чтобы полная прокрутка экрана составляла 7 секунд, вы можете использовать этот фрагмент кода в цикле анимации:
time = 7000 * screen.scrollTop / screen.scrollHeight;
Вот живой пример: https://jsfiddle.net/m1a9qry6/23/