Как сделать преобразование объекта кратко

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

Чаще всего геометрические объекты расположены относительно плоскостей проекций в общем положении, и при решении задач для достижения поставленной цели необходимо выполнять много построений.

Количество построений можно значительно сократить, если геометрические элементы будут расположены в частном положении относительно плоскостей проекций.

Существуют два основных способа преобразования чертежа, при которых:

  1. Объект остаётся неподвижным, при этом меняется аппарат проецирования;
  2. Условия проецирования не меняются, но изменяется положение объекта в пространстве.

К первому способу относится способ перемены плоскостей проекций.

Ко второму – способ вращения (вращение вокруг линии уровня и вращение вокруг проецирующей прямой); способ плоскопараллельного перемещения.

Рассмотрим наиболее часто используемые способы при решении задач.

Способ перемены плоскостей проекций или способ введения дополнительных плоскостей проекций (ДПП) позволяет перейти от заданной системы плоскостей проекций к новой системе, более удобной для решения той или иной задачи.

Рассмотрим положение точки А относительно известной системы плоскостей проекций π2⊥π1 (Рисунок 4.1, а и б).

Введём π4⊥π1, при этом получим новую систему двух взаимно перпендикулярных плоскостей. Положение точки А на эпюре будет в этом случае задано проекциями А1 и А4.

Правила перемены плоскостей проекций:

  1. Новая плоскость проекций вводится перпендикулярно, по крайней мере, одной из заданных на чертеже плоскостей проекций;
  2. ДПП располагается относительно проецируемого объекта в частном положении, удобном для решения поставленной задачи;
  3. Новую плоскость совмещаем вращением вокруг новой оси проекций с плоскостью, которой она перпендикулярна на свободное место так, чтобы проекции не накладывались друг на друга.

Рисунок 4.1 – Способ перемены плоскостей проекций


а б

Рисунок 4.1 – Способ перемены плоскостей проекций

  1. На чертеже новая проекция геометрического элемента находится на линии связи, перпендикулярной новой оси проекций:
  1. Расстояние от А4 до π14 равно расстоянию от А2 до π21, так как величина этих отрезков (отмечены ○) определяет расстояние от точки А до плоскости проекций π1.

При решении задачи необходимо заранее обдумать, как расположить новую плоскость проекций относительно заданных геометрических объектов (прямой, плоскости и др.), и как на чертеже провести новую ось проекций, чтобы в новой системе плоскостей заданные объекты заняли бы частные положения по отношению к новой плоскости проекций.

Проецирование прямой в точку

Упражнение

1. Спроецировать отрезок общего положения АВ в точку.

  1. Введём ДПП π4//А1В1 и π4⊥π1 (Рисунок 4.2). В новой системе двух взаимно перпендикулярных плоскостей проекций π14 отрезок АВспроецируется на π4 в натуральную величину и по этой проекции можем определить угол наклона отрезка к плоскости проекций π1

Упражнение

2. Дана плоскость общего положения – σ, заданная треугольником АВС (Рисунок 4.3).

Определить истинную величину треугольника.

  1. Введём ДПП π4⊥σ и π4⊥π1, для чего построим горизонталь в плоскости треугольника и проведём новую ось проекций π14⊥g1согласно теореме о перпендикуляре к плоскости. На π4 плоскость σ спроецируется в прямую, что означает σ⊥πp4.
  2. Введём ДПП π5//σ (π45//А4В4С4) и π4⊥π5. На π5 проекция А5В5С5 – есть истинная величина треугольника.

Определение истинной величины треугольника

4.2. Способ вращения

Сущность способа вращения состоит в том, что положение системы плоскостей проекций считается неизменным в пространстве, а положение проецируемого объекта относительно неподвижных плоскостей изменяется.

Из сравнения сущности обоих способов видно, что решение задач, которые требуют применения преобразования ортогонального чертежа, может быть выполнено любым из этих способов, результат при этом должен получиться одинаковым. Основа выбора того или иного способа – рациональность решения.

Вращение заданных элементов будем осуществлять вокруг проецирующей прямой, то есть прямой, перпендикулярной какой-либо плоскости проекций, при этом все точки заданных элементов поворачиваются в одну и ту же сторону на один и тот же угол (Рисунок 4.4, а и б). Ось вращения и объект вращения составляют твёрдое тело.

