<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Электронный научно-практический журнал «Современные научные исследования и инновации» &#187; 3D-графика</title>
	<atom:link href="http://web.snauka.ru/issues/tag/3d-grafika/feed" rel="self" type="application/rss+xml" />
	<link>https://web.snauka.ru</link>
	<description></description>
	<lastBuildDate>Fri, 17 Apr 2026 07:29:22 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Создание фигуры с помощью экструдирования</title>
		<link>https://web.snauka.ru/issues/2026/01/104085</link>
		<comments>https://web.snauka.ru/issues/2026/01/104085#comments</comments>
		<pubDate>Thu, 01 Jan 2026 14:30:52 +0000</pubDate>
		<dc:creator>Мухаяров Дильназ Данисович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-графика]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[программирование на JavaScript]]></category>
		<category><![CDATA[трехмерное моделирование]]></category>
		<category><![CDATA[экструдирование]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/01/104085</guid>
		<description><![CDATA[Создание трехмерных моделей является важной задачей в области компьютерной графики и веб-разработки. Библиотека Three.js предоставляет мощные инструменты для визуализации и моделирования 3D-объектов непосредственно в браузере. Одним из распространенных методов моделирования является экструдирование — процесс вытягивания двумерных контуров в трехмерное пространство для получения сложных фигур. В данной статье рассматривается применение метода экструдирования для создания фигур в [...]]]></description>
			<content:encoded><![CDATA[<p>Создание трехмерных моделей является важной задачей в области компьютерной графики и веб-разработки. Библиотека Three.js предоставляет мощные инструменты для визуализации и моделирования 3D-объектов непосредственно в браузере. Одним из распространенных методов моделирования является экструдирование — процесс вытягивания двумерных контуров в трехмерное пространство для получения сложных фигур. В данной статье рассматривается применение метода экструдирования для создания фигур в Three.js, описываются основные параметры, настройка и пример реализации.</p>
<p><span>Теоретические основы экструдирования в Three.js<br />
</span></p>
<p><span>Экструдирование — это процесс преобразования двумерных путей или форм в трехмерные объекты путём вытягивания вдоль заданной оси. В библиотеке Three.js для этого используется класс `ExtrudeBufferGeometry`, который принимает профиль формы и параметры экструдирования. Основные параметры включают:<br />
</span></p>
<p><span>- `steps`: количество шагов по оси экструдирования,<br />
</span></p>
<p><span>- `depth`: длина вытягивания,<br />
</span></p>
<p><span>- `bevelEnabled`: включение скругления краев,<br />
</span></p>
<p><span>- `bevelThickness`, `bevelSize`, `bevelSegments`: параметры скругления.<br />
</span></p>
<p><span>Процесс моделирования включает определение формы (Shape), настройку параметров экструдирования и создание геометрии, которая затем используется для построения меша.<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011426_1431_1.png" alt="" /></p>
<p style="text-align: center;"><span style="color: #5b9bd5;"><strong>Рисунок 1. Пример веб-производительности<br />
</strong></span></p>
<p><span>Пример реализации на JavaScript<br />
</span></p>
<p><span>&#8220;`javascript<br />
</span></p>
<p><span>// Создаем сцену, камеру и рендерер<br />
</span></p>
<p><span>const scene = new THREE.Scene();<br />
</span></p>
<p><span>const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);<br />
</span></p>
<p><span>const renderer = new THREE.WebGLRenderer();<br />
</span></p>
<p><span>renderer.setSize(window.innerWidth, window.innerHeight);<br />
</span></p>
<p><span>document.body.appendChild(renderer.domElement);<br />
</span></p>
<p><span>// Определяем двумерную форму (например, простой квадрат)<br />
</span></p>
<p><span>const shape = new THREE.Shape();<br />
</span></p>
<p><span>shape.moveTo(0, 0);<br />
</span></p>
<p><span>shape.lineTo(0, 1);<br />
</span></p>
<p><span>shape.lineTo(1, 1);<br />
</span></p>
<p><span>shape.lineTo(1, 0);<br />
</span></p>
<p><span>shape.lineTo(0, 0);<br />
</span></p>
<p><span>// Настраиваем параметры экструдирования<br />
</span></p>
<p><span>const extrudeSettings = {<br />
</span></p>
<p style="padding-left: 30px;"><span> steps: 2,<br />
</span></p>
<p style="padding-left: 30px;"><span> depth: 2,<br />
</span></p>
<p style="padding-left: 30px;"><span> bevelEnabled: true,<br />
</span></p>
<p style="padding-left: 30px;"><span> bevelThickness: 0.1,<br />
</span></p>
<p style="padding-left: 30px;"><span> bevelSize: 0.2,<br />
</span></p>
<p style="padding-left: 30px;"><span> bevelSegments: 3<br />
</span></p>
<p><span>};<br />
</span></p>
<p><span>// Создаем геометрию с помощью экструдирования<br />
</span></p>
<p><span>const geometry = new THREE.ExtrudeBufferGeometry(shape, extrudeSettings);<br />
</span></p>
<p><span>// Создаем материал<br />
</span></p>
<p><span>const material = new THREE.MeshNormalMaterial({wireframe: false});<br />
</span></p>
<p><span>// Создаем меш и добавляем его на сцену<br />
</span></p>
<p><span>const mesh = new THREE.Mesh(geometry, material);<br />
</span></p>
<p><span>scene.add(mesh);<br />
</span></p>
<p><span>// Располагаем камеру<br />
</span></p>
<p><span>camera.position.z = 5;<br />
</span></p>
<p><span>// Анимационный цикл<br />
</span></p>
<p><span>function animate() {<br />
</span></p>
<p style="padding-left: 30px;"><span> requestAnimationFrame(animate);<br />
</span></p>
<p style="padding-left: 30px;"><span> mesh.rotation.x += 0.01;<br />
</span></p>
<p style="padding-left: 30px;"><span> mesh.rotation.y += 0.01;<br />
</span></p>
<p style="padding-left: 30px;"><span> renderer.render(scene, camera);<br />
</span></p>
<p><span>}<br />
</span></p>
<p><span>animate();<br />
</span></p>
<p><span>&#8220;<br />
</span></p>
<p><span><strong>Заключение<br />
</strong></span></p>
<p><span>Метод экструдирования с помощью Three.js позволяет быстро создавать сложные трехмерные фигуры из простых двумерных контуров. Его преимущества включают гибкость настройки параметров, возможность моделирования различных форм и интеграцию в веб-приложения. Однако при работе с экструдированными объектами важно учитывать ограничения по сложности геометрии и производительности браузера. Правильный подбор параметров и формы профиля обеспечивает получение качественных и реалистичных моделей</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011426_1431_2.png" alt="" /></p>
<p style="text-align: center;"><span style="color: #5b9bd5;"><strong><span>Рисунок 2. Пример кода с экструдированием</span><span><br />
</span></strong></span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011426_1431_3.png" alt="" /></p>
<p style="text-align: center;"><span style="color: #5b9bd5;"><strong>Рисунок 3</strong></span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/01/104085/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drag and Drop в 3D: перетаскивание трехмерных геометрических фигур в веб-приложении</title>
		<link>https://web.snauka.ru/issues/2026/01/104100</link>
		<comments>https://web.snauka.ru/issues/2026/01/104100#comments</comments>
		<pubDate>Mon, 05 Jan 2026 05:49:59 +0000</pubDate>
		<dc:creator>Яковлев Юлиан Юрьевич</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-графика]]></category>
		<category><![CDATA[drag-and-drop]]></category>
		<category><![CDATA[Ray Casting]]></category>
		<category><![CDATA[rendering]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[интерактивность]]></category>
		<category><![CDATA[компьютерная графика]]></category>
		<category><![CDATA[матричные преобразования]]></category>
		<category><![CDATA[обработка событий]]></category>
		<category><![CDATA[преобразование координат]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/01/104100</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович Уфимский университет науки и технологий Нефтекамский филиал Кандидат физико-математических наук, доцент Интерактивность является ключевым аспектом современных графических приложений. Возможность напрямую манипулировать объектами в трехмерном пространстве значительно улучшает пользовательский опыт. В контексте учебных лабораторных работ по компьютерной графике добавление функциональности перетаскивания к базовым 3D-фигурам позволяет студентам глубже понять принципы работы с [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>Уфимский университет науки и технологий Нефтекамский филиал<br />
</em><em>Кандидат физико-математических наук, доцент</em></p>
<p style="text-align: justify;"><span>Интерактивность является ключевым аспектом современных графических приложений. Возможность напрямую манипулировать объектами в трехмерном пространстве значительно улучшает пользовательский опыт. В контексте учебных лабораторных работ по компьютерной графике добавление функциональности перетаскивания к базовым 3D-фигурам позволяет студентам глубже понять принципы работы с трехмерными сценами и взаимодействия пользователя с графическими системами.<br />
</span></p>
<p style="text-align: justify;"><span>Основная сложность реализации Drag and Drop в 3D заключается в преобразовании координат из двумерного пространства экрана в трехмерное пространство сцены. Для этого используется техника Ray Casting:<br />
</span></p>
<ol style="margin-left: 53pt;">
<li>
<div style="text-align: justify;"><span>Преобразование координат мыши в нормализованные координаты устройства (-1 до 1);<br />
</span></div>
</li>
<li>
<div style="text-align: justify;"><span>Создание луча из камеры через точку на экране;<br />
</span></div>
</li>
<li>
<div style="text-align: justify;"><span>Определение пересечения луча с объектами сцены:<br />
</span></div>
</li>
</ol>
<p style="text-align: justify;"><span>Ключевые матрицы для преобразований:<br />
</span></p>
<ul style="margin-left: 42pt;">
<li>
<div style="text-align: justify;"><span>Матрица проекции (projectionMatrix);<br />
</span></div>
</li>
<li>
<div style="text-align: justify;"><span>Матрица вида (viewMatrix);<br />
</span></div>
</li>
<li>
<div style="text-align: justify;"><span>Мировая матрица объекта (modelMatrix).<br />
</span></div>
</li>
</ul>
<p style="text-align: justify;"><span>Система состоит из трех основных компонентов:<br />
</span></p>
<ol style="margin-left: 53pt;">
<li>
<div style="text-align: justify;"><span>Менеджер объектов - хранит информацию о всех фигурах в сцене;<br />
</span></div>
</li>
<li>
<div style="text-align: justify;"><span>Обработчик событий - управляет вводом пользователя;<br />
</span></div>
</li>
<li>
<div style="text-align: justify;"><span>Система выбора объектов - определяет, какой объект выбран.<br />
</span></div>
</li>
</ol>
<p style="text-align: justify;"><span>Создадим восемь различных 3D-геометрических объектов с помощью библиотеки Three.js и добавим их в сцену – сферу, призму, пирамиду, цилиндры и т.д. (рисунок 1):<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop1.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 1. Демонстрация Drag and Drop в WebGL<br />
</span></p>
<p style="text-align: justify;"><span>Объявим массив dragObjects, который будет использоваться для хранения объектов, которые пользователь хочет сделать интерактивными:<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop2.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span>Все объекты добавляются в массив dragObjects для поддержки функционала перетаскивания мышью.<br />
</span></p>
<p style="text-align: justify;"><span>Ниже приведены фрагменты кода:<br />
</span></p>
<p style="text-align: justify;"><span> 1. Сфера<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop3.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 2. Цилиндр<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop4.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 3. Куб<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop5.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 4. Пирамида<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop6.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 5. Конус<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop7.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 6. Призма (треугольная)<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop8.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 7. Кубоид (прямоугольный параллелепипед)<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop9.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span> 8. 6-угольная призма:<br />
</span></p>
<p style="text-align: justify;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011626_0546_DragandDrop10.png" alt="" /><span><br />
</span></p>
<p style="text-align: justify;"><span>Теперь фигуры можно перетаскивать мышью (рисунок 1).<br />
</span></p>
<p style="text-align: center;"><span><strong>Заключение<br />
</strong></span></p>
<p style="text-align: justify;"><span>Реализация механизма Drag and Drop для 3D-фигур значительно расширяет возможности интерактивного взаимодействия с графическими сценами. Представленный подход позволяет интегрировать функциональность перетаскивания в существующие лабораторные работы по компьютерной графике без значительной переработки кода. Разработанное решение демонстрирует практическое применение математических основ компьютерной графики и может служить базой для более сложных интерактивных систем.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/01/104100/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание фигуры с помощью вращения и Three.js</title>
		<link>https://web.snauka.ru/issues/2026/01/104086</link>
		<comments>https://web.snauka.ru/issues/2026/01/104086#comments</comments>
		<pubDate>Wed, 14 Jan 2026 14:50:10 +0000</pubDate>
		<dc:creator>Мухаяров Дильназ Данисович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-графика]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[вращение]]></category>
		<category><![CDATA[программирование на JavaScript]]></category>
		<category><![CDATA[трехмерное моделирование]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/01/104086</guid>
		<description><![CDATA[Создание сложных трехмерных фигур является одной из фундаментальных задач в области компьютерной графики и веб-разработки. Библиотека Three.js предоставляет инструменты для моделирования и визуализации объектов в браузере. Одним из эффективных методов моделирования является вращение — процесс вращения двумерных профилей вокруг оси для получения объемных фигур. В данной статье рассматривается применение метода вращения в Three.js, его основные [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Создание сложных трехмерных фигур является одной из фундаментальных задач в области компьютерной графики и веб-разработки. Библиотека Three.js предоставляет инструменты для моделирования и визуализации объектов в браузере. Одним из эффективных методов моделирования является вращение — процесс вращения двумерных профилей вокруг оси для получения объемных фигур. В данной статье рассматривается применение метода вращения в Three.js, его основные параметры, особенности реализации и практические примеры.</p>
<p style="text-align: justify;"><span>Теоретические основы метода вращения в Three.js<br />
</span></p>
<p style="text-align: justify;"><span>Метод вращения основан на формировании трехмерной формы путем вращения двумерного контура или профиля вокруг оси (обычно оси Y). В библиотеке Three.js для этого используется класс `LatheBufferGeometry`, который принимает массив точек профиля и параметры вращения. Основные параметры включают:<br />
</span></p>
<p style="text-align: justify;"><span>- `segments`: число сегментов по окружности, определяющее гладкость поверхности,<br />
</span></p>
<p style="text-align: justify;"><span>- `phiStart` и `phiLength`: начальный угол и длина сектора вращения,<br />
</span></p>
<p style="text-align: justify;"><span>- `points`: массив точек профиля, задающих форму.<br />
</span></p>
<p style="text-align: justify;"><span>Процесс моделирования включает создание массива точек, определяющих профиль, и последующее вращение этого профиля вокруг оси для формирования объемной модели.<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011426_1447_1.png" alt="" /></p>
<p style="text-align: center;"><span style="color: #5b9bd5;"><strong>Рисунок 1<br />
</strong></span></p>
<p style="text-align: justify;"><span>Пример реализации на JavaScript<br />
</span></p>
<p style="text-align: justify;"><span>&#8220;`javascript<br />
</span></p>
<p style="text-align: justify;"><span>// Создаем сцену, камеру и рендерер<br />
</span></p>
<p style="text-align: justify;"><span>const scene = new THREE.Scene();<br />
</span></p>
<p style="text-align: justify;"><span>const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);<br />
</span></p>
<p style="text-align: justify;"><span>const renderer = new THREE.WebGLRenderer();<br />
</span></p>
<p style="text-align: justify;"><span>renderer.setSize(window.innerWidth, window.innerHeight);<br />
</span></p>
<p style="text-align: justify;"><span>document.body.appendChild(renderer.domElement);<br />
</span></p>
<p style="text-align: justify;"><span>// Определяем профиль с помощью массива точек<br />
</span></p>
<p style="text-align: justify;"><span>const points = [];<br />
</span></p>
<p style="text-align: justify;"><span>points.push(new THREE.Vector2(0, 0));<br />
</span></p>
<p style="text-align: justify;"><span>points.push(new THREE.Vector2(1, 0));<br />
</span></p>
<p style="text-align: justify;"><span>points.push(new THREE.Vector2(1.5, 1));<br />
</span></p>
<p style="text-align: justify;"><span>points.push(new THREE.Vector2(1, 2));<br />
</span></p>
<p style="text-align: justify;"><span>points.push(new THREE.Vector2(0, 2));<br />
</span></p>
<p style="text-align: justify;"><span>// Создаем геометрию вращением<br />
</span></p>
<p style="text-align: justify;"><span>const geometry = new THREE.LatheBufferGeometry(points, 32, 0, Math.PI * 2);<br />
</span></p>
<p style="text-align: justify;"><span>// Создаем материал<br />
</span></p>
<p style="text-align: justify;"><span>const material = new THREE.MeshNormalMaterial({wireframe: false});<br />
</span></p>
<p style="text-align: justify;"><span>// Создаем меш и добавляем на сцену<br />
</span></p>
<p style="text-align: justify;"><span>const mesh = new THREE.Mesh(geometry, material);<br />
</span></p>
<p style="text-align: justify;"><span>scene.add(mesh);<br />
</span></p>
<p style="text-align: justify;"><span>// Располагаем камеру<br />
</span></p>
<p style="text-align: justify;"><span>camera.position.z = 5;<br />
</span></p>
<p style="text-align: justify;"><span>// Анимационный цикл<br />
</span></p>
<p style="text-align: justify;"><span>function animate() {<br />
</span></p>
<p style="text-align: justify; padding-left: 30px;"><span> requestAnimationFrame(animate);<br />
</span></p>
<p style="text-align: justify; padding-left: 30px;"><span> mesh.rotation.y += 0.01;<br />
</span></p>
<p style="text-align: justify; padding-left: 30px;"><span> renderer.render(scene, camera);<br />
</span></p>
<p style="text-align: justify;"><span>}<br />
</span></p>
<p style="text-align: justify;"><span>animate();<br />
</span></p>
<p style="text-align: justify;"><span>&#8220;`<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/01/011426_1447_2.png" alt="" /></p>
<p style="text-align: center;"><span style="color: #5b9bd5;"><strong><span>Рисунок 2</span><span><br />
</span></strong></span></p>
<p style="text-align: justify;"><span><strong>Заключение<br />
</strong></span></p>
<p style="text-align: justify;"><span>Метод вращения с помощью `LatheBufferGeometry` в Three.js позволяет создавать разнообразные объемные фигуры из простых профилей. Его преимущество — возможность моделирования сложных форм с минимальными усилиями и высокой гибкостью. Однако при работе важно правильно подбирать профиль и параметры сегментов для достижения желаемого качества поверхности. Использование метода вращения широко применяется в моделировании предметов, техники, ювелирных изделий и архитектурных элементов.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/01/104086/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Парсинг погоды и визуализация данных с использованием WebGL</title>
		<link>https://web.snauka.ru/issues/2026/01/104166</link>
		<comments>https://web.snauka.ru/issues/2026/01/104166#comments</comments>
		<pubDate>Sat, 31 Jan 2026 08:46:30 +0000</pubDate>
		<dc:creator>Гильмутдинов Айдар Илгизович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-графика]]></category>
		<category><![CDATA[API погоды]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[визуализация данных]]></category>
		<category><![CDATA[оптимизация рендеринга]]></category>
		<category><![CDATA[парсинг погоды]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/01/104166</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение WebGL — это мощный инструмент для создания 3D-графики прямо в браузере, позволяющий задействовать ресурсы графического адаптера и разгрузить процессор . Визуализация погодных данных, таких как температура, давление или осадки, требует не только точности, но и интерактивности. Например, Яндекс.Погода использует WebGL для отображения сложных анимаций, таких как [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p><span><strong> Введение<br />
</strong></span></p>
<p><span>WebGL — это мощный инструмент для создания 3D-графики прямо в браузере, позволяющий задействовать ресурсы графического адаптера и разгрузить процессор . Визуализация погодных данных, таких как температура, давление или осадки, требует не только точности, но и интерактивности. Например, Яндекс.Погода использует WebGL для отображения сложных анимаций, таких как движение облаков или эффекты дождя . Современные требования к веб-приложениям включают поддержку мобильных устройств, кросс-платформенность и высокую производительность, что делает WebGL идеальным выбором для таких задач.</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/02/020326_0852_1.jpg" alt="" /></p>
<p style="text-align: center;">Рисунок 1. Скриншот интерфейса с 3D-анимацией облаков<span><br />
</span></p>
<p><span><strong>Парсинг данных<br />
</strong></span></p>
<p><span>Для начала необходимо извлечь данные из погодного API (например, OpenWeatherMap). Запросы отправляются через JavaScript с использованием <strong>fetch</strong> или <strong>XMLHttpRequest</strong>. Ответ обычно приходит в формате JSON, содержащем информацию о температуре, скорости ветра, облачности и других параметрах.<br />
</span></p>
<p><span>Пример JSON-ответа:<br />
</span></p>
<p><span>json<br />
</span></p>
<p><span>{<br />
</span></p>
<p style="padding-left: 30px;"><span> &#8220;temperature&#8221;: 20,<br />
</span></p>
<p style="padding-left: 30px;"><span> &#8220;humidity&#8221;: 60,<br />
</span></p>
<p style="padding-left: 30px;"><span> &#8220;wind_speed&#8221;: 5,<br />
</span></p>
<p style="padding-left: 30px;"><span> &#8220;cloudiness&#8221;: 80<br />
</span></p>
<p><span>}<br />
</span></p>
<p><span><br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/02/020326_0852_2.jpg" alt="" /></p>
<p style="text-align: center;">Рисунок 2. Диаграмма, показывающая структуру JSON-ответа от API погоды<span><br />
</span></p>
<p><span><strong>Работа с ошибками API<br />
</strong></span></p>
<p><span>При парсинге данных важно учитывать возможные ошибки, такие как превышение лимита запросов или недоступность сервера. Для этого рекомендуется использовать механизмы повторных попыток и кэширования данных. Например, можно сохранять последние успешные ответы в <strong>localStorage</strong> и отображать их, если API временно недоступен .<br />
</span></p>
<p><span><strong>Геолокационные данные<br />
</strong></span></p>
<p><span>Для автоматического определения местоположения пользователя можно использовать Geolocation API. Это позволяет отображать погоду без необходимости ручного ввода города. Пример кода:<br />
</span></p>
<p><span>javascript<br />
</span></p>
<p><span>navigator.geolocation.getCurrentPosition(position =&gt; {<br />
</span></p>
<p style="padding-left: 30px;"><span> const { latitude, longitude } = position.coords;<br />
</span></p>
<p style="padding-left: 30px;"><span> fetch(`https://api.weatherapi.com/v1/current.json?key=YOUR_KEY&amp;q= ${latitude},${longitude}`)<br />
</span></p>
<p style="padding-left: 30px;"><span> .then(response =&gt; response.json())<br />
</span></p>
<p style="padding-left: 30px;"><span> .then(data =&gt; console.log(data));<br />
</span></p>
<p><span>});</span></p>
<p><strong>Подготовка данных для WebGL</strong></p>
<p><span>Полученные данные нужно преобразовать в визуальные элементы. Например:<br />
</span></p>
<ul>
<li><span>Температура : Цветовая палитра от синего (холодно) до красного (жарко).<br />
</span></li>
<li><span>Облака : Трехмерные полигоны с текстурами.<br />
</span></li>
<li><span>Дождь : Анимированные частицы.<br />
</span></li>
</ul>
<p><span>Для работы с данными в WebGL используются буферы и атрибуты, которые загружаются в графический процессор .<br />
</span></p>
<p><span><strong>Преобразование данных в 3D-объекты<br />
</strong></span></p>
<p><span>Каждый параметр погоды может быть представлен в виде геометрии. Например, температура может отображаться как цветовая карта на поверхности земного шара, а ветер — как движение частиц в направлении его направления. Для этого используются вершинные шейдеры, где координаты вершин изменяются в зависимости от данных.</span></p>
<p style="background: white; text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2026/02/020326_0852_4.jpg" alt="" /></p>
<p style="background: white; text-align: center;">Рисунок 3. 3D-сцена с облаками, температурными градиентами и анимацией ветра<span><br />
</span></p>
<p><span><strong>Создание 3D-сцены<br />
</strong></span></p>
<p><span>Сцена строится с помощью WebGL API или библиотек, таких как Three.js. Основные шаги:<br />
</span></p>
<ol>
<li><span>Инициализация контекста WebGL.<br />
</span></li>
<li><span>Создание вершинного и фрагментного шейдеров для управления геометрией и цветом .<br />
</span></li>
<li><span>Настройка камеры и источников света.<br />
</span></li>
<li><span>Добавление объектов (облака, температурные градиенты).<br />
</span></li>
</ol>
<p><span><strong>Пример кода Three.js<br />
</strong></span></p>
<p><span>javascript<br />
</span></p>
<p><span>const scene = new THREE.Scene();<br />
</span></p>
<p><span>const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);<br />
</span></p>
<p><span>const renderer = new THREE.WebGLRenderer();<br />
</span></p>
<p><span>renderer.setSize(window.innerWidth, window.innerHeight);<br />
</span></p>
<p><span>document.body.appendChild(renderer.domElement);<br />
</span></p>
<p><span>// Добавление облака<br />
</span></p>
<p><span>const cloudGeometry = new THREE.SphereGeometry(5, 32, 32);<br />
</span></p>
<p><span>const cloudMaterial = new THREE.MeshBasicMaterial({ map: new THREE.TextureLoader().load(&#8216;cloud.png&#8217;) });<br />
</span></p>
<p><span>const cloud = new THREE.Mesh(cloudGeometry, cloudMaterial);<br />
</span></p>
<p><span>scene.add(cloud);<br />
</span></p>
<p><span>camera.position.z = 10;<br />
</span></p>
<p><span>function animate() {<br />
</span></p>
<p style="padding-left: 30px;"><span> requestAnimationFrame(animate);<br />
</span></p>
<p style="padding-left: 30px;"><span> cloud.rotation.y += 0.01; // Анимация облака<br />
</span></p>
<p style="padding-left: 30px;"><span> renderer.render(scene, camera);<br />
</span></p>
<p><span>}<br />
</span></p>
<p><span>animate();</span></p>
<p><span><strong>Анимация и взаимодействие<br />
</strong></span></p>
<p><span>Для динамического отображения погоды используются шейдеры. Например, в фрагментном шейдере можно реализовать эффект дождя, изменяя координаты частиц в реальном времени. Взаимодействие пользователя (например, вращение сцены мышью) реализуется через обработчики событий.<br />
</span></p>
<p><span><strong>5.1 Шейдер для дождя<br />
</strong></span></p>
<p><span>glsl<br />
</span></p>
<p><span>// Фрагментный шейдер<br />
</span></p>
<p><span>precision mediump float;<br />
</span></p>
<p><span>uniform float u_time;<br />
</span></p>
<p><span>void main() {<br />
</span></p>
<p style="padding-left: 30px;"><span> vec2 uv = gl_FragCoord.xy / vec2(800.0, 600.0);<br />
</span></p>
<p style="padding-left: 30px;"><span> float rain = sin(uv.x * 100.0 + u_time * 10.0) * 0.5 + 0.5;<br />
</span></p>
<p style="padding-left: 30px;"><span> gl_FragColor = vec4(vec3(rain), 1.0);<br />
</span></p>
<p><span>}<br />
</span></p>
<p><span><br />
</span></p>
<p style="background: white; text-align: center;"><img class="aligncenter" src="https://web.snauka.ru/wp-content/uploads/2026/02/020326_0852_6.jpg" alt="" />Рисунок 4. Анимация дождевых частиц, управляемых шейдерами<span><br />
</span></p>
<p><span><strong>Оптимизация производительности<br />
</strong></span></p>
<p><span>WebGL позволяет оптимизировать рендеринг за счет:<br />
</span></p>
<ul>
<li><span>Минимизации количества вызовов WebGL API.<br />
</span></li>
<li><span>Использования буферов для хранения данных на GPU .<br />
</span></li>
<li><span>Упрощения шейдеров для мобильных устройств.<br />
</span></li>
</ul>
<p><span><strong>Кэширование данных<br />
</strong></span></p>
<p><span>Для уменьшения нагрузки на сеть данные можно кэшировать на стороне клиента. Например, сохранять результаты запросов в IndexedDB и обновлять их только при изменении погодных условий. Это особенно важно для мобильных пользователей с ограниченным трафиком.<br />
</span></p>
<p><span><strong>Интеграция с картами<br />
</strong></span></p>
<p><span>Для улучшения восприятия данных можно интегрировать 3D-сцену с картами (например, Google Maps или Mapbox). Это позволяет отображать погоду в контексте географического положения. Например, облачность может показываться как слой над картой, а ветер — как стрелки на поверхности земли.<br />
</span></p>
<p><span><strong>Заключение<br />
</strong></span></p>
<p><span>WebGL открывает широкие возможности для визуализации погодных данных, превращая сухие цифры в интерактивные 3D-сцены. Использование шейдеров, библиотек вроде Three.js и оптимизация через GPU гарантирует высокую производительность даже на слабых устройствах. Дополнительные элементы, такие как геолокация и интеграция с картами, делают приложения еще более полезными для пользователей.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/01/104166/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание трехмерных фигур с помощью WebGL</title>
		<link>https://web.snauka.ru/issues/2026/03/104338</link>
		<comments>https://web.snauka.ru/issues/2026/03/104338#comments</comments>
		<pubDate>Wed, 18 Mar 2026 10:42:28 +0000</pubDate>
		<dc:creator>Жеребцова Ксения Владимировна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-графика]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[браузер]]></category>
		<category><![CDATA[визуализация]]></category>
		<category><![CDATA[геометрические фигуры]]></category>
		<category><![CDATA[интерактивность]]></category>
		<category><![CDATA[конус]]></category>
		<category><![CDATA[призма]]></category>
		<category><![CDATA[цилиндр]]></category>
		<category><![CDATA[шейдеры]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/03/104338</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал WebGL – это программная библиотека для JavaScript, которая позволяет создавать 3D графику, функционирующую в браузерах. Данная библиотека основана на архитектуре OpenGL. WebGL использует язык программирования шейдеров GLSL, имеющий C-подобный синтаксис. Особенность WebGL заключается в том, что код моделируется непосредственно в браузере с использованием элемента [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right">Научный руководитель: <em>Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p>WebGL – это программная библиотека для JavaScript, которая позволяет создавать 3D графику, функционирующую в браузерах. Данная библиотека основана на архитектуре OpenGL. WebGL использует язык программирования шейдеров GLSL, имеющий C-подобный синтаксис. Особенность WebGL заключается в том, что код моделируется непосредственно в браузере с использованием элемента canvas, введенного в HTML5.</p>
<p>Работа с WebGL и шейдерами в частности — довольно трудоемкий процесс, требующий описания каждой точки, линии и грани. Для визуализации необходимо прописывать объемные фрагменты кода. Чтобы ускорить разработку, была создана библиотека Three.js, которая представляет собой набор готовых классов для создания и отображения интерактивной 3D графики. Three.js для WebGL — это как jQuery для JavaScript: библиотека предлагает декларативный синтаксис и абстрагирует разработчика от сложностей, связанных с 3D в браузере.</p>
<p>Для создания сцены с геометрическими фигурами мы использовали современный подход с импортом модулей:</p>
<p><em>javascript</em></p>
<p><em>import * as THREE from &#8216;three&#8217;;</em></p>
<p><em>import { OrbitControls } from &#8216;three/addons/controls/OrbitControls.js&#8217;;</em></p>
<p><em> </em></p>
<p>Такой способ подключения (с использованием import maps) является более чистым и предпочтительным в современных веб-приложениях.</p>
<p>Инициализация сцены и основных компонентов</p>
<p>Первым шагом мы создаем сцену, камеру и рендерер:</p>
<p>javascript</p>
<p>const container = document.createElement(&#8216;div&#8217;);</p>
<p>document.body.appendChild(container);</p>
<p>&nbsp;</p>
<p>camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 5000);</p>
<p>camera.position.set(300, 500, 1200);</p>
<p>&nbsp;</p>
<p>renderer = new THREE.WebGLRenderer({ antialias: true });</p>
<p>renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p>container.appendChild(renderer.domElement);</p>
<p>Камера установлена на оптимальном расстоянии (1200 единиц), чтобы хорошо видеть оба ряда фигур. Параметр antialias включает сглаживание для более плавных краев объектов.</p>
<p><strong>Освещение сцены</strong></p>
<p>Для корректного отображения цветов и теней мы добавили два типа освещения:</p>
<p><em>javascript</em></p>
<p><em>ambientLight = new THREE.AmbientLight(0&#215;404040, 2.0);</em></p>
<p><em>light = new THREE.DirectionalLight(0xffffff, 1.5);</em></p>
<p><em>light.position.set(1, 2, 1);</em></p>
<p>Фоновый свет (AmbientLight) обеспечивает базовое освещение всех поверхностей, а направленный свет (DirectionalLight) создает объем и подчеркивает форму объектов.</p>
<p><strong>Управление камерой</strong></p>
<p>Для интерактивного взаимодействия с пользователем подключены контроллеры OrbitControls, позволяющие вращать камеру вокруг сцены, приближать и отдалять изображение:</p>
<p><em>javascript</em></p>
<p><em>controls = new OrbitControls(camera, renderer.domElement);</em></p>
<p><em>controls.rotateSpeed = 0.5;</em></p>
<p><em>controls.enableZoom = true;</em></p>
<p><em>controls.minDistance = 300;</em></p>
<p><em>controls.maxDistance = 2000;</em></p>
<p><em>controls.enableDamping = true;</em></p>
<p><strong>Размещение фигур в пространстве</strong></p>
<p>Для организации фигур мы использовали Декартову систему координат и расположили объекты в два ряда. Каждая фигура имеет свои координаты position.set(x, y, z):</p>
<p><em>javascript</em></p>
<p><em>// Параметры расположения</em></p>
<p><em>const spacingX = 300;       // расстояние между фигурами по X</em></p>
<p><em>const startX = -450;        // начальная координата X</em></p>
<p><em>const row1Z = -200;         // координата Z для первого ряда (задний)</em></p>
<p><em>const row2Z = 200;          // координата Z для второго ряда (передний)</em></p>
<p><strong>Создание геометрических фигур</strong></p>
<p>В нашей сцене представлены различные типы геометрических тел, созданные с помощью встроенных классов Three.js:</p>
<p><strong>1. </strong><strong>Прямоугольник (BoxGeometry)</strong></p>
<p><em>javascript</em></p>
<p><em>const geomBox = new THREE.BoxGeometry(300, 200, 220);</em></p>
<p><em>const box = new THREE.Mesh(geomBox, new THREE.MeshPhongMaterial({ color: 0xFFFF00 }));</em></p>
<p><strong>2. Цилиндры и призмы (CylinderGeometry)</strong></p>
<p>Класс CylinderGeometry универсален и позволяет создавать различные фигуры путем изменения параметров:</p>
<ul>
<li>Цилиндр (равные радиусы сверху и снизу, много сегментов)</li>
<li>Треугольная призма (равные радиусы, 3 сегмента)</li>
<li>Пятиугольная и шестиугольная призмы (равные радиусы, 5 и 6 сегментов)</li>
</ul>
<p><strong>3. Пирамиды и конусы</strong></p>
<p>Установка верхнего радиуса в 0 превращает цилиндр в пирамиду или конус:</p>
<ul>
<li>Четырехугольная пирамида (верхний радиус 0, 4 сегмента)</li>
<li>Шестиугольная пирамида (верхний радиус 0, 6 сегментов)</li>
<li>Конус (верхний радиус 0, много сегментов для гладкости)</li>
</ul>
<p><strong>Цветовое оформление</strong></p>
<p>Для каждой фигуры подобран индивидуальный цвет, делающий композицию яркой и наглядной:</p>
<ul>
<li>Желтый прямоугольник (0xFFFF00)</li>
<li>Синий цилиндр (0x0000FF)</li>
<li>Красная треугольная призма (0xFF0000)</li>
<li>Зеленая шестиугольная пирамида (0x00FF00)</li>
<li>Голубая пятиугольная призма (0x87CEEB)</li>
<li>Салатовая четырехугольная пирамида (0x90EE90)</li>
<li>Розовая шестиугольная призма (0xFFC0CB)</li>
<li>Золотой конус (0xFFD700)</li>
</ul>
<p><strong>Визуализация и анимация</strong></p>
<p>Для непрерывной отрисовки сцены используется цикл анимации:</p>
<p><em>javascript</em></p>
<p><em>function animate() {</em></p>
<p style="padding-left: 30px;"><em>    requestAnimationFrame(animate);</em></p>
<p style="padding-left: 30px;"><em>    controls.update();</em></p>
<p style="padding-left: 30px;"><em>    render();</em></p>
<p><em>}</em></p>
<p><em> </em></p>
<p><em>function render() {</em></p>
<p style="padding-left: 30px;"><em>    renderer.render(scene, camera);</em></p>
<p><em>}</em></p>
<p>Обработчик изменения размера окна обеспечивает корректное масштабирование сцены:</p>
<p><em>javascript</em></p>
<p><em>window.addEventListener(&#8216;resize&#8217;, onWindowResize, false);</em></p>
<p><strong>Результат</strong></p>
<p>В результате выполнения кода мы получаем интерактивную 3D-сцену с двумя рядами геометрических фигур (всего 8 объектов), расположенных на сером фоне со вспомогательной сеткой. Пользователь может свободно вращать камеру, приближать и рассматривать каждую фигуру с разных ракурсов, что делает данное решение отличным демонстрационным материалом для изучения возможностей Three.js и WebGL.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-104339" title="ris1" src="https://web.snauka.ru/wp-content/uploads/2026/03/ris11.png" alt="" width="643" height="293" /></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/03/104338/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
