<?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; стереометрические фигуры</title>
	<atom:link href="http://web.snauka.ru/issues/tag/stereometricheskie-figuryi/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/2026/02/104255</link>
		<comments>https://web.snauka.ru/issues/2026/02/104255#comments</comments>
		<pubDate>Wed, 25 Feb 2026 14:00:33 +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>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2026/02/104255</guid>
		<description><![CDATA[Научный руководитель: Вильданов Алмаз Нафкатович к.ф.-м.н., Уфимский университет науки и технологий, Нефтекамский филиал Введение Современные веб-технологии открывают новые возможности для визуализации трёхмерных объектов непосредственно в браузере без необходимости установки дополнительного программного обеспечения. WebGL (Web Graphics Library) представляет собой JavaScript API, позволяющий создавать интерактивную 3D-графику, работающую в любом современном браузере. Эта технология особенно актуальна для образовательных целей, где [...]]]></description>
			<content:encoded><![CDATA[<p style="background: white; text-align: center;"><em>Научный руководитель: <span style="color: #0f1115;">Вильданов Алмаз Нафкатович<br />
</span><span style="color: #0f1115;">к.ф.-м.н., </span><span style="color: #0f1115;">Уфимский университет науки и технологий, Нефтекамский филиал</span></em></p>
<p style="background: white;"><span style="color: #0f1115;"><strong>Введение<br />
</strong></span></p>
<p style="background: white;"><span style="color: #0f1115;">Современные веб-технологии открывают новые возможности для визуализации трёхмерных объектов непосредственно в браузере без необходимости установки дополнительного программного обеспечения. WebGL (Web Graphics Library) представляет собой JavaScript API, позволяющий создавать интерактивную 3D-графику, работающую в любом современном браузере. Эта технология особенно актуальна для образовательных целей, где наглядная демонстрация стереометрических фигур помогает студентам лучше понимать пространственные отношения и геометрические свойства объектов.<br />
</span></p>
<p style="background: white;"><span style="color: #0f1115;">Моделирование куба, пирамиды, сферы и других тел вращения с помощью WebGL и библиотеки Three.js (рисунок 1) открывает широкие возможности для создания виртуальных лабораторий, интерактивных учебных пособий и демонстрационных материалов. В условиях дистанционного обучения такие инструменты становятся незаменимыми для наглядного представления абстрактных математических концепций.<br />
</span></p>
<p style="background: white;"><span style="color: #0f1115;"><strong>Алгоритм моделирования стереометрических фигур<br />
</strong></span></p>
<p style="background: white;"><span style="color: #0f1115;">Процесс создания трёхмерных объектов в браузере включает последовательные шаги по настройке сцены, созданию геометрических примитивов и их анимации:<br />
</span></p>
<ul>
<li>
<div style="background: white;"><span style="color: #0f1115;">импортируем библиотеку Three.js в HTML-документ;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">создаём сцену, камеру и рендерер для отображения графики;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">устанавливаем позицию камеры и настраиваем перспективу;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">добавляем источники света для реалистичного отображения теней;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">создаём геометрические объекты (куб, пирамиду, сферу) с заданными размерами;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">определяем материалы и текстуры для поверхностей фигур;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">добавляем созданные объекты на сцену;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">реализуем анимацию вращения фигур с помощью requestAnimationFrame;<br />
</span></div>
</li>
<li>
<div style="background: white;"><span style="color: #0f1115;">обрабатываем изменения размеров окна браузера.<br />
</span></div>
</li>
</ul>
<p style="background: white;"><span style="color: #0f1115;">Этот алгоритм позволяет создавать интерактивные 3D-сцены с возможностью вращения, масштабирования и изменения параметров объектов в реальном времени. Для стереометрических фигур важно правильно настроить освещение, чтобы подчеркнуть их объём и грани.<br />
</span></p>
<p style="background: white;"><span style="color: #0f1115;"><strong>Реализация на JavaScript с Three.js<br />
</strong></span></p>
<p style="background: white;"><span style="color: #0f1115;">Ниже приведён фрагмент кода, демонстрирующий создание трёх стереометрических фигур (куба, пирамиды и сферы) с анимацией вращения:<br />
</span></p>
<p><span style="color: #0f1115;">javascript</span></p>
<p><span style="color: #a626a4;">import<span style="color: #0f1115;"> <span style="color: #4078f2;">*<span style="color: #0f1115;"> <span style="color: #a626a4;">as<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #0f1115;"> <span style="color: #a626a4;">from<span style="color: #0f1115;"> <span style="color: #50a14f;">&#8216;https://cdn.skypack.dev/three@0.132.2&#8242;<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> scene <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">Scene<span style="color: #383a42;">();</span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #0f1115;">background <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">Color<span style="color: #383a42;">(<span style="color: #b76b01;">0&#215;111122<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="color: #a626a4;">const<span style="color: #0f1115;"> camera <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">PerspectiveCamera<span style="color: #383a42;">(<span style="color: #b76b01;">75<span style="color: #383a42;">,<span style="color: #0f1115;"> window<span style="color: #383a42;">.<span style="color: #0f1115;">innerWidth <span style="color: #4078f2;">/<span style="color: #0f1115;"> window<span style="color: #383a42;">.<span style="color: #0f1115;">innerHeight<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">0.1<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">1000<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">camera<span style="color: #383a42;">.<span style="color: #0f1115;">position<span style="color: #383a42;">.<span style="color: #4078f2;">set<span style="color: #383a42;">(<span style="color: #b76b01;">0<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">2<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">10<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">camera<span style="color: #383a42;">.<span style="color: #4078f2;">lookAt<span style="color: #383a42;">(<span style="color: #b76b01;">0<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">0<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">0<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> renderer <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">WebGLRenderer<span style="color: #383a42;">({<span style="color: #0f1115;"> <span style="color: #e45649;">antialias<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #0f1115;"> <span style="color: #383a42;">});</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">renderer<span style="color: #383a42;">.<span style="color: #4078f2;">setSize<span style="color: #383a42;">(<span style="color: #0f1115;">window<span style="color: #383a42;">.<span style="color: #0f1115;">innerWidth<span style="color: #383a42;">,<span style="color: #0f1115;"> window<span style="color: #383a42;">.<span style="color: #0f1115;">innerHeight<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">renderer<span style="color: #383a42;">.<span style="color: #0f1115;">shadowMap<span style="color: #383a42;">.<span style="color: #0f1115;">enabled <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">document<span style="color: #383a42;">.<span style="color: #0f1115;">body<span style="color: #383a42;">.<span style="color: #4078f2;">appendChild<span style="color: #383a42;">(<span style="color: #0f1115;">renderer<span style="color: #383a42;">.<span style="color: #0f1115;">domElement<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></p>
<p><span style="color: #a626a4;">const<span style="color: #0f1115;"> ambientLight <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">AmbientLight<span style="color: #383a42;">(<span style="color: #b76b01;">0&#215;404060<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">ambientLight<span style="color: #383a42;">);</span></span></span></span></span></span></p>
<p><span style="color: #a626a4;">const<span style="color: #0f1115;"> directionalLight <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">DirectionalLight<span style="color: #383a42;">(<span style="color: #b76b01;">0xffffff<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">1<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">directionalLight<span style="color: #383a42;">.<span style="color: #0f1115;">position<span style="color: #383a42;">.<span style="color: #4078f2;">set<span style="color: #383a42;">(<span style="color: #b76b01;">5<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">10<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">7<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">directionalLight<span style="color: #383a42;">.<span style="color: #0f1115;">castShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">directionalLight<span style="color: #383a42;">);</span></span></span></span></span></span></p>
<p><span style="color: #a626a4;">const<span style="color: #0f1115;"> cubeGeometry <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">BoxGeometry<span style="color: #383a42;">(<span style="color: #b76b01;">2<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">2<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">2<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> cubeMaterial <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">MeshStandardMaterial<span style="color: #383a42;">({</span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #0f1115;"><span style="color: #e45649;">color<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0x44aa88<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">emissive<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0&#215;112233<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">roughness<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.4<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">metalness<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.1</span></span></span></span></span></p>
<p><span style="color: #383a42;">});</span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> cube <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">Mesh<span style="color: #383a42;">(<span style="color: #0f1115;">cubeGeometry<span style="color: #383a42;">,<span style="color: #0f1115;"> cubeMaterial<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">cube<span style="color: #383a42;">.<span style="color: #0f1115;">position<span style="color: #383a42;">.<span style="color: #4078f2;">set<span style="color: #383a42;">(<span style="color: #4078f2;">-<span style="color: #b76b01;">3<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">1<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">0<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">cube<span style="color: #383a42;">.<span style="color: #0f1115;">castShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">cube<span style="color: #383a42;">.<span style="color: #0f1115;">receiveShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">cube<span style="color: #383a42;">);</span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> pyramidGeometry <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">ConeGeometry<span style="color: #383a42;">(<span style="color: #b76b01;">1.2<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">2.5<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">4<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> pyramidMaterial <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">MeshStandardMaterial<span style="color: #383a42;">({</span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #0f1115;"><span style="color: #e45649;">color<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0xaa44aa<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">emissive<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0&#215;221122<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">roughness<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.3<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">metalness<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.2</span></span></span></span></span></p>
<p><span style="color: #383a42;">});</span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> pyramid <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">Mesh<span style="color: #383a42;">(<span style="color: #0f1115;">pyramidGeometry<span style="color: #383a42;">,<span style="color: #0f1115;"> pyramidMaterial<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">pyramid<span style="color: #383a42;">.<span style="color: #0f1115;">position<span style="color: #383a42;">.<span style="color: #4078f2;">set<span style="color: #383a42;">(<span style="color: #b76b01;">0<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">1.25<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">0<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">pyramid<span style="color: #383a42;">.<span style="color: #0f1115;">castShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">pyramid<span style="color: #383a42;">.<span style="color: #0f1115;">receiveShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">pyramid<span style="color: #383a42;">);</span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> sphereGeometry <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">SphereGeometry<span style="color: #383a42;">(<span style="color: #b76b01;">1.3<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">32<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">32<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> sphereMaterial <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">MeshStandardMaterial<span style="color: #383a42;">({</span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #0f1115;"><span style="color: #e45649;">color<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0xaa4444<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">emissive<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0&#215;221111<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">roughness<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.2<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">metalness<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.3</span></span></span></span></span></p>
<p><span style="color: #383a42;">});</span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> sphere <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">Mesh<span style="color: #383a42;">(<span style="color: #0f1115;">sphereGeometry<span style="color: #383a42;">,<span style="color: #0f1115;"> sphereMaterial<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">sphere<span style="color: #383a42;">.<span style="color: #0f1115;">position<span style="color: #383a42;">.<span style="color: #4078f2;">set<span style="color: #383a42;">(<span style="color: #b76b01;">3<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">1.3<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">0<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">sphere<span style="color: #383a42;">.<span style="color: #0f1115;">castShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">sphere<span style="color: #383a42;">.<span style="color: #0f1115;">receiveShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">sphere<span style="color: #383a42;">);</span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> planeGeometry <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">PlaneGeometry<span style="color: #383a42;">(<span style="color: #b76b01;">15<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #b76b01;">10<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> planeMaterial <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">MeshStandardMaterial<span style="color: #383a42;">({</span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #0f1115;"><span style="color: #e45649;">color<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0&#215;335577<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">side<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #0f1115;">DoubleSide<span style="color: #383a42;">,</span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">transparent<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">,</span></span></span></span></span></span><br />
<span style="color: #0f1115;"> <span style="color: #e45649;">opacity<span style="color: #4078f2;">:<span style="color: #0f1115;"> <span style="color: #b76b01;">0.7</span></span></span></span></span></p>
<p><span style="color: #383a42;">});</span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> plane <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">Mesh<span style="color: #383a42;">(<span style="color: #0f1115;">planeGeometry<span style="color: #383a42;">,<span style="color: #0f1115;"> planeMaterial<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">plane<span style="color: #383a42;">.<span style="color: #0f1115;">rotation<span style="color: #383a42;">.<span style="color: #0f1115;">x <span style="color: #4078f2;">=<span style="color: #0f1115;"> Math<span style="color: #383a42;">.<span style="color: #b76b01;">PI<span style="color: #0f1115;"> <span style="color: #4078f2;">/<span style="color: #0f1115;"> <span style="color: #b76b01;">2<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">plane<span style="color: #383a42;">.<span style="color: #0f1115;">position<span style="color: #383a42;">.<span style="color: #0f1115;">y <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">0<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">plane<span style="color: #383a42;">.<span style="color: #0f1115;">receiveShadow <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #b76b01;">true<span style="color: #383a42;">;</span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">plane<span style="color: #383a42;">);</span></span></span></span></span></span><br />
<span style="color: #a626a4;">const<span style="color: #0f1115;"> axesHelper <span style="color: #4078f2;">=<span style="color: #0f1115;"> <span style="color: #a626a4;">new<span style="color: #0f1115;"> <span style="color: #b76b01;">THREE<span style="color: #383a42;">.<span style="color: #b76b01;">AxesHelper<span style="color: #383a42;">(<span style="color: #b76b01;">5<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;">scene<span style="color: #383a42;">.<span style="color: #4078f2;">add<span style="color: #383a42;">(<span style="color: #0f1115;">axesHelper<span style="color: #383a42;">);</span></span></span></span></span></span><br />
<span style="color: #a626a4;">function<span style="color: #0f1115;"> <span style="color: #4078f2;">animate<span style="color: #383a42;">()<span style="color: #0f1115;"> <span style="color: #383a42;">{</span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #0f1115;"><span style="color: #4078f2;">requestAnimationFrame<span style="color: #383a42;">(<span style="color: #0f1115;">animate<span style="color: #383a42;">);</span></span></span></span></span><br />
<span style="color: #0f1115;"> cube<span style="color: #383a42;">.<span style="color: #0f1115;">rotation<span style="color: #383a42;">.<span style="color: #0f1115;">x <span style="color: #4078f2;">+=<span style="color: #0f1115;"> <span style="color: #b76b01;">0.01<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> cube<span style="color: #383a42;">.<span style="color: #0f1115;">rotation<span style="color: #383a42;">.<span style="color: #0f1115;">y <span style="color: #4078f2;">+=<span style="color: #0f1115;"> <span style="color: #b76b01;">0.01<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> pyramid<span style="color: #383a42;">.<span style="color: #0f1115;">rotation<span style="color: #383a42;">.<span style="color: #0f1115;">y <span style="color: #4078f2;">+=<span style="color: #0f1115;"> <span style="color: #b76b01;">0.02<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> sphere<span style="color: #383a42;">.<span style="color: #0f1115;">rotation<span style="color: #383a42;">.<span style="color: #0f1115;">x <span style="color: #4078f2;">+=<span style="color: #0f1115;"> <span style="color: #b76b01;">0.005<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> sphere<span style="color: #383a42;">.<span style="color: #0f1115;">rotation<span style="color: #383a42;">.<span style="color: #0f1115;">y <span style="color: #4078f2;">+=<span style="color: #0f1115;"> <span style="color: #b76b01;">0.01<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> renderer<span style="color: #383a42;">.<span style="color: #4078f2;">render<span style="color: #383a42;">(<span style="color: #0f1115;">scene<span style="color: #383a42;">,<span style="color: #0f1115;"> camera<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></p>
<p><span style="color: #383a42;">}</span><br />
<span style="color: #4078f2;">animate<span style="color: #383a42;">();</span></span><br />
<span style="color: #0f1115;">window<span style="color: #383a42;">.<span style="color: #4078f2;">addEventListener<span style="color: #383a42;">(<span style="color: #50a14f;">&#8216;resize&#8217;<span style="color: #383a42;">,<span style="color: #0f1115;"> <span style="color: #383a42;">()<span style="color: #0f1115;"> <span style="color: #4078f2;">=&gt;<span style="color: #0f1115;"> <span style="color: #383a42;">{</span></span></span></span></span></span></span></span></span></span></span></span></p>
<p style="padding-left: 30px;"><span style="color: #0f1115;">camera<span style="color: #383a42;">.<span style="color: #0f1115;">aspect <span style="color: #4078f2;">=<span style="color: #0f1115;"> window<span style="color: #383a42;">.<span style="color: #0f1115;">innerWidth <span style="color: #4078f2;">/<span style="color: #0f1115;"> window<span style="color: #383a42;">.<span style="color: #0f1115;">innerHeight<span style="color: #383a42;">;</span></span></span></span></span></span></span></span></span></span></span></span><br />
<span style="color: #0f1115;"> camera<span style="color: #383a42;">.<span style="color: #4078f2;">updateProjectionMatrix<span style="color: #383a42;">();</span></span></span></span><br />
<span style="color: #0f1115;"> renderer<span style="color: #383a42;">.<span style="color: #4078f2;">setSize<span style="color: #383a42;">(<span style="color: #0f1115;">window<span style="color: #383a42;">.<span style="color: #0f1115;">innerWidth<span style="color: #383a42;">,<span style="color: #0f1115;"> window<span style="color: #383a42;">.<span style="color: #0f1115;">innerHeight<span style="color: #383a42;">);</span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="color: #383a42;">});</span></p>
<p style="background: white;"><span style="color: #0f1115;"><strong>Заключение<br />
</strong></span></p>
<p style="background: white;"><span style="color: #0f1115;">WebGL и библиотека Three.js предоставляют мощные инструменты для создания интерактивных трёхмерных моделей непосредственно в браузере. Реализованный алгоритм позволяет наглядно демонстрировать стереометрические фигуры с возможностью их вращения и масштабирования. Такие решения особенно востребованы в образовательном процессе для визуализации геометрических понятий и пространственных отношений. Код легко адаптируется под различные задачи и может быть расширен для создания сложных сцен с множеством объектов. Технология остаётся актуальной благодаря кроссплатформенности и отсутствию необходимости в установке дополнительного ПО.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2026/02/104255/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>
