<?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/animatsiya/feed" rel="self" type="application/rss+xml" />
	<link>https://web.snauka.ru</link>
	<description></description>
	<lastBuildDate>Sat, 18 Apr 2026 09:41:14 +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>Реализация мультимедийного приложения на языке программирования С++ посредством использования библиотеки SFML</title>
		<link>https://web.snauka.ru/issues/2015/12/61029</link>
		<comments>https://web.snauka.ru/issues/2015/12/61029#comments</comments>
		<pubDate>Sun, 13 Dec 2015 14:13:44 +0000</pubDate>
		<dc:creator>Карандеева Ирина Юрьевна</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[Library SFML]]></category>
		<category><![CDATA[multimedia application]]></category>
		<category><![CDATA[programming language C ++]]></category>
		<category><![CDATA[анимация]]></category>
		<category><![CDATA[библиотека SFML]]></category>
		<category><![CDATA[мультимедийное приложение]]></category>
		<category><![CDATA[язык программирования C++]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/issues/2015/12/61029</guid>
		<description><![CDATA[Введение На сегодняшний день существует достаточно много языков программирования, часть из них применима для написания игр, часть — для скриптинга, часть — для каких-то специальных целей. Если говорить про написание кода программных обеспечений, то тут исторически наиболее распространён язык программирования C++. Язык С++ проектировался для поддержки абстракции данных и объектно-ориентированного программирования в добавление к традиционному [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Введение</strong></p>
<p style="text-align: justify;"><span><span style="color: black;">На сегодняшний день существует достаточно много языков программирования, часть из них применима для написания игр, часть — для скриптинга, часть — для каких-то специальных целей. Если говорить про написание кода программных обеспечений, то тут исторически наиболее распространён язык программирования C++. </span>Язык С++ проектировался для поддержки абстракции данных и объектно-ориентированного программирования в добавление к традиционному стилю С [1]. C++ и по сей день занимает господствующее положение среди языков программирования в мире.<strong><br />
</strong></span></p>
<p style="text-align: justify;"><span>SFML (Simple and Fast Multimedia Library) — высокоуровневая библиотека, позволяющая разрабатывать мультимедийные приложения, при этом данная библиотека является лучшей альтернативой низкоуровневой библиотеки OpenGL. SFML обеспечивает простой интерфейс для разработки игр и прочих мультимедийных приложений. Она состоит из пяти модулей: system, window, graphics, audio и network [2]. SFML является кроссплатформенной библиотекой, а это значит, что разработанные приложения будут работать на большинстве операционных систем. SFML поддерживает большое число языков программирования, является упрощенным в использование аналогом SDL. Благодаря тому, что SFML является в отличие от OpenGL высокоуровневой библиотекой, это позволяет добавлять анимацию и музыку в приложение без особых проблем.<br />
</span></p>
<p style="text-align: justify;"><span>В перспективе возможности данной библиотеки могут быть использованы при создании более серьезных и полезных программных обеспечений, в частности, при реализации графического интерфейса программ, способных реализовывать построение сложных технических систем [3-5]. Так как возможность увеличения уровня интерактивности посредством добавления качественного и интуитивного графического интерфейса может способствовать более быстрому включению в работу в процессе проектирования сложных технических систем экспертов, которые бы использовали разработанное программное обеспечение при построении оптимальных структур сложных технических систем.<br />
</span></p>
<p><strong>Создание мультимедийного приложения на языке программирования С++ посредством библиотеки SFML</strong></p>
<p style="text-align: justify;"><span>В качестве примера, демонстрирующего возможности библиотеки SFML, было принято решение создать платформер в стилистике игр на Sega и Dendy. При этом главным положительным и, соответственно, управляемым персонажем было принято решение сделать персонажа игры Sonic – Tails, главным же врагом стал Mario, как известно Sonic и Mario в те времена являлись главными соперниками на рынке игровой индустрии.<br />
</span></p>
<p><strong>1.Анимация движения персонажей</strong></p>
<p style="text-align: justify;"><span>Для начала при создании платформера на языке C++ необходимо продумать, как будет прорисовываться анимация персонажей Tails и Mario, соответственно, так как именно они в платформере передвигаются. Для этого используется быстрый перебор тайлов, который и приводит к иллюзии движения персонажей:<br />
</span></p>
<p style="text-align: center;"><img src="https://web.snauka.ru/wp-content/uploads/2015/12/121315_1406_1.jpg" alt="" /><span><br />
</span></p>
<p style="text-align: center;"><span>Рисунок 1 – Тайлсеты для создания анимации движения персонажей<br />
</span></p>
<p><span>На языке С++ код имеет такой вид:<br />
</span></p>
<p><span style="color: blue; consolas; background-color: white;">void<span style="color: black;"> update(<span style="color: blue;">float <span style="color: black;"><span style="color: gray;">time<span style="color: black;">)<br />
</span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">{<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    control();<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">switch<span style="color: black;"> (state) {<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">case<span style="color: black;"> right:dx = speed; <span style="color: blue;">break<span style="color: black;">;<br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">case<span style="color: black;"> left:dx = -speed; <span style="color: blue;">break<span style="color: black;">;<br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">case<span style="color: black;"> up: <span style="color: blue;">break<span style="color: black;">;<br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">case<span style="color: black;"> down: dx = 0; <span style="color: blue;">break<span style="color: black;">;<br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">case<span style="color: black;"> stay: <span style="color: blue;">break<span style="color: black;">;<br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    }<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    x += dx*<span style="color: gray;">time<span style="color: black;">;<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    checkCollisionWithMap(dx, 0);<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    y += dy*<span style="color: gray;">time<span style="color: black;">;<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    checkCollisionWithMap(0, dy);<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    sprite.setPosition(x + w / 2, y + h / 2);<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    dy = dy + 0.0015*<span style="color: gray;">time<span style="color: black;">;<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    currentFrame += <span style="color: gray;">time<span style="color: black;"> * 0.005;<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (currentFrame &gt; 7) currentFrame -= 7;<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (dx&gt;0) sprite.setTextureRect(IntRect(0 + 45 * <span style="color: blue;">int<span style="color: black;">(currentFrame), 140, 45, 32));<br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">}<br />
</span></p>
<p style="text-align: justify;"><span>Где sprite – это вырезанная из Тайлсета текстура с размерами 45*32, при этом начальная координата задана x=0, y=45; затем если sprite меняется на тайл с координатами 0, 90, затем 0,135, а затем дойдя до 7 тайла, он как видно из этого кода    &#8221;if (currentFrame &gt; 7) currentFrame -= 7;&#8221; снова начинает перебирать тайлы c самого сначала, таким образом, создается иллюзия движения персонажа. При желание можно за место данного тайлсета использовать какой-нибудь более качественный и современный тайлсет, эффект движения при этом значительно улучшится.<br />
</span></p>
<p style="text-align: justify;"><span>Однако персонаж должен уметь двигаться не только вправо, но и как минимум влево, для этого необходимо лишь добавить следующую строчку кода if (dx&lt;0) sprite.setTextureRect(IntRect(0 + 45 * int(currentFrame) + 45, 140, -45, 32)); и спрайты попросту буду зеркально отражаться при движение вправо.<br />
</span></p>
<p style="text-align: justify;"><span>Далее необходимо прописать код, описывающий то, как мы будет управлять движение персонажа:<br />
</span></p>
<p><span style="color: blue; consolas; background-color: white;">void<span style="color: black;"> control(){<br />
</span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (health &gt; 0) {<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">        <span style="color: blue;">if<span style="color: black;"> (Keyboard::isKeyPressed){<br />
</span></span></span></p>
<p style="text-align: justify;"><span style="color: black;"><span style="background-color: white;">            <span style="color: blue;">if<span style="color: black;"> ((Keyboard::isKeyPressed(Keyboard::Left))) { state = left; speed = 0.1; }…</span></span></span><br />
</span></p>
<p style="text-align: justify;"><span>То есть при нажатие на клавишу Left, персонаж начинает двигаться влево и при этом создается иллюзия его передвижения. Аналогично можно прописать код для действий при нажатии прочих клавиш. Анимация Mario была прописана аналогично.<br />
</span></p>
<p><strong>2.Загрузка карты и ее скроллинг</strong></p>
<p style="text-align: justify;"><span>Вторым пунктом является загрузка карты и ее скроллинг. Для создания карты использовался специальный редактор карт Tiled Map Editor (TMP). Он хорош тем, что карту, созданную в этом редакторе, состоящем из объектов, тайлов и их слоев, можно сохранить в XML-подобном файле с расширением .tmx и затем с помощью специальной библиотеки TinyXML на C++ считать ее.<br />
</span></p>
<p style="text-align: justify;"><span>В целях того, чтобы не было видно тех участков, которые находятся за границами карты, был написан следующий код:<br />
</span></p>
<p><span style="color: blue; consolas; background-color: white;">#include <span style="color: black;"><span style="color: #a31515;">&lt;SFML/Graphics.hpp&gt;<span style="color: black;"><br />
</span></span></span></span></p>
<p><span style="color: blue; consolas; background-color: white;">using <span style="color: black;"><span style="color: blue;">namespace<span style="color: black;"> sf;<br />
</span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">sf::<span style="color: #2b91af;">View<span style="color: black;"> view;<br />
</span></span></span></p>
<p><span style="color: blue; consolas; background-color: white;">void<span style="color: black;"> setPlayerCoordinateForView(<span style="color: blue;">float <span style="color: black;"><span style="color: gray;">x<span style="color: black;">, <span style="color: blue;">float <span style="color: black;"><span style="color: gray;">y<span style="color: black;">) {<br />
</span></span></span></span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">float<span style="color: black;"> tempX = <span style="color: gray;">x<span style="color: black;">; <span style="color: blue;">float<span style="color: black;"> tempY = <span style="color: gray;">y<span style="color: black;">;<br />
</span></span></span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (<span style="color: gray;">x<span style="color: black;"> &lt; 320) tempX = 320;<span style="color: green;">//левая сторона карты<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (<span style="color: gray;">x<span style="color: black;"> &gt; 2300) tempX = 2300;<span style="color: green;">//правая сторона<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (<span style="color: gray;">y<span style="color: black;"> &lt; 240) tempY = 240;<span style="color: green;">//верхняя сторона<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">if<span style="color: black;"> (<span style="color: gray;">y<span style="color: black;"> &gt; 300) tempY = 300;<span style="color: green;">//нижняя сторона<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black;"><span style="background-color: white;">    view.setCenter(tempX, tempY);}</span><br />
</span></p>
<p><strong>3.Взаимодействие персонажа с картой</strong></p>
<p style="text-align: justify;"><span>Для того чтобы персонажи начали физически взаимодействовать с элементами карты необходимо продумать физику игры. Для взаимодействия главного персонажа с элементами карты был написан следующий код:<br />
</span></p>
<p><span style="color: blue; consolas; background-color: white;">void<span style="color: black;"> checkCollisionWithMap(<span style="color: blue;">float<span style="color: black;"> Dx, <span style="color: blue;">float<span style="color: black;"> Dy) <span style="color: green;">//взаимодействие с картой<span style="color: black;"><br />
</span></span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">     {<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">         <span style="color: blue;">for<span style="color: black;"> (<span style="color: blue;">int<span style="color: black;"> i = 0; i&lt;obj.size(); i++)<span style="color: green;">//проходимся по объектам<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">         <span style="color: blue;">if<span style="color: black;"> (getRect().intersects(obj[i].rect))<span style="color: green;">//проверяем пересечение игрока с объектом<span style="color: black;"><br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">         {<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">             <span style="color: blue;">if<span style="color: black;"> (obj[i].name == <span style="color: #a31515;">&#8220;solid&#8221;<span style="color: black;">)<span style="color: green;">//если встретили препятствие<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">             {<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">                 <span style="color: blue;">if<span style="color: black;"> (Dy&gt;0)    { y = obj[i].rect.top &#8211; h; dy = 0; onGround = <span style="color: blue;">true<span style="color: black;">; } <span style="color: green;">//если препятствие снизу, то скорость падения равняется 0 и наш персонаж находится на земле<span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">                 <span style="color: blue;">if<span style="color: black;"> (Dy&lt;0)    { y = obj[i].rect.top + obj[i].rect.height; dy = 0; }<span style="color: green;">//если препятствие сверху<span style="color: black;"><br />
</span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">                 <span style="color: blue;">if<span style="color: black;"> (Dx&gt;0)    { x = obj[i].rect.left &#8211; w; }<span style="color: green;">//препятствие справа<span style="color: black;"><br />
</span></span></span></span></span></p>
<p><span style="color: black;"><span style="background-color: white;">                 <span style="color: blue;">if<span style="color: black;"> (Dx&lt;0)    { x = obj[i].rect.left + obj[i].rect.width; }<span style="color: green;">//препятствие с</span></span></span></span>лева<span style="background-color: white;"><br />
</span></span></p>
<p style="text-align: justify;"><span style="color: black;"><span style="background-color: white;">             }</span><span style="color: green;"><br />
</span></span></p>
<p style="text-align: justify;"><span>Аналогично было прописано взаимодействия с картой Марио, с то лишь разницей, что он должен непрерывно ходит справа налево, то есть, на карте его необходимо огородить двумя препятствиями. При этом скорость Марио была задана случайной величиной, то есть Марио постоянно меняет скорость своего передвижение, тем самым усложняя игру.<br />
</span></p>
<p><img class="aligncenter" src="https://web.snauka.ru/wp-content/uploads/2015/12/121315_1406_2.png" alt="" /></p>
<p style="text-align: center;"><span>Рисунок 2 – Расположения персонажа Mario на карте<br />
</span></p>
<p><strong>4.Взаимодействие с врагом</strong></p>
<p style="text-align: justify;"><span>У любого платформера есть какая-либо цель, миссия, после выполнения которой игра заканчивается либо победой игрока, либо его поражением. В данном платформере в качестве примера было принято решение целью игры сделать победу персонажа игры Sonic – Tails над персонажем из другой игровой вселенной – Mario. Для этого необходимо, во-первых, прописать последствия их столкновений, во-вторых, дать некоторое количество жизней Mario (например, 100) и, в-третьих, прописать два варианта событий – победа и поражение в игре. В следующем коде представлен результат:<br />
</span></p>
<p><span style="color: blue; consolas; background-color: white;">if<span style="color: black;"> (p.getRect().intersects(easyEnemy.getRect())) <span style="color: green;">//проверяем пересечение игрока с врагом<span style="color: black;"><br />
</span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">        {<span style="color: blue;">if<span style="color: black;"> ((p.dy &gt; 0)&amp;(p.onGround == <span style="color: blue;">false<span style="color: black;">)&amp;(easyEnemy.health &gt; 0)) { p.dy = -1; easyEnemy.health -= 25; }<span style="color: green;">/*Если игрок падает сверху на еще живого Mario, то он отскакивает от него вверх и при этом количество жизней Mario сокращается на 25*/ <span style="color: black;"><br />
</span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">        <span style="color: blue;">else<span style="color: black;"><br />
<span style="color: blue;">if<span style="color: black;"> ((easyEnemy.health &gt; 0)) {p.sprite.setColor(<span style="color: #2b91af;">Color<span style="color: black;">::Red); p.health-=100;{text2.setString(<span style="color: #a31515;">&#8220;GAME OVER&#8221;<span style="color: black;">); text2.setPosition(view.getCenter().x &#8211; 160, view.getCenter().y &#8211; 0); }} <span style="color: green;">//Если игрока убил Mario, то появляется надпись красного цвета <span style="color: red;">GAME OVER<span style="color: green;"> и экран игры начинает крутится против часовой стрелки, сам же Tails окрашивается в красный цвет. <span style="color: black;"><br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">        <span style="color: blue;">else<span style="color: black;"><br />
<span style="color: blue;">if<span style="color: black;"> (easyEnemy.health &lt;= 0) { easyEnemy.dx = 0; easyEnemy.sprite.setTextureRect(<span style="color: #2b91af;">IntRect<span style="color: black;">(-4, 20, 60, 20)); text2.setString(<span style="color: #a31515;">&#8220;YOU WIN&#8221;<span style="color: black;">); text2.setColor(<span style="color: #2b91af;">Color<span style="color: black;">::Green); text2.setPosition(view.getCenter().x &#8211; 160, view.getCenter().y &#8211; 0); }} <span style="color: green;">//Если игрок 4 раза прыгнул на Mario, то появляется надпись зеленого цвета <span style="color: #00b050;">YOU WIN.<br />
</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p><span style="times new roman; 14pt; background-color: white;">На рисунке 3 представлены два возможных исхода игры:<br />
</span></p>
<p><img class="aligncenter" src="https://web.snauka.ru/wp-content/uploads/2015/12/121315_1406_3.jpg" alt="" /><img class="aligncenter" src="https://web.snauka.ru/wp-content/uploads/2015/12/121315_1406_4.jpg" alt="" /></p>
<p style="text-align: center;"><span style="color: black; times new roman; 14pt; background-color: white;">Рисунок 3 – Два возможных результата игры победа и поражение главного героя<br />
</span></p>
<p><strong>5.Звук</strong></p>
<p style="text-align: justify;"><span>Благодаря тому, что в качестве мультимедийной библиотеки в данной работе используется SFML, которая является высокоуровневой библиотекой, это позволяет добавлять в приложение музыку, в частности как фоновую, так и для озвучивания отдельных движений, например, прыжков героя. В качестве фоновой музыки была выбрана заглавная композиция фильма Рокки. Для добавления музыкального сопровождения необходимо подключить </span><span style="color: blue;"><span style="background-color: white;">#include<span style="color: black;"><br />
<span style="color: #a31515;">&lt;SFML/Audio.hpp&gt;</span></span></span><br />
</span><span>и прописать в главной функции следующий код:<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: #2b91af;">Music<span style="color: black;"> music;<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    music.openFromFile(<span style="color: #a31515;">&#8220;Music.ogg&#8221;<span style="color: black;">);<br />
</span></span></span></p>
<p><span style="color: black; consolas; background-color: white;">    music.play();<br />
</span></p>
<p><span style="color: black; consolas; background-color: white;">    <span style="color: #2b91af;">Music<span style="color: black;"> jumper;<br />
</span></span></span></p>
<p style="text-align: justify;"><span style="color: black;"><span style="consolas; background-color: white;">    jumper.openFromFile(<span style="color: #a31515;">&#8220;Jump.ogg&#8221;<span style="color: black;">);</span></span></span><span><br />
</span></span></p>
<p><span><br />
</span><span style="color: black; consolas; background-color: white;">    <span style="color: blue;">while<span style="color: black;"> (window.isOpen())<br />
</span></span></span></p>
<p><span style="color: black;"><span style="background-color: white;">    {    <span style="color: blue;">if<span style="color: black;"> (p.state == p.<span style="color: darkslategray;">jump<span style="color: black;">) jumper.play();</span></span></span></span></span><br />
</span>… }</p>
<p><strong>6.Дополнительные элементы</strong></p>
<p style="text-align: justify;"><span>Помимо вышеизложенного в игру было добавлено несколько дополнительных элементов, позволяющих разнообразить процесс игры. Это бонусы ускорения скорости, при взятии этого бонуса скорость героя значительно увеличивается; батуты, прыгая на которые герой взлетает на значительную высоту. Также помимо этого было добавлена анимация при прыжках и прочих движения героя. В перспективе есть возможность добавления искусственной нейронной сети в качестве интеллекта для врага. Для того чтобы игра работала значительно быстрее даже на слабых компьютерах в главной функции был прописан следующий код: </span><span style="color: black; consolas; 9pt; background-color: white;"><br />
</span></p>
<p><span style="color: blue; consolas; background-color: white;">float<span style="color: black;"> time = clock.getElapsedTime().asMicroseconds();<br />
</span></span></p>
<p><span style="color: black; consolas; background-color: white;">        clock.restart();<br />
</span></p>
<p style="text-align: justify;"><span style="color: black;"><span style="background-color: white;">        time = time / 800;</span>// позволяет задавать скорость игры</span><span><br />
</span></p>
<p style="text-align: left;"><span style="color: black;"><strong>Заключение<br />
</strong></span></p>
<p style="text-align: justify;"><span>В данной работе было продемонстрировано разработанное автором на языке высокого уровня С++ мультимедийное приложение с использованием библиотеки SFML. Данное приложение представляет собой анимационный платформер в стилистике олдскульных игр прошлого столетия. Данная работа демонстрирует обширные графические и мультимедийные возможности библиотеки SFML. На данный момент при написании подобного рода приложений используют низкоуровневую библиотеку OpenGL, но возможности данной библиотеки ограничены в сравнении с библиотекой SFML. Результаты данной работы свидетельствуют о том, что в перспективе данную библиотеку можно использовать не только для создания игр, но также и при реализации достаточно серьезных проектов, требующих качественную анимацию и обширные графические возможности. Например, при реализации программного обеспечения позволяющего проектировать сложные технические системы с графической составляющей для более наглядного представления информации.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2015/12/61029/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Применение 3D-моделирования в кино и видео-индустрии</title>
		<link>https://web.snauka.ru/issues/2017/01/77658</link>
		<comments>https://web.snauka.ru/issues/2017/01/77658#comments</comments>
		<pubDate>Wed, 25 Jan 2017 14:32:36 +0000</pubDate>
		<dc:creator>Кизилов Евгений Евгеньевич</dc:creator>
				<category><![CDATA[05.00.00 ТЕХНИЧЕСКИЕ НАУКИ]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[анимация]]></category>
		<category><![CDATA[кино]]></category>
		<category><![CDATA[киноиндустрия]]></category>
		<category><![CDATA[композитинг]]></category>
		<category><![CDATA[компьютерная графика]]></category>
		<category><![CDATA[моделирование]]></category>
		<category><![CDATA[риггинг]]></category>
		<category><![CDATA[текстурирование]]></category>

		<guid isPermaLink="false">https://web.snauka.ru/?p=77658</guid>
		<description><![CDATA[Развиваясь, человечество всегда стремилось к совершенствованию способов воплощения в жизнь своего восприятия окружающего мира. Долгий путь развития компьютерной техники и программного обеспечения привел к появлению 3D-моделирования. Мощные программы компьютерной графики  реализуют воплощение идеи в готовый, видимый результат, позволяют создавать объемные модели любого объекта с фотографической точностью. Сейчас, чтобы оценить достоинства и недостатки программы, нужно лишь [...]]]></description>
			<content:encoded><![CDATA[<p>Развиваясь, человечество всегда стремилось к совершенствованию способов воплощения в жизнь своего восприятия окружающего мира. Долгий путь развития компьютерной техники и программного обеспечения привел к появлению 3D-моделирования. Мощные программы компьютерной графики  реализуют воплощение идеи в готовый, видимый результат, позволяют создавать объемные модели любого объекта с фотографической точностью. Сейчас, чтобы оценить достоинства и недостатки программы, нужно лишь создать в ней объемную модель реального объекта. Компьютерное  моделирование широко распространено в различных сферах деятельности людей и зарабатывает огромную популярность. В киноиндустрии без 3D-моделирования уже сложно обойтись. Специалистов по 3D-моделированию не хватает и, именно поэтому, они всегда востребованы, а в дальнейшем спрос на них будет расти [1,11].</p>
<p>Фильмы без спецэффектов просуществовали сравнительно недолгое время. Человечество, открывшее для себя новый мир, быстро стало думать о том, как изобразить на пленке то, что раньше возможно было только лишь в их воображении. Сейчас ни один современный фильм не может обойтись без трехмерной графики.</p>
<p>3D-графика – это создание объемной модели при поддержке особых компьютерных программ. На базе чертежей, рисунков, тщательно подобранных описаний либо любых иных графических или текстовых данных 3D-моделлер создает объемное изображение объекта. В специально разработанной компьютерной программе, например: WINGS 3D, DAZ STUDIO и др. модель можно рассмотреть с разных сторон, интегрировать в абсолютно любую плоскость и в любое окружение [9,10,12]. Такая модель отличается фотографической точностью и помогает лучше представить, как будет выглядеть объект, воссозданный в жизни, привнести определенные коррективы.</p>
<p>Воплощение компьютерной графики в фильмах – огромнейший труд, над которым работают десятки и сотни специалистов. От сценаристов и режиссеров до целого «войска» художников: они моделируют объекты, текстурируют изображение, анимируют, занимаются риггингом и визуализацией героев и виртуального мира.</p>
<p>Основные этапы создания и визуализации 3D моделей в киноиндустрии.</p>
<p>1)      Моделирование – создание трехмерных объектов и моделей.</p>
<p>2)      Текстурирование – наложение текстур и материалов на трехмерные модели.</p>
<p>3)      Риггинг (от англ. Rig – установка, оснащать) – изготовление виртуального «скелета», системы «кости» &#8211; «суставы» для последующей анимации персонажа.</p>
<p>4)      Анимация &#8211; «оживление», имитация движений трехмерных персонажей.</p>
<p>5)      Рендеринг (3D &#8211; визуализация) – визуализация созданной графики и запись.</p>
<p>6)      Композитинг – объединение каждого отдельного элемента в финальную сцену. Например, внедрение 3D-сцен в отснятый видеоматериал, коррекция цветов и добавление эффектов. [2]</p>
<p>Способов моделирования огромное количество, и описать все в одной статье невозможно. Я затрону только самые используемые методы. В моделях для кинематографа в основном используют кривые поверхности (NURBS-моделирование) и полигоны (полигональное моделирование). Отличие полигонального моделирования только в том, что их проще всего визуализировать.</p>
<p>NURBS-моделирование &#8211; математическая форма, используемая в 3D-моделировании для генерирования и изображения кривых и поверхностей [14,15].</p>
<p>Полигон — многоугольник, являющийся минимальной поверхностью для визуализации в трёхмерном моделировании.</p>
<p>Чем выше количество полигонов имеет объект, тем выше детализация, качество и разрешение. На основе этого подразделяют высокополигональные (high poly) и низкополигональные (low poly) модели. В производстве фильмов чаще всего используют высокополигональные модели, рендеринг которых, проводят по несколько недель, а то и месяцев.</p>
<p>Текстурирование – это не только подбор цветов и материалов для объемной модели, это огромная область деятельности, которой в кинематографе занимается художник по текстурам. Перед тем как передать работу художнику, моделлер делает текстурную развертку (UV-развертка) – двумерное изображение, которое содержит поверхность объемной модели. UV-развертки необходимы для того, чтобы текстура идеально ровно расположилась на модели без каких-либо ошибок.</p>
<p>Затем обрисовываются текстуры, которые присоединяются к модели. Создается целый комплект текстур: цвет, карта рельефа (displacement – создает реальный рельеф), карта нормалей (normal map – создает видимость рельефа), карта бликов (specular), карта неровностей (bump), карта прозрачности (alpha) и многие другие. Таким образом, появляется полностью готовый визуальный образ локации или персонажа: от внешнего вида и волос до морщинок и эмоций; от рельефной местности до отдельных травинок и листьев.</p>
<p>В 3D моделировании риггинг &#8211; это процесс разработки и процедура подготовки персонажа к анимации, включающий в себя создание и установку внутри трёхмерной модели виртуального «скелета» &#8211; набора «костей» или «суставов», процесс установления систематической взаимосвязи между ними и значений всевозможных модификаций и видоизменений для каждой из этих костей.</p>
<p>Скелетная анимация, для которой и используется риггинг, удобна прежде всего тем, что позволяет управлять огромным количеством составных частей анимируемой фигуры (конечности, глаза, мышцы лица, губы и т.д.) с помощью сравнительно небольшого количества регулирующих частей &#8211; тех самых костей и их контролируемых характеристик.</p>
<p>Для того, чтобы трехмерная модель «ожила», в работу вступают специалисты-аниматоры. Основная цель аниматора – сделать движения модели максимально похожими на настоящие. Особенно это важно в тех фильмах, где в одном кадре 3D-персонажу необходимо взаимодействовать с реальными актерами.</p>
<p>Самым простым способом анимации &#8211; является анимация по ключевым кадрам. Художник-аниматор указывает положение модели в начальном и конечном кадрах движения, а положение в промежуточных кадрах определяется специальной компьютерной программой. Это несложный в реализации метод, но для создания сложных движений достаточно трудоемкий и требует большого умения аниматора для получения максимальной реалистичности персонажа.</p>
<p>Система активного захвата движений (технология Motion Capture)  представляет совмещение движений реального актера, на котором надеты специальные датчики, считывающие перемещение, эмоции, действия, с движениями трехмерного персонажа. Этот метод очень облегчает работу аниматора, позволяя задействовать уже готовые движения актеров. Простейший пример Motion Capture – Голум, персонаж Энди Сёркиса в трилогии П. Джексона «Властелин колец».</p>
<p>Заключительный этап моделирования – итоговая визуализация полученных сцен &#8211; рендеринг.  Существует только два типа рендеринга: рендеринг в настоящем времени и пострендеринг. В кинематографе в приоритете пострендеринг, ведь быстрота просчетов – далеко не основной фактор, на первом месте высокое качество картинки и графики. А именно, реалистичное качество виртуально созданного мира с правильным и четким сочетанием света и тени.</p>
<p>Композитинг &#8211; комбинированная съемка является последним этапом постпроизводства. И это не просто работа с цветом и слоями: композер -специалист, занимающийся композитингом, объединяет все части фильма в одно целое, внедряет в отснятый видеоматериал трехмерных персонажей и другие 3D-элементы, исправляет ошибки и убирает лишнее, работает над разными эффектами. Проще говоря, создает объединенную сцену реальности и созданного 3D-изображения, превращая все это в одну готовую реалистичную сцену. Специалист-композер является ответственным за конечный продукт –видеофильм [4].</p>
<p>Компьютерное моделирование меняет наше чувство связи между видеокамерой и реальностью вне фильма. Присутствие и того и другого уже не является абсолютно необходимым. Теперь «запечатлеть» то, что нельзя было увидеть в реальной жизни, стало намного проще. 3D-технологии преобразовывают изображение в пиксели, которые можно с легкостью редактировать, переделывать, изменять, трансформировать. Стирается грань между анимацией (которая создает образы там, где их вообще прежде не было) и монтажом (который занимается расстановкой фрагментов сцен и событий, запечатленных камерой).</p>
<p>Именно благодаря 3D-моделированию стало возможным показать то, чего не существует в реальности, воплотить на экране самые смелые идеи и фантазии. С освоением 3D-моделирования работниками киноискусства был совершен колоссальный прорыв в кинематографе.</p>
]]></content:encoded>
			<wfw:commentRss>https://web.snauka.ru/issues/2017/01/77658/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
