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

<channel>
	<title>Электронный научно-практический журнал «Современные научные исследования и инновации» &#187; 3D-моделирование</title>
	<atom:link href="http://web.snauka.ru/issues/tag/3d-modelirovanie/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>Создание интерактивных 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/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>
