Научный руководитель: Вильданов Алмаз Нафкатович
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал
Введение
WebGL — это мощный инструмент для создания 3D-графики прямо в браузере, позволяющий задействовать ресурсы графического адаптера и разгрузить процессор . Визуализация погодных данных, таких как температура, давление или осадки, требует не только точности, но и интерактивности. Например, Яндекс.Погода использует WebGL для отображения сложных анимаций, таких как движение облаков или эффекты дождя . Современные требования к веб-приложениям включают поддержку мобильных устройств, кросс-платформенность и высокую производительность, что делает WebGL идеальным выбором для таких задач.

Рисунок 1. Скриншот интерфейса с 3D-анимацией облаков
Парсинг данных
Для начала необходимо извлечь данные из погодного API (например, OpenWeatherMap). Запросы отправляются через JavaScript с использованием fetch или XMLHttpRequest. Ответ обычно приходит в формате JSON, содержащем информацию о температуре, скорости ветра, облачности и других параметрах.
Пример JSON-ответа:
json
{
“temperature”: 20,
“humidity”: 60,
“wind_speed”: 5,
“cloudiness”: 80
}

Рисунок 2. Диаграмма, показывающая структуру JSON-ответа от API погоды
Работа с ошибками API
При парсинге данных важно учитывать возможные ошибки, такие как превышение лимита запросов или недоступность сервера. Для этого рекомендуется использовать механизмы повторных попыток и кэширования данных. Например, можно сохранять последние успешные ответы в localStorage и отображать их, если API временно недоступен .
Геолокационные данные
Для автоматического определения местоположения пользователя можно использовать Geolocation API. Это позволяет отображать погоду без необходимости ручного ввода города. Пример кода:
javascript
navigator.geolocation.getCurrentPosition(position => {
const { latitude, longitude } = position.coords;
fetch(`https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&q= ${latitude},${longitude}`)
.then(response => response.json())
.then(data => console.log(data));
});
Подготовка данных для WebGL
Полученные данные нужно преобразовать в визуальные элементы. Например:
- Температура : Цветовая палитра от синего (холодно) до красного (жарко).
- Облака : Трехмерные полигоны с текстурами.
- Дождь : Анимированные частицы.
Для работы с данными в WebGL используются буферы и атрибуты, которые загружаются в графический процессор .
Преобразование данных в 3D-объекты
Каждый параметр погоды может быть представлен в виде геометрии. Например, температура может отображаться как цветовая карта на поверхности земного шара, а ветер — как движение частиц в направлении его направления. Для этого используются вершинные шейдеры, где координаты вершин изменяются в зависимости от данных.

Рисунок 3. 3D-сцена с облаками, температурными градиентами и анимацией ветра
Создание 3D-сцены
Сцена строится с помощью WebGL API или библиотек, таких как Three.js. Основные шаги:
- Инициализация контекста WebGL.
- Создание вершинного и фрагментного шейдеров для управления геометрией и цветом .
- Настройка камеры и источников света.
- Добавление объектов (облака, температурные градиенты).
Пример кода Three.js
javascript
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// Добавление облака
const cloudGeometry = new THREE.SphereGeometry(5, 32, 32);
const cloudMaterial = new THREE.MeshBasicMaterial({ map: new THREE.TextureLoader().load(‘cloud.png’) });
const cloud = new THREE.Mesh(cloudGeometry, cloudMaterial);
scene.add(cloud);
camera.position.z = 10;
function animate() {
requestAnimationFrame(animate);
cloud.rotation.y += 0.01; // Анимация облака
renderer.render(scene, camera);
}
animate();
Анимация и взаимодействие
Для динамического отображения погоды используются шейдеры. Например, в фрагментном шейдере можно реализовать эффект дождя, изменяя координаты частиц в реальном времени. Взаимодействие пользователя (например, вращение сцены мышью) реализуется через обработчики событий.
5.1 Шейдер для дождя
glsl
// Фрагментный шейдер
precision mediump float;
uniform float u_time;
void main() {
vec2 uv = gl_FragCoord.xy / vec2(800.0, 600.0);
float rain = sin(uv.x * 100.0 + u_time * 10.0) * 0.5 + 0.5;
gl_FragColor = vec4(vec3(rain), 1.0);
}
Рисунок 4. Анимация дождевых частиц, управляемых шейдерами
Оптимизация производительности
WebGL позволяет оптимизировать рендеринг за счет:
- Минимизации количества вызовов WebGL API.
- Использования буферов для хранения данных на GPU .
- Упрощения шейдеров для мобильных устройств.
Кэширование данных
Для уменьшения нагрузки на сеть данные можно кэшировать на стороне клиента. Например, сохранять результаты запросов в IndexedDB и обновлять их только при изменении погодных условий. Это особенно важно для мобильных пользователей с ограниченным трафиком.
Интеграция с картами
Для улучшения восприятия данных можно интегрировать 3D-сцену с картами (например, Google Maps или Mapbox). Это позволяет отображать погоду в контексте географического положения. Например, облачность может показываться как слой над картой, а ветер — как стрелки на поверхности земли.
Заключение
WebGL открывает широкие возможности для визуализации погодных данных, превращая сухие цифры в интерактивные 3D-сцены. Использование шейдеров, библиотек вроде Three.js и оптимизация через GPU гарантирует высокую производительность даже на слабых устройствах. Дополнительные элементы, такие как геолокация и интеграция с картами, делают приложения еще более полезными для пользователей.
Библиографический список
-
Парсинг — что такое URL: https://skyeng.ru/magazine/wiki/it-industriya/chto-takoe-parsing/ (дата обращения 10.08.2025г.)
-
Парсер погоды URL: https://habr.com/ru/sandbox/44535/ (дата обращения 10.08.2025г.)
-
Requests: HTTP for Humans [Электронный ресурс] / – Электрон. текстовые дан. – Режим доступа: https://requests.readthedocs.io/en/latest/, свободный. – Загл. с экрана.
-
Beautiful Soup Documentation [Электронный ресурс] / – Электрон. текстовые дан. – Режим доступа: https://beautiful-soup.readthedocs.io/en/latest/, свободный. – Загл. с экрана.