А – точка в пространстве;

О – центр вращения точки А;

АО – радиус вращения

Рисунок 4.4 – Способ вращения вокруг прямой, перпендикулярной π2


а б

Рисунок 4.4 – Способ вращения вокруг прямой, перпендикулярной π2

Точка описывает в пространстве окружность радиусом АО. Плоскость окружности перпендикулярна оси вращения (σ⊥m).

Так как m⊥π2 , то σ//π2, следовательно, σ⊥π1, ⇒ σ1m1, и поэтому σ проецируется на π1 в виде прямой, перпендикулярной проекции оси вращения, а на π2 траектория вращающейся точки проецируется в виде окружности с центром О2m2.

Пусть ось вращения m⊥π1 (Рисунок 4.5, а и б). Плоскость окружности σ⊥m.

Рисунок 4.5 – Вращение вокруг прямой, перпендикулярной π1


а б
Рисунок 4.5 – Вращение вокруг прямой, перпендикулярной π1
\left.\begin\sigma\parallel\pi_1\\\sigma\perp \pi_2\\\end\right\> npu\;m\perp\pi_1\Longrightarrow\sigma_2\perp m_2
Свойства проекций

  1. На плоскость проекций, перпендикулярную оси вращения, траектория вращающейся вокруг этой оси точки проецируется без искажения, то есть в окружность с центром, совпадающим с проекцией оси вращения на эту плоскость и радиусом, равным расстоянию от вращаемой точки до оси вращения.
  2. На плоскость проекций, параллельную оси вращения, траектория вращающейся точки проецируется в отрезок, перпендикулярный проекции оси вращения на эту плоскость.
  3. На плоскость проекций, перпендикулярную оси вращения, проекция вращаемого объекта своих размеров и формы не меняет.

Упражнение

Дано : отрезок общего положения – АВ.

Определить : способом вращения истинную величину отрезка и углы наклона его к плоскостям проекций.

1. Выберем ось вращения m⊥π1 и проходящую через точку В (Рисунок 4.6).

Определить способом вращения истинную величину отрезка и углы наклона его к плоскостям проекций

На плоскости проекций π2 проекция траектории перемещения точки А – прямая,

A_2 \overline\perp m_2\;u\;A_2\overline\parallel\pi_2/\pi_1

На плоскости проекций π1 проекция траектории перемещения точки А – окружность радиусом |А1В1|.

Повернем отрезок до положения, параллельного плоскости проекций π2. Получим натуральную величину отрезка.

Угол наклона отрезка АВ к плоскости проекций π1 будет угол
\alpha=\angle\widehat_2> .

Для того, чтобы определить угол наклона АВ к плоскости проекций π2, надо ввести новую ось вращения перпендикулярно π2 и повторить построения.

4.3. Определение истинной величины треугольника способом вращения

Пусть плоскость σ задана треугольником. Необходимо определить истинную величину треугольника (Рисунок 4.7).

Одним поворотом вокруг оси, перпендикулярной к плоскости проекций, истинную форму треугольника получить нельзя (так же как и введением одной ДПП).

Вращая вокруг оси m, перпендикулярной π1 можно расположить плоскость ΔАВС⊥π2 (а вращая вокруг оси n⊥π2 можно расположить плоскость ΔАВС⊥π1).

Определение истинной величины треугольника способом вращения


Рисунок 4.7

  1. Положим σ’ должна быть перпендикулярна π2. Для чего построим CD – горизонталь h плоскости σ. Введём первую ось вращения m⊥π1, например, через точку С.
  2. Повернём треугольник вокруг m до положения, когда
    \overline\perp\pi_2\Rightarrow\overline_1\overline_1\perp\pi_2/\pi_1
    На основании 3-го свойства, новая горизонтальная проекция треугольника \overline по величине должна равняться A1B1C1, а фронтальная проекция треугольника будет представлять отрезок.
  3. Введём вторую ось вращения n⊥π2 через точку \overline_2 . Повернём фронтальную проекцию \overline в новое положение \overline<\overline\overline\overline>\parallel\pi_2/\pi_1 . На π1 получим треугольник \overline<\overline\overline\overline> , равный истинной величине треугольника АВС.

4.4. Задачи для самостоятельной работы

Двумя способами преобразования ортогонального чертежа:

