<?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; three.js</title>
	<atom:link href="http://web.snauka.ru/issues/tag/three-js/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>Применение технологии WebGL для создания трехмерных моделей</title>
		<link>https://web.snauka.ru/issues/2017/12/85166</link>
		<comments>https://web.snauka.ru/issues/2017/12/85166#comments</comments>
		<pubDate>Tue, 05 Dec 2017 10:17:27 +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[браузер]]></category>
		<category><![CDATA[код]]></category>
		<category><![CDATA[куб]]></category>
		<category><![CDATA[модель]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2017/12/85166</guid>
		<description><![CDATA[Современные веб-технологии позволяют размещать на страницах веб-ресурсов не только статичную графику, различные варианты анимации, но и трехмерные изображения. Программная библиотека для языка программирования JavaScript Web-based Graphics Library (WebGL) позволяет реализовать элементы 3D-графики на веб-страницах[5]. Одним из главных преимуществ WebGL является построение 3D-элементов непосредственно как веб-страницы, что не требует установки дополнительных расширений или подключения дополнительных библиотек со стороны [...]]]></description>
			<content:encoded><![CDATA[<p>Современные веб-технологии позволяют размещать на страницах веб-ресурсов не только статичную графику, различные варианты анимации, но и трехмерные изображения.</p>
<p>Программная библиотека для языка программирования JavaScript Web-based Graphics Library (WebGL) позволяет реализовать элементы 3D-графики на веб-страницах[5].</p>
<p>Одним из главных преимуществ WebGL является построение 3D-элементов непосредственно как веб-страницы, что не требует установки дополнительных расширений или подключения дополнительных библиотек со стороны пользователя. Это позволяет WebGL программам благополучно исполняться практически на любом устройстве пользователя (и на стационарных компьютерах, и планшетных компьютерах, на смартфонах, и игровых консолях…).</p>
<p>Однако, технология WebGL использует низкоуровневый набор методов для создания приложений. Это, с одной стороны,способствует внедрению технологии разработчиками браузеров в свои продукты, но создает большие трудности при создании интерфейсов.</p>
<p>При разработке WebGL приложений часто используется кроссбраузерная библиотека three.j, применяемая для создания и отображения анимированных трехмерных изображений.</p>
<p>Перед тем как приступить к созданию 3D объекта с использованием библиотек желательно, для удобства работы, установить на свой компьютер программу для создания и редактирования кода web-страницы и программу, которая создаст сервер, для того, чтобы после сохранения объект можно было просмотреть в браузере. Например, в первом случае можно использовать VisualStudioCode для создания и редактирования исходного кода[6], а для создания веб-сервера – Сaddy[7].</p>
<p>Далее для последующей работы необходимо скачать библиотеку three.js[8].После чего можно приступать к написанию кода. Для того, чтобы функции библиотеки вступили в силу необходимо в html-коде прописать путь к ней:&lt;scriptsrc=&#8221;libs/three.min.js&#8221;&gt;&lt;/script&gt;.</p>
<p>Рассмотрим возможности технологии WebGLна примере создания куба.</p>
<p>Для того,чтобы создать WebGL приложение, содержащее трехмерное изображение, необходимо:</p>
<p>1) определить область вывода изображения, в котором оно будет отображаться:</p>
<p>camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 ); // создание камеры</p>
<p>camera.position.z = 400; //выбор положения</p>
<div style="display: inline !important;">2) задать параметры оформления 3D-объекта:</div>
<p>var texture = new THREE.TextureLoader().load( &#8216;textures/cube.jpg&#8217; ); //добавление текстуры</p>
<p>var geometry = new THREE.BoxBufferGeometry( 200, 200, 200 ); //определение размера куба</p>
<p>var material = new THREE.MeshBasicMaterial( { map: texture } ); //определение материала состоящего из текстуры</p>
<p>В данном случае «cube.jpg<strong>» </strong>- это картинка, выбранная заранее.</p>
<div style="display: inline !important;">3) выполнить отрисовку, для наложения текстуры на объект:</div>
<p>renderer = newTHREE.WebGLRenderer(); // Настройка среды рендеринга в среду WebGL</p>
<p>renderer.setPixelRatio(window.devicePixelRatio ); //задание геометрии пикселей на устройстве отображения</p>
<p>renderer.setSize(window.innerWidth, window.innerHeight ); //определение границ области рендринга</p>
<p>document.body.appendChild(renderer.domElement );</p>
<p>Для того, чтобы объект можно было вращать и просматривать его со всех сторон при написании кода были использованы функции:</p>
<ul>
<li>
<div>startRotateCube– обработка события нажатия на левую кнопку мыши;</div>
</li>
<li>
<div>endRotatingCube – обработка события отпускания левой кнопки мыши;</div>
</li>
<li>
<div>rotateCube– процесс движения курсора мыши</div>
</li>
</ul>
<p>После чего, созданный код необходимо сохранить как html-файл. Созданный файл можно просмотреть в браузере (рис.1).</p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2017/12/121817_1542_1.png" alt="" /></p>
<p style="text-align: center;">Рис.1. Отображение 3D-объекта в браузере Google Chrome</p>
<p>Данный пример показывает, как много манипуляций потребовалось по скачиванию и установке тех или иных файлов, чтобы приступить к работе. Так же, само написание кода объекта требует определенных навыков в программировании. Сам текст кода довольно объемный для такого простого объекта (для этого проекта общее количество строк кода составило 122). А значит, можно сделать вывод, на сколько трудно будет создавать более сложные объекты, используя технологиюWebGL.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2017/12/85166/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Применение технологии Blend4Web для создания трехмерных моделей</title>
		<link>https://web.snauka.ru/issues/2017/12/85175</link>
		<comments>https://web.snauka.ru/issues/2017/12/85175#comments</comments>
		<pubDate>Wed, 20 Dec 2017 12:16:31 +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[браузер]]></category>
		<category><![CDATA[код]]></category>
		<category><![CDATA[куб]]></category>
		<category><![CDATA[модель]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2017/12/85175</guid>
		<description><![CDATA[Современные веб-технологии позволяют размещать на страницах веб-ресурсов не только статичную графику, различные варианты анимации, но и трехмерные изображения. Blend4Web предназначена для создания визуализаций, презентаций, интернет-магазинов, игр и других web-приложений. Данный фреймворк тесно связан с пакетом 3D моделирования и анимации Blender. Графический движок можно комбинировать со звуковой системой, физическим движком, системой, которая реализуетискусственный интеллект, сетевую систему, [...]]]></description>
			<content:encoded><![CDATA[<p>Современные веб-технологии позволяют размещать на страницах веб-ресурсов не только статичную графику, различные варианты анимации, но и трехмерные изображения.</p>
<p>Blend4Web предназначена для создания визуализаций, презентаций, интернет-магазинов, игр и других web-приложений.</p>
<p>Данный фреймворк тесно связан с пакетом 3D моделирования и анимации Blender.</p>
<p>Графический движок можно комбинировать со звуковой системой, физическим движком, системой, которая реализуетискусственный интеллект, сетевую систему, а также редактор сцен и логики, формируя интегрированный инструментарий для создания 3D приложений &#8211; трехмерный движок.</p>
<p>Blend4Web предлагает всю визуальную работу выполнять в Blender: настраивать сцену, создавать модели и расставлять их, управлять физикой или частицами.</p>
<p>Рассмотрим возможности технологии Blend4Web на примере создания куба.</p>
<p>Для того, чтобы создать Blend4Web приложение, содержащее трехмерное изображение, необходимо:</p>
<ol>
<li>
<div>Скачать Blend4Web с официального сайта [1] и выполнить установку на компьютер.</div>
</li>
<li>
<div>Выполнить настройку редактора Blender под технологию Blend4Web.</div>
</li>
<li>
<div>Затем Необходимо выбрать фигуру «Cube» во вкладке «Add Primitive» (Рис.1)</div>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2017/12/121817_1612_1.png" alt="" /></p>
<p style="text-align: center;">Рис.1 Выбор фигуры «Куб»</p>
</li>
<li>
<div>Далее необходимо выбрать материал куба, выполнить настройку отображения «Image Movie» и загрузить текстуру. В данном случае это заранее выбранная картинка «Cube.jpg» (Рис.2)</div>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2017/12/121817_1612_2.png" alt="" /></p>
<p style="text-align: center;">Рис.2 Выбор текстуры</p>
</li>
<li>
<div>После, нужно настроить освещение, чтобы куб можно было увидеть при экспорте в браузер. Выбрать во вкладке «Create» настройку «Sun». В окне предварительного просмотра можно наблюдать за процессом изменения создаваемого объекта (Рис.3)</div>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2017/12/121817_1612_3.png" alt="" /></p>
<p style="text-align: center;">Рис.3 Окно предварительного просмотра «Preview»</p>
</li>
<li>
<div>Для того, чтобы изображение можно было просматривать в браузере необходимо его экспортировать в html – файл.</div>
</li>
</ol>
<p>Созданный файл можно просмотреть и вращать в браузере без дополнительных настроек (рис.1).</p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2017/12/121817_1612_4.png" alt="" /></p>
<p style="text-align: center;">Рис.4. Отображение 3D-объекта в браузере GoogleChrome</p>
<p>Данный пример показывает, что использование Blend4Web для разработки трехмерных изображений довольно удобно пользователю, так как разработка происходит по большей части в графическом интерфейсе, нежели составлением громоздких кодов (например, как в WebGL). Максимально снижаются барьеры вхождения разработчиков в технологию WebGL и других менее используемых технологий основанных на составлении кода. Тем самым сокращается и время создания объекта.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2017/12/85175/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание 3D моделей с помощью технологии WebGL</title>
		<link>https://web.snauka.ru/issues/2023/11/101076</link>
		<comments>https://web.snauka.ru/issues/2023/11/101076#comments</comments>
		<pubDate>Wed, 01 Nov 2023 10:27:26 +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>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2023/11/101076</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Разработка трехмерных моделей с применением технологии WebGL представляет собой актуальное направление в современном веб-программировании, ориентированное на интеграцию высокопроизводительных трехмерных графических изображений в онлайн-среду без необходимости установки дополнительных плагинов. WebGL, или Web Graphics Library, является JavaScript API, предназначенным для рендеринга трехмерной графики в веб-браузерах. Ключевой [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><strong>Научный руководитель: </strong><strong><em>Вильданов Алмаз Нафкатович</em></strong></p>
<p style="background: white; text-align: center;"><span style="color: black;"><em>к.ф.-м.н., </em></span><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p style="text-align: justify;"><span>Разработка трехмерных моделей с применением технологии WebGL представляет собой актуальное направление в современном веб-программировании, ориентированное на интеграцию высокопроизводительных трехмерных графических изображений в онлайн-среду без необходимости установки дополнительных плагинов. WebGL, или Web Graphics Library, является JavaScript API, предназначенным для рендеринга трехмерной графики в веб-браузерах. Ключевой характеристикой данной технологии является возможность эффективного использования вычислительных мощностей современных графических процессоров, что обеспечивает выдающиеся результаты в визуализации сложных трехмерных структур.<br />
</span></p>
<p style="text-align: justify;"><span>Актуальность рассматриваемой проблематики обусловлена растущим запросом к интерактивным и визуально насыщенным веб-приложениям, а также стремлением к созданию более реалистичных онлайн-сценариев. При помощи WebGL разработчики получают возможность интегрировать трехмерные модели непосредственно в веб-среду, что находит применение в таких областях, как виртуальная реальность, образование, визуализация продуктов и веб-гейминг.<br />
</span></p>
<p style="text-align: justify;"><span>Для начала работы с трехмерной графикой веб-приложений мы включаем необходимые библиотеки: three.js для создания и управления трехмерными сценами, и OrbitControls.js для обеспечения удобного взаимодействия с камерой в пространстве. Подключение этих модулей может быть выполнено следующим образом:<br />
</span></p>
<p style="text-align: justify;"><span>&lt;script type=&#8221;module&#8221;&gt;<br />
</span></p>
<p style="text-align: justify;"><span> import * as THREE from &#8216;https://threejs.org/build/three.module.js&#8217;;<br />
</span></p>
<p style="text-align: justify;"><span> import { OrbitControls } from &#8216;https://threejs.org/examples/jsm/controls/OrbitControls.js&#8217;;<br />
</span></p>
<p style="text-align: justify;"><span>&lt;/script&gt;<br />
</span></p>
<p style="text-align: justify;"><span>Модуль three.js представляет собой мощный инструментарий для работы с трехмерной графикой в веб-среде. Его функционал включает в себя создание и управление объектами, работу с материалами, светом и многими другими аспектами трехмерной визуализации. Модуль OrbitControls предоставляет возможность управления положением камеры и наблюдения за объектами на сцене из различных углов. Библиотеки можно загрузить с официального сайта threejs.org.<br />
</span></p>
<p style="text-align: justify;"><span>Работа с трехмерной графикой веб-приложений с использованием Three.js разделяется на несколько этапов:<br />
</span></p>
<ul>
<li><span style="text-align: justify;">Создание сцены: Инициализация трехмерной сцены, на которой будут размещаться объекты.</span></li>
<li><span style="text-align: justify;">Создание камеры: Определение камеры, через которую будет производиться наблюдение за сценой.</span></li>
<li><span style="text-align: justify;">Настройка света: Добавление и настройка источников света, обеспечивающих освещение сцены.</span></li>
<li><span style="text-align: justify;">Добавление объектов: Размещение трехмерных объектов на сцене, таких как графические модели или геометрические формы.</span></li>
<li><span style="text-align: justify;">Создание объекта визуализации: Инициализация объекта, который будет отвечать за визуализацию сцены в указанном контейнере.</span></li>
<li><span style="text-align: justify;">Рендеринг (визуализация): Отображение сцены на веб-странице с использованием камеры и света.</span></li>
</ul>
<p style="text-align: justify;"><span><strong>Создание сцены.<br />
</strong></span></p>
<p style="text-align: justify;"><span>Создаем глобальную переменную scene, которая будет представлять трехмерную сцену в нашем веб-приложении, используя библиотеку three.js. Сцена служит контейнером для всех трехмерных объектов, которые мы хотим отобразить.<br />
</span></p>
<p style="text-align: justify;"><span>var scene;<br />
</span></p>
<p style="text-align: justify;"><span>scene = new THREE.Scene();<br />
</span></p>
<p style="text-align: justify;"><span>Для добавления объектов на сцену или удаления их со сцены, мы будем использовать методы add и remove.<br />
</span></p>
<p style="text-align: justify;"><span>scene.add( object ); scene.remove( object );<br />
</span></p>
<p style="text-align: justify;"><span><strong>Создание камеры.<br />
</strong></span></p>
<p style="text-align: justify;"><span>Для создания трехмерной визуализации веб-приложений в библиотеке three.js, мы объявляем глобальную переменную camera, представляющую перспективную камеру. Перспективная камера в данном контексте воспринимает объекты сцены в соответствии с перспективной проекцией, где удаленные объекты кажутся меньше.<br />
</span></p>
<p style="text-align: justify;"><span>var camera;<br />
</span></p>
<p style="text-align: justify;"><span>camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );<br />
</span></p>
<p style="text-align: justify;"><span>Инициализация камеры происходит с использованием нескольких параметров: угла обзора (FOV), соотношения сторон экрана (aspect ratio) и диапазона расстояний, которые подлежат рендерингу.<br />
</span></p>
<p style="text-align: justify;"><span>Для удобства манипуляции с трехмерной сценой мы интегрируем контроллер OrbitControls. Этот контроллер позволяет изменять точку обзора, масштабировать и вращать сцену с использованием мыши.<br />
</span></p>
<p style="text-align: justify;"><span>var controls;<br />
</span></p>
<p style="text-align: justify;"><span>controls = new OrbitControls( camera, renderer.domElement );<br />
</span></p>
<p style="text-align: justify;"><span>Эти шаги предоставляют нам не только создание и настройку камеры, но и обеспечивают возможность взаимодействия с трехмерной сценой в веб-приложении, придавая пользовательскому опыту уровень интерактивности и удобства.<br />
</span></p>
<p style="text-align: justify;"><span><strong>Настройка света.<br />
</strong></span></p>
<p style="text-align: justify;"><span>Для достижения более реалистичной визуализации в сцене веб-приложения в библиотеке three.js, мы прибегаем к использованию источника света. Одним из эффективных средств для этой цели является класс DirectionalLight, который моделирует прямое направленное освещение, аналогичное солнечным лучам.<br />
</span></p>
<p style="text-align: justify;"><span>Мы предварительно объявляем глобальную переменную light для представления источника света в сцене. Создание источника света выполняется с использованием следующих параметров:<br />
</span></p>
<p style="text-align: justify;"><span>light = new THREE.DirectionalLight( 0xFFFFFF, 1.0 );<br />
</span></p>
<p style="text-align: justify;"><span>light.position.set( 1, 1, 1 );<br />
</span></p>
<p style="text-align: justify;"><span>scene.add( light );<br />
</span></p>
<p style="text-align: justify;"><span>Здесь мы указываем цвет света в формате HEX (обычно белый), а также его интенсивность. Задаем позицию света в трехмерных координатах, где (1, 1, 1) соответствует направлению солнечных лучей.<br />
</span></p>
<p style="text-align: justify;"><span>Таким образом, добавление источника света обогащает визуальный опыт, обеспечивая более естественное освещение объектов на сцене в веб-приложении.<br />
</span></p>
<p style="text-align: justify;"><span><strong>Рендеринг и добавление объектов.<br />
</strong></span></p>
<p style="text-align: justify;"><span>Для визуализации трехмерной сцены и ее объектов в библиотеке Three.js привлекается специализированный класс WebGLRenderer. Необходимо выделить переменные для хранения экземпляра этого класса и DOM-элемента, который будет использоваться для его функционирования:<br />
</span></p>
<p style="text-align: justify;"><span>var renderer, container;<br />
</span></p>
<p style="text-align: justify;"><span>В дальнейшем создается раздел div, служащий контейнером на веб-странице:<br />
</span></p>
<p style="text-align: justify;"><span>var container = document.createElement(&#8216;div&#8217;);<br />
</span></p>
<p style="text-align: justify;"><span>document.body.appendChild(container);<br />
</span></p>
<p style="text-align: justify;"><span>Инициализация рендерера осуществляется следующим образом:<br />
</span></p>
<p style="text-align: justify;"><span>renderer = new THREE.WebGLRenderer();<br />
</span></p>
<p style="text-align: justify;"><span>Вместе с рендерером создается холст (canvas), который, по умолчанию, имеет размеры 300&#215;150 пикселей. Метод setSize предоставляет возможность изменить размеры холста, приведем его, например, к размерам окна:<br />
</span></p>
<p style="text-align: justify;"><span>renderer.setSize(window.innerWidth, window.innerHeight);<br />
</span></p>
<p style="text-align: justify;"><span>Затем необходимо указать визуализатору (renderer), где следует поместить созданный холст:<br />
</span></p>
<p style="text-align: justify;"><span>container.appendChild(renderer.domElement);<br />
</span></p>
<p style="text-align: justify;"><span>Рендеринг (отрисовка) производится с помощью созданного объекта renderer. Для этого у него есть метод render, в параметрах которого указываются сцена и камера:<br />
</span></p>
<p style="text-align: justify;"><span>renderer.render( scene, camera );<br />
</span></p>
<p style="text-align: justify;"><span>Добавление объектов производится следующим образом. Сначала объявляется вид геометрии объекта.<br />
</span></p>
<p style="text-align: justify;"><span>var radiusTop = 0; var radiusBottom = 128;<br />
</span></p>
<p style="text-align: justify;"><span>var heigth = 200; var segments = 3;<br />
</span></p>
<p style="text-align: justify;"><span>var geometry = new THREE.CylinderGeometry( radiusTop, radiusBottom, heigth, segments );<br />
</span></p>
<p style="text-align: justify;"><span>Параметры геометрии цилиндра. radiusTop &#8211; радиус верхней части в данном случае 0 и получится пирамида, radiusBottom &#8211; радиус нижней части, height &#8211; высота цилиндра, segments &#8211; количество сегментов (частей), из которых состоит цилиндр.<br />
</span></p>
<p style="text-align: justify;"><span>var material = new THREE.MeshPhongMaterial({ color: 0xff0000 });<br />
</span></p>
<p style="text-align: justify;"><span>Создается материал для пирамиды. В данном случае, цвет материала установлен в красный (код цвета 0xff0000).<br />
</span></p>
<p style="text-align: justify;"><span>var piramida = new THREE.Mesh(geometry, material);<br />
</span></p>
<p style="text-align: justify;"><span>Создается объект Mesh (сетка), который представляет собой геометрию и материал.<br />
</span></p>
<p style="text-align: justify;"><span>piramida.position.set(-300, 100, 350);<br />
</span></p>
<p style="text-align: justify;"><span>Устанавливается позиция пирамиды в трехмерном пространстве. Здесь пирамида размещается в точке (-300, 100, 350).<br />
</span></p>
<p style="text-align: justify;"><span>scene.add(piramida);<br />
</span></p>
<p style="text-align: justify;"><span>Пирамида добавляется на сцену (рис. 1).<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2023/12/120123_1028_3D1.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рис. 1. Пирамида<br />
</span></p>
<p style="text-align: justify;"><span>Технология WebGL представляет собой мощный инструмент для визуализации трехмерной графики в веб-браузерах без необходимости использования дополнительных плагинов. В заключение можно выделить несколько ключевых моментов, отражающих важность и перспективы использования WebGL:<br />
</span></p>
<p style="text-align: justify;"><span>Мощность и Производительность: WebGL использует аппаратное ускорение графики на устройствах пользователя, что обеспечивает высокую производительность и качественное отображение трехмерных сцен.<br />
</span></p>
<p style="text-align: justify;"><span>Кросс-платформенность: WebGL поддерживается большинством современных веб-браузеров, что обеспечивает кросс-платформенность и доступность для широкого круга пользователей.<br />
</span></p>
<p style="text-align: justify;"><span>Визуализация и Интерактивность: Технология позволяет создавать впечатляющие веб-приложения с высококачественной трехмерной графикой, анимацией и возможностью взаимодействия пользователя с контентом.<br />
</span></p>
<p style="text-align: justify;"><span>Расширенные Возможности: WebGL служит основой для множества библиотек и фреймворков, таких как Three.js, Babylon.js и других, упрощающих процесс разработки и повышающих функциональные возможности.<br />
</span></p>
<p style="text-align: justify;"><span>Обучение и Развитие: Технология находит применение в образовании, где она используется для создания интерактивных обучающих приложений, а также в сферах развлечений, архитектуры, медицины и других областях.<br />
</span></p>
<p style="text-align: justify;"><span>Таким образом, WebGL представляет собой важный инструмент для разработчиков, расширяя возможности веб-технологий и обеспечивая пользователей более увлекательным и интерактивным онлайн-опытом.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2023/11/101076/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание интерактивных 3D-объектов с помощью WebGL</title>
		<link>https://web.snauka.ru/issues/2024/01/101327</link>
		<comments>https://web.snauka.ru/issues/2024/01/101327#comments</comments>
		<pubDate>Fri, 19 Jan 2024 16:26:06 +0000</pubDate>
		<dc:creator>Кулахметов Наиль Рустамович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D-моделирование]]></category>
		<category><![CDATA[drag-and-drop]]></category>
		<category><![CDATA[Eventcontrols]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[интерактивность]]></category>
		<category><![CDATA[компьютерная графика]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2024/01/101327</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Создание интерактивных объектов в 3D может придать вашим проектам совершенно новый уровень интерактивности и погружения. Разрабатываете ли вы игру, опыт виртуальной реальности или симуляцию, предоставление пользователям возможности манипулировать объектами в 3D-пространстве может значительно улучшить общий пользовательский опыт. В этой статье мы рассмотрим процесс создания [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em><span>к.ф.-м.н., </span>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Создание интерактивных объектов в 3D может придать вашим проектам совершенно новый уровень интерактивности и погружения. Разрабатываете ли вы игру, опыт виртуальной реальности или симуляцию, предоставление пользователям возможности манипулировать объектами в 3D-пространстве может значительно улучшить общий пользовательский опыт. В этой статье мы рассмотрим процесс создания перетаскиваемых объектов в 3D-среде. Примеры будут реализован в виде html-страницы с помощью WebGL, что обеспечит их легкое встраивание на любой сайт.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">WebGL, сокращение от Web Graphics Library, представляет собой JavaScript API, который позволяет отображать интерактивную 2D и 3D графику в любом совместимом веб-браузере. Он основан на OpenGL ES, широко используемой графической библиотеке для встраиваемых систем.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Используя WebGL, веб-разработчики могут создавать и отображать высокопроизводительную графику и визуальные эффекты в веб-приложениях без необходимости установки дополнительных плагинов или программного обеспечения. WebGL поддерживается большинством современных веб-браузеров и работает на различных платформах, включая настольные компьютеры и мобильные устройства.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Чтобы работать с WebGL, вам необходимо иметь четкое представление о концепциях JavaScript и компьютерной графики. Существуют также библиотеки и фреймворки, такие как Three.js и Babylon.js, которые упрощают процесс разработки, предоставляя абстракции более высокого уровня и утилиты для программирования на WebGL.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">В этой статье будет использоваться Three.js. Внутри этой библиотеки есть класс EventsControls, который упрощает создание интерактивных приложений. Он предоставляет следующие возможности:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">– Добавление события клика мышкой по объекту;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">– Добавление события наведения мышки на объекты;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">– Перетаскивание объектов с помощью мышки;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">– Добавленные события работают с классом Mesh и с классом Object3D.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Для работы нам нужна библиотека Three.js и её класс EventsControl, подключаем их:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">&lt;script type=&#8221;module&#8221;&gt;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">    import * as THREE from &#8216;three&#8217;;<br />
</span></p>
<p style="background: white;"><span style="color: #111111;">    import { EventControls } from &#8216;https://alexan0308.github.io/threejs/examples/js/controls/EventControls.js&#8217;;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cоздадим переменную, которая будет отвечать за перемещение объектов:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">const dragObjects = [];<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Прописываем события:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">eventControl = new EventControls( [ ... dragObjects ], camera, renderer.domElement );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">eventControl.setDraggable( render, true );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">eventControl.setMap ( checkerboard );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">eventControl.setOrbitControl( controls );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Прописываем функцию, в которой будет работать перемещение объекта:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">eventControl.attachEvent( &#8216;dragAndDrop&#8217;, function () {<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">    this.event.object.position.x =<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">        100*Math.round( this.event.object.position.x / 100);<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">    this.event.object.position.z =<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">        100*Math.round( this.event.object.position.z / 100);<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">});<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Для примера создадим объект, к примеру куб и прописываем ему параметры: размер, координаты расположения, высоту и т.д.:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">var geometry = new THREE.BoxGeometry( 200, 200, 200 );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">var material = new THREE.MeshPhongMaterial( { color: 0x32CD32 } );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cube = new THREE.Mesh( geometry, material );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cube.position.set( 200, 0, -400 );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cube.rotation.y = 300;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">scene.add( Cube );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">var Cube_bbox = new THREE.Box3();<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cube_bbox.setFromObject( Cube );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cube.height = Cube_bbox.max.y &#8211; Cube_bbox.min.y;<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Cube.position.set( 200, Cube.height/2, -400 );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">А чтобы можно было сделать куб интерактивным допишем ему переменную, которую создали, для реализации перемещения объектов:<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><span><strong>    </strong></span><span>dragObjects.push( Cube );<br />
</span></span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">    scene.add( Cube );<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Для подробного показа примера, были созданы несколько фигур, и чайник:<br />
</span></p>
<p style="background: white; text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/01/011924_1431_1.png" alt="" /><span style="color: #111111;"><br />
</span></p>
<p style="text-align: center; background: white;"><span style="color: #111111;">Рисунок 1. Интерактивные 3D-объекты созданные в WebGL.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Теперь их можно переместить, для наглядной демонстрации:<br />
</span></p>
<p style="background: white; text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2024/01/011924_1431_2.png" alt="" /><span style="color: #111111;"><br />
</span></p>
<p style="text-align: center; background: white;"><span style="color: #111111;">Рисунок 2. Перемещённые 3D-объекты.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><span>Технология WebGL позволяет отрисовывать качественную графику прямо в браузере. Библиотека three.js дает понятный и доступный набор классов и методов для работы с трехмерной графикой. А создание интерактивных 3D-объектов, к примеру для сайтов, позволит вам разнообразить опыт пользователя, и даже его заинтересовать.</span></span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2024/01/101327/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Применение библиотеки Three.js для визуализации простых трёхмерных геометрических объектов в веб-среде</title>
		<link>https://web.snauka.ru/issues/2025/12/104046</link>
		<comments>https://web.snauka.ru/issues/2025/12/104046#comments</comments>
		<pubDate>Fri, 05 Dec 2025 14:41:01 +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[визуализация]]></category>
		<category><![CDATA[трехмерная графика]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2025/12/104046</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение. Развитие веб-технологий привело к возможности использования трёхмерной графики непосредственно в интернет-браузерах. Стандарт WebGL обеспечивает доступ к аппаратному ускорению графики, однако его использование требует глубоких знаний в области компьютерной графики. В связи с этим широкое распространение получили высокоуровневые библиотеки, упрощающие процесс создания 3D-сцен. Одной [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center; background: white;"><span style="color: #111111;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал</em><br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><strong>Введение.</strong> Развитие веб-технологий привело к возможности использования трёхмерной графики непосредственно в интернет-браузерах. Стандарт WebGL обеспечивает доступ к аппаратному ускорению графики, однако его использование требует глубоких знаний в области компьютерной графики. В связи с этим широкое распространение получили высокоуровневые библиотеки, упрощающие процесс создания 3D-сцен.<br />
Одной из наиболее популярных библиотек является Three.js, предоставляющая удобные средства для создания и визуализации трёхмерных объектов. Целью данной работы является демонстрация применения библиотеки Three.js для визуализации простого геометрического объекта и анализа основных этапов построения трёхмерной сцены.<br />
Для реализации трёхмерной визуализации были использованы следующие технологии:<br />
</span></p>
<ol>
<li><span style="color: #111111; background-color: white; text-align: justify;">Язык гипертекстовой разметки HTML5;</span></li>
<li><span style="color: #111111; background-color: white; text-align: justify;">Язык программирования JavaScript;</span></li>
<li><span style="color: #111111; background-color: white; text-align: justify;">Библиотека Three.js версии r128;</span></li>
<li><span style="color: #111111; background-color: white; text-align: justify;">Графический API WebGL;</span></li>
<li><span style="color: #111111; background-color: white; text-align: justify;">Модуль OrbitControls для управления камерой.</span></li>
</ol>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Использование CDN-подключений позволяет обеспечить корректную работу приложения на различных платформах без дополнительной установки программного обеспечения.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Приложение построено по классической архитектуре Three.js и включает следующие основные элементы:<br />
</span></p>
<ol>
<li>
<div style="text-align: justify; background: white;"><span style="color: #111111;">Сцену (THREE.Scene), содержащую все объекты визуализации;<br />
</span></div>
</li>
<li>
<div style="text-align: justify; background: white;"><span style="color: #111111;">Перспективную камеру (THREE.PerspectiveCamera);<br />
</span></div>
</li>
<li>
<div style="text-align: justify; background: white;"><span style="color: #111111;">Рендерер (THREE.WebGLRenderer), осуществляющий вывод изображения;<br />
</span></div>
</li>
<li>
<div style="text-align: justify; background: white;"><span style="color: #111111;">Источники освещения;<br />
</span></div>
</li>
<li>
<div style="text-align: justify; background: white;"><span style="color: #111111;">Трёхмерную модель объекта;<br />
</span></div>
</li>
<li>
<div style="text-align: justify; background: white;"><span style="color: #111111;">Средства пользовательского управления камерой.<br />
</span></div>
</li>
</ol>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Подобная структура обеспечивает модульность и возможность дальнейшего расширения функциональности.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Построение трёхмерной модели. Модель креста формируется из двух параллелепипедов, созданных с использованием класса BoxGeometry. Вертикальный элемент имеет размеры 6×60×3, горизонтальный — 40×6×3 и смещён относительно центра по оси Y.<br />
Для объединения элементов используется объект THREE.Group, позволяющий рассматривать модель как единое целое. В качестве материала применяется MeshPhongMaterial, обеспечивающий корректное освещение и визуальное восприятие формы объекта.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Освещение сцены реализовано с помощью двух источников света: рассеянного (AmbientLight) и направленного (DirectionalLight). Такое сочетание позволяет добиться равномерной освещённости и визуального подчёркивания формы объекта.<br />
Для управления камерой используется модуль OrbitControls, обеспечивающий вращение сцены, масштабирование и плавное перемещение точки наблюдения. Это повышает интерактивность и удобство работы с трёхмерной моделью.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><strong>HTML код приложения:</strong></span></p>
<p>&lt;!DOCTYPE html&gt;</p>
<p>&lt;html lang=&#8221;ru&#8221;&gt;</p>
<p>&lt;head&gt;</p>
<p style="padding-left: 30px;">    &lt;title&gt;three.js — Простой крест&lt;/title&gt;</p>
<p style="padding-left: 30px;">    &lt;meta charset=&#8221;utf-8&#8243;&gt;</p>
<p style="padding-left: 30px;">    &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;div id=&#8221;info&#8221;&gt;Простой крест&lt;/div&gt;</p>
<p>&lt;script src=&#8221;https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js&#8221;&gt;&lt;/script&gt;</p>
<p>&lt;script src=&#8221;https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.min.js&#8221;&gt;&lt;/script&gt;</p>
<p>&lt;script&gt;</p>
<p style="padding-left: 30px;">    var camera, scene, renderer;</p>
<p style="padding-left: 30px;">    var controls;</p>
<p style="padding-left: 30px;">    init();</p>
<p style="padding-left: 30px;">    animate();</p>
<p style="padding-left: 30px;">    function init() {</p>
<p style="padding-left: 60px;">        scene = new THREE.Scene();</p>
<p style="padding-left: 60px;">        scene.background = new THREE.Color(0xf0f0f0);</p>
<p style="padding-left: 60px;">        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);</p>
<p style="padding-left: 60px;">        camera.position.set(0, 0, 100);</p>
<p style="padding-left: 60px;">        renderer = new THREE.WebGLRenderer({ antialias: true });</p>
<p style="padding-left: 60px;">        renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p style="padding-left: 60px;">        document.body.appendChild(renderer.domElement);</p>
<p style="padding-left: 60px;">        var ambientLight = new THREE.AmbientLight(0xffffff, 0.6);</p>
<p style="padding-left: 60px;">        scene.add(ambientLight);</p>
<p style="padding-left: 60px;">        var directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);</p>
<p style="padding-left: 60px;">        directionalLight.position.set(1, 1, 1);</p>
<p style="padding-left: 60px;">        scene.add(directionalLight);</p>
<p style="padding-left: 60px;">        createSimpleCross();</p>
<p style="padding-left: 60px;">        controls = new THREE.OrbitControls(camera, renderer.domElement);</p>
<p style="padding-left: 60px;">        controls.enableDamping = true;</p>
<p style="padding-left: 60px;">        controls.dampingFactor = 0.05;</p>
<p style="padding-left: 60px;">        window.addEventListener(&#8216;resize&#8217;, onWindowResize, false);</p>
<p style="padding-left: 30px;">    }</p>
<p style="padding-left: 30px;">    function createSimpleCross() {</p>
<p style="padding-left: 60px;">        var group = new THREE.Group();</p>
<p style="padding-left: 60px;">        var verticalGeometry = new THREE.BoxGeometry(6, 60, 3);</p>
<p style="padding-left: 60px;">        var verticalMaterial = new THREE.MeshPhongMaterial({ color: 0xffff00 });</p>
<p style="padding-left: 60px;">        var vertical = new THREE.Mesh(verticalGeometry, verticalMaterial);</p>
<p style="padding-left: 60px;">        group.add(vertical);</p>
<p style="padding-left: 60px;">        var horizontalGeometry = new THREE.BoxGeometry(40, 6, 3);</p>
<p style="padding-left: 60px;">        var horizontalMaterial = new THREE.MeshPhongMaterial({ color: 0xffff00 });</p>
<p style="padding-left: 60px;">        var horizontal = new THREE.Mesh(horizontalGeometry, horizontalMaterial);</p>
<p style="padding-left: 60px;">        horizontal.position.y = 8;</p>
<p style="padding-left: 60px;">        group.add(horizontal);</p>
<p style="padding-left: 60px;">        scene.add(group);</p>
<p style="padding-left: 30px;">    }</p>
<p style="padding-left: 30px;">    function onWindowResize() {</p>
<p style="padding-left: 60px;">        camera.aspect = window.innerWidth / window.innerHeight;</p>
<p style="padding-left: 60px;">        camera.updateProjectionMatrix();</p>
<p style="padding-left: 60px;">        renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p style="padding-left: 30px;">    }</p>
<p style="padding-left: 30px;">    function animate() {</p>
<p style="padding-left: 60px;">        requestAnimationFrame(animate);</p>
<p style="padding-left: 60px;">        controls.update();</p>
<p style="padding-left: 60px;">        renderer.render(scene, camera);</p>
<p style="padding-left: 30px;">    }</p>
<p>&lt;/script&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;</p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><strong><br />
</strong></span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">В результате выполнения программы в браузере отображается интерактивная трёхмерная модель простого креста. Пользователь может изменять ракурс обзора и масштаб, что позволяет детально рассмотреть объект с различных сторон.<br />
</span></p>
<p style="text-align: center; background: white;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/122925_1539_1.png" alt="" /><span style="color: #111111;"><br />
</span></p>
<p style="text-align: center; background: white;"><span style="color: #111111;">Рисунок 1. Интерактивная трёхмерная модель простого креста<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;">Полученные результаты подтверждают, что библиотека Three.js является эффективным инструментом для визуализации простых и сложных трёхмерных объектов в веб-приложениях, включая образовательные и демонстрационные системы.<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><strong>Заключение. </strong>В работе рассмотрен пример использования библиотеки Three.js для создания интерактивной трёхмерной визуализации. Показано, что применение высокоуровневых средств позволяет существенно упростить процесс разработки 3D-графики в веб-среде. Рассмотренный пример может служить основой для дальнейших исследований и разработки более сложных визуальных моделей.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/12/104046/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Трехмерное моделирование методом экструдирования в среде Three.js</title>
		<link>https://web.snauka.ru/issues/2025/12/104020</link>
		<comments>https://web.snauka.ru/issues/2025/12/104020#comments</comments>
		<pubDate>Fri, 26 Dec 2025 17:11:48 +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[выдавливание]]></category>
		<category><![CDATA[нормали]]></category>
		<category><![CDATA[полигональное моделирование]]></category>
		<category><![CDATA[экструдирование]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2025/12/104020</guid>
		<description><![CDATA[Метод экструдирования (выдавливания) остаётся одним из фундаментальных и наиболее интуитивно понятных инструментов в арсенале 3D-моделлера. Этот процесс, преобразующий двумерные контуры в трёхмерные объёмные объекты, десятилетиями используется как в профессиональных пакетах (Blender, Maya, 3ds Max), так и в веб-ориентированных фреймворках, таких как Three.js. В эпоху повсеместного распространения интерактивной 3D-графики в браузерах, веб-приложениях и играх освоение базовых [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Метод экструдирования (выдавливания) остаётся одним из фундаментальных и наиболее интуитивно понятных инструментов в арсенале 3D-моделлера. Этот процесс, преобразующий двумерные контуры в трёхмерные объёмные объекты, десятилетиями используется как в профессиональных пакетах (Blender, Maya, 3ds Max), так и в веб-ориентированных фреймворках, таких как Three.js. В эпоху повсеместного распространения интерактивной 3D-графики в браузерах, веб-приложениях и играх освоение базовых техник моделирования сохраняет свою практическую ценность. Оно позволяет наглядно демонстрировать переход от абстрактной геометрии к визуальному объекту: от задания вершин на плоскости и формирования профиля до управления параметрами выдавливания и получения готовой модели. Использование доступных библиотек, таких как Three.js, делает процесс создания 3D-контента достижимым даже для новичков, а сама техника экструзии служит отправной точкой для понимания более сложных методов моделирования, скульптинга и анимации.</p>
<p style="text-align: justify;"><span>В данной работе для создания трёхмерной фигуры используется метод экструдирования, реализованный средствами Three.js. Моделирование начинается с определения плоского замкнутого контура (профиля) на плоскости XY, координаты вершин которого задаются относительно начала координат. Затем этот контур выдавливается вдоль оси Z (или иной заданной нормали) на определённую высоту, формируя объёмное тело. Ключевым преимуществом является полный контроль над топологией: процесс создаёт боковые грани, соединяющие исходный и конечный контуры, а также при необходимости закрывает торцы полученного объекта. Такой подход позволяет быстро генерировать сложные архитектурные элементы, технические детали или абстрактные формы, демонстрируя стандартный пайплайн для задач параметрического моделирования в среде WebGL.<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/122625_0607_11.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 1. Исходный 2D-профиль фигуры в плоскости XY<br />
</span></p>
<p style="text-align: justify;"><span>Алгоритм создания трёхмерной модели методом экструдирования с использованием Three.js включает следующие последовательные шаги.<br />
</span></p>
<ul>
<li>Импортируем необходимые библиотеки: Three.js, а также, при необходимости, вспомогательные модули для управления кривыми (CurvePath) и геометрией (ExtrudeGeometry);</li>
<li>Определяем форму (Shape) — массив двумерных точек (Vector2), описывающих замкнутый контур будущего профиля. Координаты задаются относительно центра (0,0);</li>
<li>Создаём геометрию выдавливания (ExtrudeGeometry), передавая в неё объект Shape и параметры экструзии: depth (глубина/высота выдавливания), bevelEnabled (скос кромок) и другие;</li>
<li>Настраиваем материал (например, MeshStandardMaterial) для визуализации модели;</li>
<li>Создаём объект Mesh, объединяя полученную геометрию и материал, и добавляем его на сцену (Scene);</li>
<li>Настраиваем освещение (AmbientLight, DirectionalLight) и камеру (PerspectiveCamera) для корректного отображения объекта;</li>
<li>Инициируем рендерер (WebGLRenderer) и запускаем цикл анимации для отрисовки сцены;</li>
<li>При необходимости добавляем элементы управления (OrbitControls) для интерактивного вращения и масштабирования модели;</li>
</ul>
<p style="text-align: justify;"><span>Этот алгоритм является типовым для создания простых экструдированных объектов в Three.js и демонстрирует ключевые этапы работы с геометрией и материалами.<br />
</span></p>
<p style="text-align: justify;"><span>Ниже приведен фрагмент кода, реализующий ключевые шаги алгоритма:</span></p>
<p>import * as THREE from &#8216;three&#8217;;</p>
<p>import { OrbitControls } from &#8216;three/addons/controls/OrbitControls.js&#8217;;</p>
<p>&nbsp;</p>
<p>const scene = new THREE.Scene();</p>
<p>const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);</p>
<p>const renderer = new THREE.WebGLRenderer({ antialias: true });</p>
<p>renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p>document.body.appendChild(renderer.domElement);</p>
<p>&nbsp;</p>
<p>const shape = new THREE.Shape();</p>
<p>const radius = 2;</p>
<p>const sides = 6;</p>
<p>for (let i = 0; i &lt;= sides; i++) {</p>
<p style="padding-left: 30px;">const angle = (i / sides) * Math.PI * 2;</p>
<p style="padding-left: 30px;">const x = Math.cos(angle) * radius;</p>
<p style="padding-left: 30px;">const y = Math.sin(angle) * radius;</p>
<p style="padding-left: 30px;">if (i === 0) shape.moveTo(x, y);</p>
<p style="padding-left: 30px;">else shape.lineTo(x, y);</p>
<p>}</p>
<p>&nbsp;</p>
<p>const extrudeSettings = {</p>
<p style="padding-left: 30px;">depth: 5,</p>
<p style="padding-left: 30px;">bevelEnabled: true,</p>
<p style="padding-left: 30px;">bevelThickness: 0.5,</p>
<p style="padding-left: 30px;">bevelSize: 0.5,</p>
<p style="padding-left: 30px;">bevelSegments: 3</p>
<p>};</p>
<p>const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);</p>
<p>&nbsp;</p>
<p>const material = new THREE.MeshStandardMaterial({ color: 0x00aaff, metalness: 0.2, roughness: 0.7 });</p>
<p>const mesh = new THREE.Mesh(geometry, material);</p>
<p>scene.add(mesh);</p>
<p>&nbsp;</p>
<p>const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);</p>
<p>scene.add(ambientLight);</p>
<p>const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);</p>
<p>directionalLight.position.set(10, 20, 5);</p>
<p>scene.add(directionalLight);</p>
<p>&nbsp;</p>
<p>camera.position.z = 15;</p>
<p>const controls = new OrbitControls(camera, renderer.domElement);</p>
<p>&nbsp;</p>
<p>function animate() {</p>
<p style="padding-left: 30px;">requestAnimationFrame(animate);</p>
<p style="padding-left: 30px;">controls.update();</p>
<p style="padding-left: 30px;">renderer.render(scene, camera);</p>
<p>}</p>
<p>animate();</p>
<p style="text-align: justify;"><span><br />
</span></p>
<p style="text-align: justify;"><span>Процесс выдавливания, описанный в коде, визуально представлен на Рисунке 1 и Рисунке 2. На первой иллюстрации показан исходный профиль, а на второй — итоговая трёхмерная модель после применения экструзии:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/122625_0607_21.png" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 2. Результат экструдирования профиля вдоль оси Z<br />
</span></p>
<p style="text-align: center;"><span><strong>Заключение<br />
</strong></span></p>
<p style="text-align: justify;"><span>Техника экструдирования, несмотря на свою простоту и повсеместное использование, продолжает оставаться важным учебным и практическим инструментом в области трёхмерного моделирования и компьютерной графики. Её применение в среде Three.js, как показано в работе, позволяет эффективно создавать объёмные объекты из плоских контуров, демонстрируя типичный пайплайн для параметрического моделирования в веб-среде. Ключевыми этапами являются корректное задание профиля, настройка параметров выдавливания и управление материалами с освещением. Освоение этого метода формирует прочную основу для перехода к более сложным техникам, таким как булевы операции, модификация геометрии, скелетная анимация и работа с воксельными данными, что открывает путь к решению современных задач в разработке игр, симуляций и интерактивных визуализаций.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/12/104020/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Моделирование вазы с использованием кривых Безье в среде Three.js</title>
		<link>https://web.snauka.ru/issues/2025/12/104047</link>
		<comments>https://web.snauka.ru/issues/2025/12/104047#comments</comments>
		<pubDate>Tue, 30 Dec 2025 12:07:35 +0000</pubDate>
		<dc:creator>Давлетзянов Демид Владимирович</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[three.js]]></category>
		<category><![CDATA[WebGL]]></category>
		<category><![CDATA[кривая Безье]]></category>
		<category><![CDATA[моделирование]]></category>
		<category><![CDATA[объект вращения]]></category>
		<category><![CDATA[трехмерная графика]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2025/12/104047</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Современные веб-технологии позволяют реализовывать сложные трёхмерные сцены непосредственно в браузере без использования специализированного программного обеспечения. Одной из наиболее популярных библиотек для работы с WebGL является three.js, предоставляющая удобный интерфейс для создания и визуализации трёхмерных объектов. Одним из распространённых способов моделирования тел вращения является использование [...]]]></description>
			<content:encoded><![CDATA[<p align="center"><em>Научный руководитель:</em><em> </em><em>Вильданов Алмаз Нафкатович<br />
</em><em><em>к.ф.-м.н.,</em></em><em> </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p>Современные веб-технологии позволяют реализовывать сложные трёхмерные сцены непосредственно в браузере без использования специализированного программного обеспечения. Одной из наиболее популярных библиотек для работы с WebGL является three.js, предоставляющая удобный интерфейс для создания и визуализации трёхмерных объектов.</p>
<p>Одним из распространённых способов моделирования тел вращения является использование кривых Безье для задания двумерного профиля с последующим вращением вокруг оси. Данный метод широко применяется в компьютерной графике при создании сосудов, ваз и других симметричных объектов.</p>
<p>Целью данной работы является разработка и описание алгоритма построения трёхмерной модели кувшина на основе кубической кривой Безье в среде three.js.</p>
<p><strong>Теоретические основы. </strong>Кривые Безье представляют собой параметрические кривые, широко применяемые в компьютерной графике и системах автоматизированного проектирования. Кубическая кривая Безье определяется четырьмя контрольными точками и описывается параметрическим уравнением:</p>
<p><img title="formula" src="https://web.snauka.ru/wp-content/uploads/2025/12/formula.png" alt="" width="732" height="48" /></p>
<p>где <em><strong>P<sub>0</sub></strong></em>, <em><strong>P<sub>1</sub></strong></em>, <em><strong>P<sub>2</sub></strong></em>, <em><strong>P<sub>3</sub></strong></em>, - контрольные точки кривой.</p>
<p><strong>Метод вращения профиля. </strong>Для получения трёхмерного объекта профиль, заданный набором точек в двумерном пространстве, вращается вокруг оси симметрии. В three.js данный метод реализован с помощью класса LatheGeometry, который автоматически формирует сетку вершин на основе массива точек и количества сегментов вращения.<br />
<strong></strong></p>
<p><strong>Описание реализации.</strong> Программная реализация выполнена на языке JavaScript с использованием библиотеки three.js. На первом этапе создаётся сцена, камера и рендерер. Камера типа PerspectiveCamera обеспечивает перспективное отображение объекта.     Для формирования профиля кувшина используется кубическая кривая Безье (THREE.CubicBezierCurve), контрольные точки которой масштабируются для получения требуемых размеров объекта. На основе вычисленных точек кривой создаётся геометрия вращения (THREE.LatheGeometry).</p>
<p>Для повышения реалистичности визуализации применяются два источника света: рассеянный (AmbientLight) и направленный (DirectionalLight). Также используются два материала — для внешней и внутренней поверхностей объекта, что позволяет корректно отображать модель при вращении камеры.</p>
<p>Интерактивное управление сценой реализовано с помощью модуля OrbitControls, обеспечивающего вращение, масштабирование и плавное перемещение камеры.</p>
<p>Ниже приведен HTML код программы:</p>
<p>&lt;!DOCTYPE html&gt;</p>
<p>&lt;html lang=&#8221;ru&#8221;&gt;</p>
<p>&lt;head&gt;</p>
<p style="padding-left: 30px;">    &lt;title&gt;three.js — Кувшин, созданный с помощью кривой Безье&lt;/title&gt;</p>
<p style="padding-left: 30px;">    &lt;meta charset=&#8221;utf-8&#8243;&gt;</p>
<p style="padding-left: 30px;">    &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;</p>
<p>&lt;/head&gt;</p>
<p>&lt;body&gt;</p>
<p>&lt;div id=&#8221;info&#8221;&gt;Кувшин, созданный с помощью кривой Безье&lt;/div&gt;</p>
<p>&lt;script src=&#8221;https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js&#8221;&gt;&lt;/script&gt;</p>
<p>&lt;script src=&#8221;https://cdn.jsdelivr.net/npm/three@0.128.0/examples/js/controls/OrbitControls.min.js&#8221;&gt;&lt;/script&gt;</p>
<p>&lt;script&gt;</p>
<p style="padding-left: 30px;">    var camera, scene, renderer;</p>
<p style="padding-left: 30px;">    var controls;</p>
<p style="padding-left: 30px;">    init();</p>
<p style="padding-left: 30px;">    animate();</p>
<p style="padding-left: 30px;">    function init() {</p>
<p style="padding-left: 60px;">        scene = new THREE.Scene();</p>
<p style="padding-left: 60px;">        scene.background = new THREE.Color(0xf0f0f0);</p>
<p style="padding-left: 60px;">        camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);</p>
<p style="padding-left: 60px;">        camera.position.set(0, 0, 100);</p>
<p style="padding-left: 60px;">        renderer = new THREE.WebGLRenderer({antialias: true});</p>
<p style="padding-left: 60px;">        renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p style="padding-left: 60px;">        document.body.appendChild(renderer.domElement);</p>
<p style="padding-left: 60px;">        var ambientLight = new THREE.AmbientLight(0xffffff, 0.6);</p>
<p style="padding-left: 60px;">        scene.add(ambientLight);</p>
<p style="padding-left: 60px;">        var directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);</p>
<p style="padding-left: 60px;">        directionalLight.position.set(1, 1, 1);</p>
<p style="padding-left: 60px;">        scene.add(directionalLight);</p>
<p style="padding-left: 60px;">        createVase();</p>
<p style="padding-left: 60px;">        controls = new THREE.OrbitControls(camera, renderer.domElement);</p>
<p style="padding-left: 60px;">        controls.enableDamping = true;</p>
<p style="padding-left: 60px;">        controls.dampingFactor = 0.05;</p>
<p style="padding-left: 60px;">        window.addEventListener(&#8216;resize&#8217;, onWindowResize, false);</p>
<p style="padding-left: 30px;">    }</p>
<p style="padding-left: 30px;">    function createVase() {</p>
<p style="padding-left: 60px;">        var group = new THREE.Group();</p>
<p style="padding-left: 60px;">        const scale = 10;</p>
<p style="padding-left: 60px;">        const curve = new THREE.CubicBezierCurve(</p>
<p style="padding-left: 90px;">            new THREE.Vector2(3, 0).multiplyScalar(scale),</p>
<p style="padding-left: 90px;">            new THREE.Vector2(12, 6).multiplyScalar(scale),</p>
<p style="padding-left: 90px;">            new THREE.Vector2(-3, 12).multiplyScalar(scale),</p>
<p style="padding-left: 90px;">            new THREE.Vector2(7, 15).multiplyScalar(scale)</p>
<p style="padding-left: 60px;">        );</p>
<p style="padding-left: 60px;">        const points = curve.getPoints(36);</p>
<p style="padding-left: 60px;">        var geometry = new THREE.LatheGeometry(points, 64);</p>
<p style="padding-left: 60px;">        var material1 = new THREE.MeshPhongMaterial({color: 0xfff000});</p>
<p style="padding-left: 60px;">        var material2 = new THREE.MeshPhongMaterial({color: 0xfff080, side: THREE.BackSide});</p>
<p style="padding-left: 60px;">        var object1 = new THREE.Mesh(geometry, material1);</p>
<p style="padding-left: 60px;">        var object2 = new THREE.Mesh(geometry, material2);</p>
<p style="padding-left: 60px;">        group.add(object1);</p>
<p style="padding-left: 60px;">        group.add(object2);</p>
<p style="padding-left: 60px;">        scene.add(group);</p>
<p style="padding-left: 30px;">    }</p>
<p style="padding-left: 30px;">    function onWindowResize() {</p>
<p style="padding-left: 60px;">        camera.aspect = window.innerWidth / window.innerHeight;</p>
<p style="padding-left: 60px;">        camera.updateProjectionMatrix();</p>
<p style="padding-left: 60px;">        renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p style="padding-left: 30px;">    }</p>
<p style="padding-left: 30px;">    function animate() {</p>
<p style="padding-left: 60px;">        requestAnimationFrame(animate);</p>
<p style="padding-left: 60px;">        controls.update();</p>
<p style="padding-left: 60px;">        renderer.render(scene, camera);</p>
<p style="padding-left: 30px;">    }</p>
<p>&lt;/script&gt;</p>
<p>&lt;/body&gt;</p>
<p>&lt;/html&gt;<br />
В результате выполнения программы формируется интерактивная трёхмерная модель кувшина, корректно отображаемая в браузере. Пользователь имеет возможность вращать объект, изменять масштаб и рассматривать его под различными углами. Применение кривых Безье позволяет гибко управлять формой модели, изменяя лишь положение контрольных точек.</p>
<p style="text-align: center; background: white;"><img src="https://web.snauka.ru/wp-content/uploads/2025/12/123025_1159_11.png" alt="" /><span style="color: #111111; georgia; 13pt; background-color: yellow;"><br />
</span></p>
<p style="text-align: center; background: white;"><span style="color: #111111;">Рисунок 1. Интерактивная трёхмерная модель вазы<br />
</span></p>
<p style="text-align: justify; background: white;"><span style="color: #111111;"><strong>Заключение</strong></span></p>
<p style="text-align: justify; background: white;">В работе был рассмотрен метод построения трёхмерного объекта вращения на основе кубической кривой Безье с использованием библиотеки three.js. Показано, что данный подход является наглядным, универсальным и удобным для веб-разработки. Разработанное решение может быть расширено за счёт добавления текстур, анимации и более сложных кривых профиля.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2025/12/104047/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>Создание фигуры с помощью вращения и 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/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>
		<item>
		<title>Разработка трёхмерной модели методом экструдирования в Three.js</title>
		<link>https://web.snauka.ru/issues/2026/04/104471</link>
		<comments>https://web.snauka.ru/issues/2026/04/104471#comments</comments>
		<pubDate>Wed, 01 Apr 2026 12:00:44 +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>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/04/104471</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Современные веб-технологии позволяют создавать сложные трёхмерные приложения непосредственно в браузере без необходимости установки дополнительного программного обеспечения. Одной из ключевых технологий является WebGL, обеспечивающая аппаратное ускорение графики и высокую производительность визуализации. Использование данной технологии открывает широкие возможности для разработки интерактивных приложений, включая обучающие системы, визуализацию [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
</em><em>к.ф.-м.н., </em><em>Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p style="background: white;"><span style="color: black;">Современные веб-технологии позволяют создавать сложные трёхмерные приложения непосредственно в браузере без необходимости установки дополнительного программного обеспечения. Одной из ключевых технологий является WebGL, обеспечивающая аппаратное ускорение графики и высокую производительность визуализации. Использование данной технологии открывает широкие возможности для разработки интерактивных приложений, включая обучающие системы, визуализацию данных и компьютерные игры.<br />
</span></p>
<p style="background: white;"><span style="color: black;">Библиотека Three.js значительно упрощает процесс разработки 3D-приложений, предоставляя разработчику удобные средства для работы с графическими объектами. Она позволяет оперировать такими понятиями, как сцена, камера, освещение и геометрия, что существенно снижает сложность разработки по сравнению с использованием низкоуровневого WebGL.<br />
</span></p>
<p style="background: white;"><span style="color: black;">Одним из важных методов создания трёхмерных объектов является экструдирование — процесс выдавливания двумерной фигуры в третье измерение. Этот метод широко применяется в компьютерной графике и позволяет быстро создавать объёмные модели на основе простых контуров.<br />
</span></p>
<p style="background: white;"><span style="color: black;">В процессе выполнения работы была разработана трёхмерная сцена с использованием библиотеки Three.js. Для этого была инициализирована камера типа PerspectiveCamera, задающая перспективную проекцию и положение наблюдателя в пространстве. Также были добавлены источники освещения, включая AmbientLight для равномерного освещения сцены и DirectionalLight для имитации направленного источника света. Отрисовка сцены осуществляется с помощью объекта WebGLRenderer, который обеспечивает вывод графики в браузере.<br />
</span></p>
<p style="background: white;"><span style="color: black;">Создание трёхмерного объекта начинается с задания его двумерного контура. Для этого используется класс Shape, позволяющий описывать фигуру с помощью последовательности точек на плоскости. В программной реализации контур задаётся с использованием методов moveTo и lineTo, которые определяют начальную точку и последующие вершины фигуры. Например, следующий фрагмент кода создаёт замкнутый многоугольник:<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">const shape = new THREE.Shape();<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">shape.moveTo(2, 3);<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">shape.lineTo(5, 2);<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">shape.lineTo(-1, -6);<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">shape.lineTo(-5, -4);<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">shape.lineTo(-2, 3);<br />
</span></p>
<p style="background: white;"><span style="color: black;">После задания контура выполняется его преобразование в трёхмерную геометрию с помощью класса ExtrudeGeometry. Для этого задаются параметры экструдирования, включая глубину выдавливания, количество шагов и параметры сглаживания краёв. Пример задания параметров приведён ниже:<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">const extrudeSettings = {<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> steps: 2,<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> depth: 40,<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> bevelEnabled: true,<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> bevelThickness: 1,<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> bevelSize: 1,<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> bevelOffset: 0,<br />
</span></p>
<p style="background: white; padding-left: 60px;"><span style="color: black;"> bevelSegments: 1<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">};<br />
</span></p>
<p style="background: white;"><span style="color: black;">Создание трёхмерной геометрии осуществляется с помощью следующей команды:<br />
</span></p>
<p style="background: white;"><span style="color: black;">const geometry = new THREE.ExtrudeGeometry(shape, extrudeSettings);<br />
</span></p>
<p style="background: white;"><span style="color: black;">В результате формируется объёмный объект, повторяющий форму исходного двумерного контура.<br />
</span></p>
<p style="background: white;"><span style="color: black;">Для визуализации объекта используются материалы и текстуры. В частности, применяется класс MeshPhongMaterial, позволяющий учитывать освещение и создавать более реалистичное отображение поверхности. Пример создания материала с текстурой:<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">var textureLoader = new THREE.TextureLoader();<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">var texture = textureLoader.load(&#8216;textures/4.jpg&#8217;);<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">var material = new THREE.MeshPhongMaterial({ map: texture });<br />
</span></p>
<p style="background: white;"><span style="color: black;">После создания геометрии и материала формируется трёхмерный объект, который добавляется в сцену:<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">const mesh = new THREE.Mesh(geometry, material);<br />
</span></p>
<p style="background: white; padding-left: 30px;"><span style="color: black;">scene.add(mesh);<br />
</span></p>
<p style="text-align: left;"><span><span style="color: black;">После добавления объекта сцена отображается в браузере. С помощью элементов управления, таких как OrbitControls, пользователь может вращать модель, изменять масштаб и исследовать объект с разных ракурсов.</span></span></p>
<p style="text-align: center;"><span><span style="color: black;">    <em><img src="https://web.snauka.ru/wp-content/uploads/2026/04/041026_0829_1.png" alt="" /></em><br />
</span>Рисунок 1. Отображение фигуры<em><br />
</em></span></p>
<p style="background: white;"><span style="color: black;">В результате выполнения работы была создана трёхмерная модель, полученная методом экструдирования. Разработанное приложение корректно функционирует в браузере и обеспечивает интерактивное взаимодействие пользователя со сценой.<br />
</span></p>
<p style="background: white;"><span style="color: black;">В ходе выполнения работы были изучены основные возможности библиотеки Three.js и реализован алгоритм построения трёхмерного объекта методом экструдирования на основе программного кода.<br />
</span></p>
<p style="background: white;"><span style="color: black;">Полученные знания позволяют разрабатывать современные веб-приложения, связанные с трёхмерной графикой, визуализацией и интерактивными интерфейсами, а также могут быть использованы в образовательных и практических целях.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/04/104471/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Моделирование стереометрических фигур в браузере с помощью WebGL</title>
		<link>https://web.snauka.ru/issues/2026/04/104432</link>
		<comments>https://web.snauka.ru/issues/2026/04/104432#comments</comments>
		<pubDate>Wed, 01 Apr 2026 14:58:21 +0000</pubDate>
		<dc:creator>author20348</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>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/04/104432</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Когда перед разработчиком встает задача отобразить трехмерные объекты в браузере, первое, что приходит на ум — использовать WebGL. Однако писать на чистом WebGL — занятие не для слабонервных. Слишком много деталей приходится контролировать вручную: буферы вершин, шейдеры, матрицы преобразований. Именно поэтому практически любой [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;" align="right"><em>Научный руководитель: Вильданов Алмаз Нафкатович<br />
к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал</em></p>
<p style="text-align: center;" align="right">
<p align="left">Когда перед разработчиком встает задача отобразить трехмерные объекты в браузере, первое, что приходит на ум — использовать WebGL. Однако писать на чистом WebGL — занятие не для слабонервных. Слишком много деталей приходится контролировать вручную: буферы вершин, шейдеры, матрицы преобразований. Именно поэтому практически любой проект в этой области начинается с подключения библиотеки Three.js. Она берет на себя всю низкоуровневую работу и позволяет сосредоточиться на самом главном — на том, что именно мы хотим показать пользователю.</p>
<p align="left">Задача, которая была поставлена, звучала просто: создать веб-страницу, на которой размещены девять различных стереометрических фигур, включая классический чайник Юты. Все фигуры должны располагаться на общей плоскости, иметь различимые цвета и возможность интерактивного осмотра. Никакой анимации или сложных эффектов не требовалось — только чистая геометрия и удобство восприятия.</p>
<p align="left">Первым делом подготавливается базовая HTML-структура. Здесь важно правильно организовать импорт модулей. Three.js использует модульную систему, поэтому на странице объявляется import map, который указывает, откуда загружать библиотеку и ее дополнения. Сам код пишется внутри тега script type=&#8221;module&#8221;, что позволяет использовать синтаксис импорта и экспорта прямо в браузере.</p>
<p align="left">&lt;!DOCTYPE html&gt;</p>
<p align="left">&lt;html lang=&#8221;ru&#8221;&gt;</p>
<p align="left">&lt;head&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;meta charset=&#8221;UTF-8&#8243;&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width, initial-scale=1.0&#8243;&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;title&gt;9 фигур + чайник на плоскости&lt;/title&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;style&gt;</p>
<p style="padding-left: 30px;" align="left">        body { margin: 0; overflow: hidden; background-color: #111; }</p>
<p style="padding-left: 30px;" align="left">    &lt;/style&gt;</p>
<p align="left">&lt;/head&gt;</p>
<p align="left">&lt;body&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;script type=&#8221;importmap&#8221;&gt;</p>
<p style="padding-left: 60px;" align="left">        {</p>
<p style="padding-left: 90px;" align="left">            &#8220;imports&#8221;: {</p>
<p style="padding-left: 120px;" align="left">                &#8220;three&#8221;: &#8220;https://unpkg.com/three@0.128.0/build/three.module.js&#8221;,</p>
<p style="padding-left: 120px;" align="left">                &#8220;three/addons/&#8221;: &#8220;https://unpkg.com/three@0.128.0/examples/jsm/&#8221;</p>
<p style="padding-left: 90px;" align="left">            }</p>
<p style="padding-left: 60px;" align="left">        }</p>
<p style="padding-left: 30px;" align="left">    &lt;/script&gt;</p>
<p style="padding-left: 30px;" align="left">    &lt;script type=&#8221;module&#8221;&gt;</p>
<p style="padding-left: 60px;" align="left">        // весь код приложения</p>
<p style="padding-left: 30px;" align="left">    &lt;/script&gt;</p>
<p align="left">&lt;/body&gt;</p>
<p align="left">&lt;/html&gt;</p>
<p align="center">Листинг 1 &#8211; Базовая структура HTML-документа и импорт зависимостей</p>
<p align="center">
<p align="left">Создание любой 3D-сцены в Three.js начинается с трех обязательных компонентов: сцены, камеры и рендерера. Сцена — это контейнер, в который помещаются все объекты, источники света и вспомогательные элементы. Камера определяет точку обзора — в данном случае выбрана перспективная камера с углом обзора 45 градусов, что приближает восприятие к тому, как человеческий глаз видит реальные объекты. Рендерер отвечает за отрисовку: он создает canvas-элемент и выводит на него изображение. Чтобы сцена не выглядела плоской, добавляется освещение. Два направленных источника света располагаются под разными углами, создавая четкие светотеневые переходы, а мягкий фоновый свет предотвращает появление слишком темных участков.</p>
<p align="left">
<p align="left">import * as THREE from &#8216;three&#8217;;</p>
<p align="left">import { OrbitControls } from &#8216;three/addons/controls/OrbitControls.js&#8217;;</p>
<p align="left">import { TeapotGeometry } from &#8216;three/addons/geometries/TeapotGeometry.js&#8217;;</p>
<p align="left">
<p align="left">const scene = new THREE.Scene();</p>
<p align="left">scene.background = new THREE.Color(0xeeeeee);</p>
<p align="left">
<p align="left">const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);</p>
<p align="left">camera.position.set(6, 4, 9);</p>
<p align="left">camera.lookAt(0, 1, 0);</p>
<p align="left">
<p align="left">const renderer = new THREE.WebGLRenderer({ antialias: true });</p>
<p align="left">renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p align="left">renderer.shadowMap.enabled = false;</p>
<p align="left">document.body.appendChild(renderer.domElement);</p>
<p align="left">
<p align="left">const dirLight1 = new THREE.DirectionalLight(0xffffff, 1.0);</p>
<p align="left">dirLight1.position.set(2, 5, 3);</p>
<p align="left">scene.add(dirLight1);</p>
<p align="left">
<p align="left">const dirLight2 = new THREE.DirectionalLight(0xffffff, 0.7);</p>
<p align="left">dirLight2.position.set(-3, 4, 4);</p>
<p align="left">scene.add(dirLight2);</p>
<p align="left">
<p align="left">const ambientLight = new THREE.AmbientLight(0&#215;404060);</p>
<p align="left">scene.add(ambientLight);</p>
<p align="center">Листинг 2 &#8211; Инициализация сцены, камеры, рендерера и освещения</p>
<p align="left">
<p align="left">Теперь, когда сцена готова к работе, необходимо создать опорную плоскость, на которой будут стоять фигуры. Для этого используется PlaneGeometry — плоский прямоугольник, который разворачивается горизонтально. Поверх него накладывается GridHelper — сетка, помогающая визуально оценить расположение объектов в пространстве. Эти два элемента создают необходимый контекст: фигуры не висят в пустоте, а имеют четкую привязку к поверхности.</p>
<p align="left">Для удобства добавления фигур написана небольшая функция-обертка addFigure. Она принимает геометрию, цвет и координаты положения, создает материал с заданными свойствами и помещает объект на сцену. Такой подход избавляет от повторяющегося кода и делает добавление новых фигур простым и наглядным.</p>
<p align="left">
<p align="left">const planeGeometry = new THREE.PlaneGeometry(14, 14);</p>
<p align="left">const planeMaterial = new THREE.MeshStandardMaterial({ color: 0xcccccc, side: THREE.DoubleSide });</p>
<p align="left">const plane = new THREE.Mesh(planeGeometry, planeMaterial);</p>
<p align="left">plane.rotation.x = Math.PI / 2;</p>
<p align="left">plane.position.y = 0;</p>
<p align="left">scene.add(plane);</p>
<p align="left">
<p align="left">const gridHelper = new THREE.GridHelper(14, 20, 0&#215;666666, 0&#215;333333);</p>
<p align="left">gridHelper.position.y = 0.01;</p>
<p align="left">scene.add(gridHelper);</p>
<p align="left">
<p align="left">function addFigure(geometry, color, position) {</p>
<p style="padding-left: 30px;" align="left">    const material = new THREE.MeshStandardMaterial({ color: color, roughness: 0.5, metalness: 0.0 });</p>
<p style="padding-left: 30px;" align="left">    const mesh = new THREE.Mesh(geometry, material);</p>
<p style="padding-left: 30px;" align="left">    mesh.position.set(position[0], position[1], position[2]);</p>
<p style="padding-left: 30px;" align="left">    scene.add(mesh);</p>
<p align="left">}</p>
<p align="left">
<p align="left">addFigure(new THREE.BoxGeometry(1, 1, 1), 0x3366ff, [-3.5, 0.5, -3.0]);</p>
<p align="left">addFigure(new THREE.ConeGeometry(0.7, 1.4, 4), 0xff9933, [-1.0, 0.7, -3.0]);</p>
<p align="left">addFigure(new THREE.SphereGeometry(0.8, 32, 16), 0xaa66ff, [2, 0.8, -3.0]);</p>
<p align="left">addFigure(new THREE.CylinderGeometry(0.7, 0.7, 1.4, 32), 0xf5deb3, [-2.6, 0.7, -0.5]);</p>
<p align="left">addFigure(new THREE.ConeGeometry(0.8, 1.5, 32), 0x33cc33, [0.9, 0.75, -0.5]);</p>
<p align="left">addFigure(new THREE.CylinderGeometry(0.7, 0.7, 1.2, 3), 0x99ff99, [-3.5, 0.6, 1.5]);</p>
<p align="left">addFigure(new THREE.BoxGeometry(1.2, 0.8, 0.8), 0xff4444, [-1, 0.4, 1.8]);</p>
<p align="left">addFigure(new THREE.CylinderGeometry(0.8, 0.8, 1.2, 6), 0xffdd44, [2, 0.6, 1.5]);</p>
<p align="left">
<p align="left">const teapotGeo = new TeapotGeometry(0.9, 12, true, true, true, true);</p>
<p align="left">const teapotMat = new THREE.MeshStandardMaterial({ color: 0&#215;222222, roughness: 0.3, metalness: 0.2 });</p>
<p align="left">const teapot = new THREE.Mesh(teapotGeo, teapotMat);</p>
<p align="left">teapot.position.set(-1.0, 1, 4);</p>
<p align="left">teapot.rotation.set(0, 0.2, 0);</p>
<p align="left">scene.add(teapot);</p>
<p align="left">
<p align="left">const controls = new OrbitControls(camera, renderer.domElement);</p>
<p align="left">controls.enableDamping = false;</p>
<p align="left">controls.autoRotate = false;</p>
<p align="left">controls.target.set(0, 0.8, 0);</p>
<p align="left">
<p align="left">function animate() {</p>
<p style="padding-left: 30px;" align="left">    requestAnimationFrame(animate);</p>
<p style="padding-left: 30px;" align="left">    controls.update();</p>
<p style="padding-left: 30px;" align="left">    renderer.render(scene, camera);</p>
<p align="left">}</p>
<p align="left">animate();</p>
<p align="left">
<p align="left">window.addEventListener(&#8216;resize&#8217;, () =&gt; {</p>
<p style="padding-left: 30px;" align="left">    camera.aspect = window.innerWidth / window.innerHeight;</p>
<p style="padding-left: 30px;" align="left">    camera.updateProjectionMatrix();</p>
<p style="padding-left: 30px;" align="left">    renderer.setSize(window.innerWidth, window.innerHeight);</p>
<p align="left">});</p>
<p align="center">Листинг 3 &#8211; Создание опорной плоскости, сетки, геометрических фигур и чайника</p>
<p align="center">
<p align="left">Восемь основных фигур размещаются в два ряда, чтобы их можно было легко рассмотреть как по отдельности, так и в сравнении. Куб, сфера, цилиндр и конус — это стандартные геометрические примитивы, которые в Three.js создаются соответствующими классами. Интереснее обстоит дело с призмами. Треугольная и шестиугольная призмы реализованы с помощью цилиндра, у которого количество сегментов уменьшено до трех и шести соответственно. Этот прием работает благодаря тому, что цилиндр с малым числом сегментов превращается в многогранник, а сглаживание граней делает его визуально похожим на призму.</p>
<p align="left">Отдельного внимания заслуживает чайник. Это не просто случайная фигура, а объект с историей. Чайник Юты был создан в 1975 году Мартином Ньюэллом как тестовая модель для систем трехмерной графики. Его форма содержит криволинейные поверхности, отверстия и сложные изгибы, что делает его отличным индикатором качества рендеринга. В Three.js чайник доступен через TeapotGeometry из дополнений, и его подключение занимает всего несколько строк кода.</p>
<p align="left">Для управления камерой используется OrbitControls. Этот контроллер позволяет пользователю вращать сцену, приближать и отдалять изображение, а также перемещать точку обзора. Такая интерактивность критически важна при работе с трехмерными объектами: только возможность рассмотреть фигуру со всех сторон дает полное представление о ее форме.</p>
<p align="left">Каждая фигура получила свой цвет, что не только делает сцену более наглядной, но и помогает быстро идентифицировать объекты. Синий куб, оранжевая пирамида, фиолетовая сфера, бежевый цилиндр, зеленый конус, салатовая треугольная призма, красный параллелепипед, желтая шестиугольная призма и черный чайник — все они четко различимы даже при беглом взгляде на сцену.</p>
<p align="left">Производительность приложения остается высокой благодаря нескольким решениям. Отключение теней (shadowMap.enabled = false) существенно снижает нагрузку на видеокарту, а разумный выбор количества сегментов у сферы (32×16) дает хорошее качество без избыточной геометрической сложности. Конечно, для более реалистичной сцены тени были бы полезны, но в учебно-демонстрационных задачах они часто оказываются излишними.</p>
<p align="left">После завершения всех настроек остается запустить цикл анимации. В Three.js это делается через requestAnimationFrame, который обеспечивает плавное обновление кадра. Даже если в сцене нет движущихся объектов, этот цикл необходим для корректной работы контроллеров и обработки изменений размера окна.</p>
<p align="center"><img class="aligncenter size-full wp-image-104440" title="risunok1" src="https://web.snauka.ru/wp-content/uploads/2026/04/risunok1.png" alt="" width="426" height="249" /></p>
<p align="center">Рисунок 1. Финальный вид сцены с возможностью вращения камеры</p>
<p style="text-align: left;" align="center"><strong>Заключение</strong><strong> </strong></p>
<p align="left">В результате выполнения работы разработано веб-приложение для визуализации стереометрических фигур с использованием WebGL и библиотеки Three.js. Созданная 3D-сцена включает девять геометрических объектов, реализованных с помощью стандартных примитивов библиотеки. Обеспечена интерактивность за счет подключения контроллера камеры, позволяющего пользователю вращать и масштабировать сцену. Разработанное приложение может быть использовано в образовательных целях для изучения основ стереометрии и демонстрирует возможности современных веб-технологий в области трехмерного моделирования.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/04/104432/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