1. Определить расстояние от точки D до отрезка АВ – общего положения (Рисунок 4.8).

ris5_9


Рисунок 4.8

2. Определить расстояние между двумя параллельными прямыми общего положения (АВ//CD) (Рисунок 4.9).


Рисунок 4.9

3. Определить расстояние между двумя скрещивающимися прямыми, заданными отрезками АВ и CD (Рисунок 4.10).

ris5_10


Рисунок 4.10

4. Построить недостающую проекцию точки D при условии, что задана σ=ΔАВС – общего положения и первая проекция точки D1, Dотстоит от плоскости σ на 30 мм (Рисунок 4.11).

ris5_11


Рисунок 4.11

5. Дан отрезок АВ – общего положения. Ось вращения не проходит через АВ (Рисунок 4.12). Определить способом вращения истинную величину АВ.


Рисунок 4.12

6. Задана прямая общего положения m и точка А вне прямой. Построить плоскость, проходящую через точку А и перпендикулярную прямой m (Рисунок 4.13).

ris5_12


Рисунок 4.13

Четвёртая статья будет разбита на две, первая часть говорит про построение перспективного искажения, вторая про то, как двигать камеру и что из этого следует. Задача на сегодня — научиться генерировать вот такие картинки:




Геометрия на плоскости

Линейные преобразования плоскости

Линейное на плоскости отображение задаётся соответствующей матрицей. Если мы возьмём точку (x,y), то её преобразование записывается следующим образом:

Самое простое (невырожденное) преобразование задаётся единичной матрицей, оно просто оставляет каждую точку на месте

Коэффициенты на диагонали матрицы задают растягивание/сжатие плоскости. Давайте проиллюстрируем картинкой: например, если мы запишем следующее преобразование:

То белый объект (квадрат с отрезанным углом) преобразуется в жёлтый. Красный и зелёный отрезки дают единичные векторы по оси x и y, соответственно.


Все картинки к этой статье сгенерированы вот этим кодом.

Зачем вообще использовать матрицы? Потому что это удобно. Начнём с того, что в матричной форме преобразование всего объекта можно записать вот таким образом:

Здесь преобразование то же, что и в предыдущем примере, а вот матрица в две строки и пять столбцов не что иное, как массив координат нашего куба с обрезанным углом. Мы просто взяли целиком массив, умножили на преобразование, и получили уже преобразованный объект. Красиво? Окей, согласен, притянуто за уши.

Настоящая причина в том, что крайне регулярно мы хотим, чтобы объект подвергся нескольким преобразованиями подряд. Представьте, что вы пишете в вашем коде функции преобразований типа

Этот код делает два линейных преобразования на каждую вершину объекта, а они исчисляются в миллионах. И преобразований зачастую мы хотим с добрый десяток. Дорого. А с матричным подходом мы перемножаем все матрицы преобразования и умножаем на наш объект один раз. В умножении мы можем ставить скобки где хотим, правда ведь?

Продолжаем разговор, мы знаем, что диагональные элементы нам дают масштабирование по осям. За что отвечают два других коэффициента матрицы? Давайте рассмотрим такое преобразование:



Не что иное, как простой сдвиг вдоль оси x. Второй анти-диагональный элемент даст сдвиг вдоль оси y. Таким образом, базовых линейных преобразований на плоскости только два: растягивание по осям и сдвиг вдоль оси. Постойте, скажут мне, а как же, например, вращение вокруг начала координат?

Выясняется, что вращение может быть представлено как композиция трёх сдвигов, здесь белый объект преобразован сначала в красный, затем в зелёный, затем в синий:


Но не будем ударяться в крайности, матрица вращения против часовой стрелки вокруг начала координат может быть записана напрямую (помните про расстановку скобок?):

Перемножать мы можем, конечно, в любом порядке, только давайте не забывать, что для матриц умножение некоммутативно:

Что нормально, сдвинуть и затем повернуть (красный объект) не то же самое, что сначала повернуть, а затем сдвинуть (зелёный объект):


Аффинные преобразования на плоскости

То есть, любое линейное преобразование на плоскости это композиция растягиваний и сдвигов. Что означает, что какой бы ни была матрица нашего преобразования, начало координат всегда перейдёт в начало координат. Таким образом, линейные преобразования — это прекрасно, но если мы не можем представить элементарного параллельного переноса, то наша жизнь будет печальна. Или можем? А что, если добавить его отдельно и записать аффинное преобразование как композицию линейной части и параллельного переноса? Примерно вот так:

Это, конечно, прекрасная запись, но вот только давайте посмотрим, на что похожей выглядит композиция двух таких преобразований (я напоминаю, что в реальной жизни нам нужно уметь аккумулировать десятки преобразований):

Это начинает выглядеть крайне неприятно уже для одной-единственной композиции. Попробуйте преобразовать это выражение, чтобы применить к нашему объекту только одно преобразование вида линейная часть + параллельный перенос. Лично мне очень не хочется этого делать.

Однородные координаты

А что же делать? Колдовать! Представьте теперь, что я допишу руками одну строчку и один столбец к нашей матрице преобразования и добавлю третью координату, которая равна единице у вектора, который мы преобразовываем:

При умножении этой 3x3 матрицы и нашего вектора, дополненного единицей, мы снова получили вектор с единицей в третьей компоненте, а остальные две имеют ровно тот вид, который мы хотели! Колдунство.

На самом деле, идея очень простая: параллельный перенос не является линейной операцией в двумерном пространстве.
Поэтому мы погружаем наше двумерное пространство в трёхмерное (добавив единицу в третью компоненту). Это означает, что наше двумерное пространство это плоскость z=1 внутри трёхмерного. Затем мы делаем линейное преобразование в трёхмерном пространстве и проецируем всё трехмерное пространство обратно на нашу физическую плоскость. Параллельный перенос от этого не стал линеен, но пайплайн всё же прост.

Как именно мы проецируем трёхмерное пространство обратно в нашу плоскость? Очень просто:

Секундочку, но ведь на ноль делить нельзя!

  • Мы погружаем наше 2d пространство в 3d, сделав его плоскостью z=1
  • Делаем что хотим в 3d
  • Для каждой точки, которую хотим спроецировать обратно в 2d, проводим прямую между началом координат и данной точкой и ищем её пересечение с физической плоскостью z=1.


Теперь давайте представим вертикальный рельс, проходящий через точку (x,y,1). Куда спроецируется точка (x,y,1)? Конечно же, в (x,y):


Теперь давайте начнём скользить вниз по рельсу, например, точка (x, y, 1/2) спроецируется в (2x, 2y):


Продолжим скользить: точка (x,y,1/4) спроецируется в (4x, 4y):


Продолжая скользить к нулю по z, наша проекция уходит всё дальше и дальше от центра координат по направлению (x,y).
То есть, точка (x,y,0) проецируется в бесконечно далёкую точку в направлении (x,y). А что это? Правильно, это вектор!
Однородные координаты дают возможность различать вектор и точку. Если программист пишет vec2 v(x,y), это вектор или точка?
Трудно сказать. А в однородных координатах всё, что с нулём по третьей компоненте, это вектор, всё остальное конечные точки.
Смотрите: вектор + вектор = вектор. Вектор-вектор = вектор. Точка + вектор = точка. Ну не здорово ли?

Пример составного преобразования

Я уже говорил, что нам нужно уметь накапливать десятки преобразований. Почему? Предположим, вам нужно повернуть плоский объект вокруг точки (x0, y0). Как это сделать? Можно пойти и искать формулы, а можно сделать самим, ведь у нас есть все инструменты.
Мы умеем вращать вокруг центра координат, мы умеем сдвигать. Что ещё надо? Сдвигаем x0,y0 в центр координат, вращаем, возвращаем назад. Халява!

В 3д последовательности действий будут немного длиннее, но смысл остаётся прежним: нам достаточно уметь делать несколько базовых преобразований, и с их помощью мы можем закодировать какое угодно сложное.

Постойте, а имею ли я право трогать нижнюю строку матрицы 3x3?

Ещё как! Давайте применим вот это преобразование:

к нашему стандартному тестовому объекту. Напоминаю, что тестовый объект белый, единичные икс и игрек вектора показаны красным и зелёным, соответственно


Вот наш преобразованный объект:


И вот тут начинается самое интересное. Помните наше упражнение про игрек-буфер? Здесь мы будем делать практически то же самое.
Мы будем проецировать наш двумерный объект на прямую x=0. Причём теперь усложним задачу: проекция будет центральной, наша камера находится в точке (5, 0) и смотрит в начало координат. Чтобы найти проекцию, мы должны провести прямые, проходящие через точку камеры и каждую вершину нашего объекта (жёлтые прямые), а затем найти их пересечение с прямой экрана (белая вертикальная).


А теперь давайте уберём оригинальный объект и вместо него нарисуем трансформированный.




Если мы используем обычную ортогональную проекцию нашего трансформированного объекта, то мы найдём ровно те же самые точки!
Ведь что делает это отображение? Оно каждое вертикальное ребро оставляет вертикальным, но при этом растягивает те, которые близко к камере, и сжимает те, что дальше от камеры. Правильно подобрав коэффициент растяжения-сжатия мы можем как раз достичь эффекта, что простой ортогональной проекцией мы получаем изображение в перспективном искажении! В следующем параграфе мы добавим одно измерение и покажем, откуда взялся коэффициент -1/5.

Пора перейти к трём измерениям

Давайте объяснять только что произошедшую магию.
Как и в случае двумерных аффинных преобразований, в трёхмерном пространстве мы тоже будем использовать однородные координаты.
Берём точку (x,y,z), погружаем её в четырёхмерное пространство, добавив единицу в четвёртую компоненту, преобразуем в четырёх измерениях и проецируем обратно в 3d. Например, возьмём такое преобразование:

Проекция на 3д даёт следующие координаты:

Хорошо запомним этот результат, но на пару минут его отложим. Давайте вернёмся к стандартному определению центральной проекции в обычном 3д, без однородных координат и прочих экзотических вещей. Пусть у нас будет точка P=(x,y,z), которую мы хотим спроецировать на плоскость z=0, камера находится на оси z на расстоянии c от центра координат.


Мы знаем, что треугольники ABC и ODC подобны. То есть, мы можем записать |AB|/|AC|=|OD|/|OC| => x/(c-z) = x'/c.

Рассматривая треугольники CPB и CP'D, можно легко прийти к подобной записи и для координаты y:

Итак, это очень-очень похоже на результат проекции через однородные координаты, только там это всё считалось одним матричным умножением. Мы вывели зависимость коэффициентов r = -1/c.

Хотя если вы просто возьмёте эту формулу, не поняв весь предыдущий текст, то я вас ненавижу. Итак, если мы хотим построить центральную перспективу с (важно!) камерой, находящейся на оси z на расстоянии c от начала координат, то сначала мы погружаем трёхмерные точки в четырёхмерное пространство, добавив 1. Затем умножаем на следующую матрицу и проецируем результат обратно в 3D:

Мы деформировали наш объект так, что теперь для построения проволочного рендера с перспективой нам достаточно просто забыть про новополученную координату z. Если мы хотим строить z-буфер, то, разумеется, мы её используем. Слепок кода доступен на гитхабе. Результат его работы виден в самом начале нашей статьи.

К ним относятся опытная работа и эксперимент. Различие между ними заключаются в степени произвольности действий исследователя. Если опытная работа – нестрогая исследовательская процедура, в которой исследователь вносит изменения в объект по своему усмотрению, исходя из своих собственных соображений целесообразности, то эксперимент – это совершенно строгая процедура, где исследователь должен строго следовать требованиям эксперимента.

2.4.2.1 Опытная работа

Это, как уже было сказано, метод внесения преднамеренных изменений в изучаемый объект с известной степенью произвола. Так, геолог сам определяет – где искать, что искать, какими методами – бурить скважины, копать шурфы и т.д. Точно так же археолог, палеонтолог определяет – где и как производить раскопки. Или же в фармации осуществляется длительный поиск новых лекарственных средств – из 10 тысяч синтезированных соединений только одно становится лекарственным средством. Или же, например, опытная работа в сельском хозяйстве.

Опытная работа как метод исследования широко используется в науках, связанных с деятельностью людей – педагогике, экономике, и т.д., когда создаются и проверяются модели, как правило, авторские: фирм, учебных заведений и т.п., или создаются и проверяются разнообразные авторские методики. Или же создается опытный учебник, опытный препарат, опытный образец и затем они проверяются на практике.

Опытная работа в некотором смысле аналогична мысленному эксперименту – и там и там как бы ставится вопрос: а что получится, если . Только в мысленном эксперименте ситуация проигрывается в уме, а в опытной работе ситуация проигрывается действием.

Но, опытная работа – это не слепой хаотический поиск путем проб и ошибок. Опытная работа становится методом научного исследования при следующих условиях:

1. Когда она поставлена на основе добытых наукой данных в соответствии с теоретически обоснованной гипотезой.

2. Когда она сопровождается глубоким анализом, из нее извлекают выводы и создаются теоретические обобщения.

В опытной работе применяются все методы-операции эмпирического исследования: наблюдение, измерение, анализ документов, экспертная оценка и т.д.

Опытная работа занимает как бы промежуточное место между отслеживанием объекта и экспериментом.

Она является способом активного вмешательства исследователя в объект. Однако опытная работа дает, в частности, только результаты эффективности или неэффективности тех или иных инноваций в общем, суммарном виде. Какие из факторов внедряемых инноваций дают больший эффект, какие меньший, как они влияют друг на друга – ответить на эти вопросы опытная работа не может.

Для более глубокого изучения сущности того или иного явления, изменений, происходящих в нем, и причин этих изменений, в процессе исследований прибегают к варьированию условий протекания явлений и процессов и факторов, влияющих на них. Этим целям служит эксперимент.

Применение инструментов преобразования графических объектов исключительно полезно для анимации, поскольку позволяет сократить число новых рисунков. Анимируемые объекты можно получить в результате трансформации объектов из предыдущих кадров.

ПРЕОБРАЗОВАНИЕ ФОРМЫ

Графические объекты можно подвергать различным преобразованиям с помощью меню Модифицировать Трансформировать (Modify Transform) или инструмента Трансформация (Free Transform). Вид преобразования выбирается в меню или на панели инструментов в разделе Параметры (Options) (рис. 2.1).


ПРЕОБРАЗОВАНИЕ ЗАЛИВКИ

Заливка может быть однотонной (solid), с плавным переходом цветов - градиентом, а также с заполнением растровым изображением (bitmap). Цветовые палитры и шаблоны градиентов представлены на панели Набор цветов (Color Swatches). Для настройки параметров заливки используют панель Смеситель цветов (Color Mixer).

СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ СЛОЕВ

При создании композиции из нескольких изображений используются слои (layers). Слои можно воспринимать как прозрачные пленки (кальки) с изображениями. Слои - важнейший элемент анимации. Они обеспечивают независимые движения и преобразования нескольких объектов. Кроме того, слои используются для размещения траекторий движения, звуков, видеофрагментов, а также программ на языке Action Script.

Список слоев находится в левой части шкалы времени. При создании нового фильма в этом списке всего один слой с именем Layer 1 (Слой 1). Рекомендуется сразу же изменить это имя на более соответствующее содержанию слоя. Для этого достаточно дважды щелкнуть левой кнопкой мыши на предлагаемом имени слоя и ввести новое. Слои можно помещать в папки. Папки позволяют группировать слои со сходными объектами.

Слой со всеми объектами на нем можно скрыть (сделать невидимым). Для этого достаточно щелкнуть мышью по точке под изображением глаза. Повторный щелчок вернет видимость. Если щелкнуть на изображении глаза над списком слоев, то все они станут невидимыми. Для удаления слоя необходимо выделить в списке его имя и щелкнуть на кнопке с изображением корзины под списком.

СОЗДАНИЕ И ИСПОЛЬЗОВАНИЕ БИБЛИОТЕЧНЫХ ОБРАЗЦОВ

Для хранения объектов многократного использования предназначена библиотека (Linrary). Объект из библиотеки можно размещать на рабочем поле в нескольких экземплярах, подвергая каждый из них нужным трансформациям.

Чтобы поместить объект в библиотеку, необходимо преобразовать его в библиотечный образец, называемый в терминологии Flash символом (symbol). Возможны три типа символов: MovieClip (фрагмент фильма или клип), Graphic (график) и Button(кнопка). Клип может содержать как статичное изображение, так и анимацию, звук и видеофрагменты. Он может управляться программой на языке Action Script. Тип Графика также может содержать анимацию и аудио-, видеофрагменты, однако им нельзя управлять программно. Кнопка используется для интерактивного управления анимацией.

Читайте также: