Андрей Смирнов
Время чтения: ~18 мин.
Просмотров: 0

Виды 3d моделирования

Корректируем положение рёбер в окне проекции Top относительно чертежа

Теперь нам нужно на виде сверху скорректировать рёбра по линии чертежа бампера. Для этого перейдём к проекции Top, последовательно выделяя рёбра и перенося их относительно линии бампера.

Обратите внимание, что в проекции Top мы обнаружили такую картину:

Рёбра в окне проекции Top

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

Перейдите на уровень подобъекта Vertex, включите ограничение по рёбрам — свиток Edit Geometry — Constraints — Edge.

Не забывайте переводить эту опцию в положение None после того, как выполните нужное действие. Иначе впоследствии точки будут перемещаться только по рёбрам.

Выделите первую группу вершин. Это можно делать как на проекции вида сверху (Top), так и на проекции вида спереди (Front). Затем перейдите на панель Ribbon — Modeling — Align — Z.

Выравнивание рёбер по оси Z с помощью панели Ribbon

С оставшимися группами вершин проделайте всё то же самое самостоятельно, не трогая пока самые крайние группы вершин. Должно получиться так:

Выровненные рёбра

Следующим шагом нужно расположить эти группы вдоль линии бампера на чертеже. Для этого можно работать как с уровнем подобъектов вершин (Vertex), так и с рёбрами (Edge) — кому как больше нравится. Я предпочитаю использовать рёбра.

Поочередно выделяйте рёбра и перемещайте их вдоль внешней линии бампера. Напомню, что инструмент перемещения можно активировать по клавише W.

Перемещаем рёбра и выравниваем их относительно чертежа

Теперь требуется правильно сформировать поворотную секцию бампера и поработать над точной расстановкой рёбер относительно ключевых точек чертежа.

Красным прямоугольником выделен поворотный фрагмент бампера, который требует внимания

Выделите группу рёбер и перенесите их, как показано ниже.

Перенос рёбер ближе к поворотной секции

Затем выберите инструмент поворота (клавиша E) и поверните ребро перпендикулярно линии чертежа бампера.

Поворот выделенных рёбер перпендикулярно линии чертежа

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

Переносим и разворачиваем остальные рёбра

После всех этих действий должно получиться так:

Результат переноса и разворота рёбер

Пока что модель далека от идеала, но часть формы бампера мы построили. Идём дальше и поправим крайний профиль, который не стали трогать на предыдущем этапе.

Красным прямоугольником обозначены нужные вершины

Сделать это автоматически не получится. Поэтому руками аккуратно и не торопясь выравниваем вершины.

Выравниваем вершины так, чтобы рёбра располагались перпендикулярно линии чертежа

Не забываем проверять, чтобы линии по длинной стороне бампера были параллельны. Сейчас наблюдается такой момент:

Двойной красной линией обозначены параллельные рёбра, а одинарной — непараллельные

Рёбра, отмеченные двумя красными чёрточками, расположены параллельно, а там, где всего одна, их нужно поправить. Для этого переместим выделенные вершины чуть вверх и вправо.

Вариант перемещения вершин для запараллеливания нужных рёбер

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

Перемещаем группы вершин по периметру созданной плоскости, чтобы сделать рёбра максимально параллельными друг другу по длинной стороне

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

Так получилось, потому что полка бампера сужается и речи о параллельности рёбер уже не идёт. Более того, нам придётся ещё пару раз пройтись по вершинам, чтобы привести модель в соответствие с чертежом.

Так выглядит промежуточный вариант бампера в окне проекции перспективы

Альтернативные пути

Игровая индустрия разнообразна и многогранна, поэтому далеко не все разработчики стремятся к реализму. Иногда это касается эстетических взглядов, а иногда — финансовых ограничений. В середине 2000-х появились удобные цифровые магазины, через которые независимые студии могли продавать свои игры.

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

Во второй половине 2000-х стали популярны игры, выполненные в стилистике пиксель-арта. Её преимущество заключается в том, что для получения качественной и эстетически приятной графики не нужны продвинутые художественные навыки. Другая причина популярности — ностальгия по играм 80-х годов.

Undertale (2015)

В условиях ограниченных ресурсов некоторые разработчики пошли по пути упрощения. Игры в стиле low-poly используют простые низкополигональные объекты.

Grow Home (2015)

Также стали применяться некоторые непопулярные и практически забытые техники. Например, в основе всех объектов в Minecraft (2009) лежат не полигоны или спрайты, а воксели — объёмные пиксели, из которых можно собирать целые игровые миры. Если в обычных 3D-объектах полигоны окружают пустое пространство, то воксельные объекты буквально состоят из вокселей, как из кирпичей. Эта особенность легла в основу геймплея Minecraft, потому что она позволила всячески менять окружение — разрушать объекты и строить что-то новое.

Minecraft

На основе вокселей можно создать мир с продвинутыми разрушаемостью и физикой. Пример из Teardown (в процессе разработки)

Взаимодействия с полигонами и их составляющими.

Для начала необходимо применить к объекту модификатор Edit Poly. Для этого нужно перейти на вкладку Modify – Modifier List – Edit Poly. Я рекомендую использовать именно его, потому что при желании его свободно можно удалить со всеми внесенными изменениями. Если вы превратите объект в Editable Poly, то вернуть объект к начальному виду будет сложнее.

Для того, чтобы выбирать подобъекты, необходимо включить редактирование точек (Vertex), ребер (Edge), краев (Border), полигонов (Polygons) или элементов (Elements) в разделе Selection. После этого понадобится только нажать на те подобъекты, которые нужно менять.

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

Взаимодействие с точками немного отличается в зависимости от того, сколько точек выделено. Если выделена одна точка, то ее можно только двигать. Другие инструменты эффекта не дадут. К другим типов редактирования это не относится.

Если выделено две и более точек, то их можно перемещать все вместе, а также вращать и масштабировать вокруг их общего центра. Все то же самое справедливо и для остальных типов редактирования.

Удалить полигоны можно клавишей Delete. Точки и ребра лучше удалять клавишей Backspace.

Так же стоит сказать об одном очень удобном способе создания формы с помощью клавиши Shift. С помощью это клавиши легко копировать объекты. Так же копировать можно и полигоны. Но если попытаться скопировать так край (Border), то он вытянется вместе с новыми полигонами. Используя инструменты передвижения, вращения и масштабирования с зажатой клавишей Shift, можно создать практически любую форму даже из одного полигона.

Точка отсчета

Рис. 3. Сглаживание с выделением контура.

Из программного обеспечения нам потребуются 3DS Max 7 (или выше) и ZBrush 2

На этот раз мы не будем заострять внимание на процессе моделирования: почти все действия по моделированию в 3DS Max можно детально изучить на нашем диске в видеоуроке. Этап моделирования в ZBrush записан в виде скрипта, его тоже смотрите на диске

Работа начинается с… концептуального рисунка. Берем в руки карандаш и рисуем эскиз того предмета, который будем моделировать. Нам нужен точный шаблон. Я, например, пофантазировав полчаса, придумал концепцию фэнтезийного клинка «Коготь грифона» (рис. 1, эскиз или файл Gryphon’s_Blade_Sketch.bmp). Поэтому в статье мы будем работать именно с этой моделью.

После непродолжительного колдовства с полигонами (см. видеоурок) получается модель как в файле Gryphon’s_Blade_LOW_Complete.max. Именно для нее нам предстоит сделать сначала высокодетализированный аналог, а затем и карту нормалей.

Тематический план

Подготовка к работе

  • Настройка единиц измерения
  • Работа с привязками
  • Горячие клавиши
  • Приемы работы с «тяжелыми» сценами
  • Размещение эскизов в видовом окне

Полигональное моделирование – основные понятия. Работа с подобъектами

  • Edit Mesh vs Edit Poly
  • Типы подобъектов
  • Управление выделением подобъектов (Shrink, Grow, Loop, Ring). Перенос выделения
  • Создание и удаление подобъектов
  • Мягкое выделение (Soft Selection)

Операции с подобъектами

  • Операции на уровне точек/ребер/границ/полигонов/элементов
  • Редактирование геометрии
  • Скрытие подобъектов

Практическая работа: моделирование простых объектов

Топология. Способы полигонального моделирования

  • Понятие о правильной топологии
  • Топологические решения
  • Моделирование методом Poly-by-Poly. Создание  узоров
  • Моделирование на основе примитивов путем уточнения формы
  • Сглаживание объектов. Группы сглаживания. Модификатор TurboSmooth
  • Работа с симметрией
  • Моделирование с использованием Reference-объекта

Практическая работа:  создание объектов методом  Poly-by-PolyПрактическая работа:  создание объектов на основе примитивов

Текстурирование

  • Текстурирование сложных объектов. Detach. Multi/Sub-object
  • Основные текстурные карты. Diffuse, Specular, Normal, Opacity Maps

Практическая работа: текстурирование объектов

Создание разверток

  • Развертка текстурных координат. Понятие развертки. Примеры разверток.
  • Модификатор Unwrap
  • Инструменты и методы создания разверток
  • Использование карты Checker для контроля растяжений текстуры
  • Экспорт готовой развертки в файл. Render UVW Template

Практическая работа: создание разверток готовых объектов

Сплайнове або полігональне моделювання?

Сплайнове моделювання — більш точне, і при масштабуванні (наближенні) якість об’єкта не змінюється. При сплайновому моделюванні форма глечика описується безліччю кривих по екватору кулі. Поверхню, побудовану за допомогою сплайнів можна масштабувати і виготовляти з такою точністю, яка необхідна і яку можна задати на етапі прототипирования.

Форми глечика, створені за допомогою полігонів, мають різну ступінь деталізації між площинами. Виріб з 260 полігонами має ступінь деталізації 35 градусів, з 520 полігонами — 25 градусів, з 1280 полігонами — 10 градусів між гранями. Незважаючи на те, що здалеку виріб здається гладким, а кількість полігонів більше 1000, при виготовленні такого об’єкта будуть невеликі шорсткості, оскільки навіть на маленькому об’єкті помітний кут в 10 градусів між площинами.

Полігональне і сплайнове моделювання можна порівняти за допомогою растрового і векторного зображень: векторне зображення можна масштабувати в будь-яких межах і його якість не буде губитися, а при збільшенні растрового зображення буде губитися якість ліній. Більш наочно на зображенні:

3Д моделі, створені за допомогою сплайнового або полігонального моделювання, зберігаються, як правило, в двох форматах: формати IGES і STL відповідно. Найчастіше на установках прототипування використовуються формати STL, але за допомогою спеціальних програм формат IGES можна перевести в STL. Зверніть увагу, що зворотне перетворення неможливо.

Окремим випадком моделювання сплайнового, який вже став окремим видом 3Д моделювання, є NURBS моделювання.

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

В текстовой части урока я опишу некоторые кнопки и функции модификатора
Edit Poly, а о том как смоделировать такое вот офисное кресло смотрите в видео в конце этого урока.

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

Для того что бы перейти к полигональному моделированию можно:

1. Применить модификатор Edit Poly.
2. Нажать на объект правой кнопкой, далее Convert to — Convert to Editable Poly.

После чего, вы сможете перейти к редактированию вершин (vertex), ребер (Edge) и полигонов (polygon).

Приступим к описанию основных выпадающих списков модификатора Edit Poly:

Selection:

Красные иконки указывают что выделять (вершины, ребра, полигоны и.д.)

By Vertex — выделяет те полигоны (или ребра, если у вас стоит выделение ребер) которые будут соприкасаться с выделенными точками.

Ignore Backfacing — выделяет только те полигоны которые будут вам видны с вашего ракурса.

Grow — выделяет все полигоны, граничащие с выделенным(и).

Shrink — обратный эффект Grow, снимает выделение с крайних полигонов.

Ring — работает при выделении ребер. Сложно объяснить что выделяет, проще показать…

Loop — тоже самое, смотрите картинку:

Edit Vertex:

Remove — удаляет вершину

Chamfer — снимает фаску

Weld — объединяет две или более вершины (в settings указывается минимальное расстояние при котором вершины будут слиты)

Edit Edges:

Create Shape From Selection — создает отдельный сплайн из выделенных ребер.

Insert Vertex — добавляет точку в указанное место.

Remove — удаляет ребро.

Chamfer — снимает фаску.

Bridge — при выделении двух ребер соединяет их полигоном.

Cap — закрывает border полигоном.

Bridge — соединяет два выделенных border поверхностью.

Edit Polygons:

Inset — создает внутри полигона меньший полигон

Extrude — выдавливание полигона.

Bevel — выдавливание с изменением площади полигона.

Edit Geometry:

Attach — присоединяет любой объект для общего редактирования.

Detach — наоборот отделяет выбранные объекты.

Slice plane — создает сечение, которое образует новые ребра и точки.

QuickSlice — аналогично, но иной способ создания сечения.

MSmooth — сглаживание выбранных полигонов.

Subdivision Surface:

Use NURMS Subdivision — сглаживание всего объекта.
Iteration — сила сглаживания или по-другому сколько раз применится сглаживание к объекту (не пробуйте ставить больше 10, т.к. компьютер точно зависнет, средние значения 1-3)

А вот и обещанный видеоурок о полигональном моделировании в 3d max :

Первая часть:

Вторая часть:

Выбрать другой урокПерейти к следующему

Основы сплайнового моделирования

Для начала выберем инструмент линия на панели. Жмем Create/Shapes/Line.

Создадим с помощью него произвольную форму — у меня это будет яблоко. Переходим на плоскость Top. Щелкая левой кнопкой мыши и ставя точки, я не слишком забочусь о правильности контура, так как в дальнейшем я буду его редактировать. Когда последняя точка поставлена, жмем ПКМ, чтобы закончить

Обратите внимание, что контур я замыкать не стала, причем сделала так умышленно. Вот так получилось у меня:

Выделяем сплайн и, для начала, разбираем вкладку Modify, чтобы понять с чем нам работать дальше.

Режимы редактирования

Как и при работе с полигонами, работа со сплайнами имеет несколько режимов редактирования подобъектов. Их можно увидеть в свитке Selection или нажав на плюсик около надписи Line.

Таких режимов у нас три:

Vertex – редактирование по точкам, вершинам. Вертексами называют узлы, на скриншоте их хорошо видно, красная точка — выделенный (активный) вертекс;

Segment – по сегментам. Сегмент — отрезок, ограниченный двумя вертексами;

Spline – по всему сплайну. Сплайн выделяется полностью: от первой до последней точки.

Сейчас мы будем работать только с точками — именно этот режим нам подходит лучше всего, потому выбираем режим Vertex.

Точки Vertex и их типы

Очевидный и очень явный недостаток нашей формы — угловатость. Решать проблему будем так. Выделяем точку и жмем на ней ПКМ. Открывается меню настроек. В нем есть очень полезный для нас блок, в котором обозначен тип выделенной точки.

Типы точек бывают:

  1. Bezier Corner — угол с кривой. При применении у нас получится угол, который будет иметь два независимых друг от друга манипулятора;
  2. Bezier — кривая с симметричными маркерами-манипуляторами, изгибающимися вместе;
  3. Corner — угол, ломаная линия;
  4. Smooth — автоматическое сглаживание, не имеет манипуляторов.

Давайте выделим все наши точки и выберем для них тип Smooth. В режиме Vertex рамкой выделяем все точки (или жмем Ctrl+A)/жмем ПКМ/Smooth.

Форма стала сглаженной, но это еще далеко не то, что надо.

Теперь берем каждую точку и начинаем двигать их вручную, «причесывая» фигуру. Не очень красиво у меня получилось у основания яблочка, явно просится еще по одной точке с каждой стороны.

Как добавить/убрать точку

Для того, чтобы добавить точку на сплайне, нам нужно в режиме вертексов чуть опустить свиток вниз и найти кнопку Refine. А затем просто разместить узлы в нужном нам месте на линии. Сделаем это.

И подправим результат вручную. Получилось вот так:

Как объединить узлы

Количество точек нас устраивает, и все они на своих местах. Осталось только одно — замкнуть контур. И сделать это надо обязательно. Ведь из незамкнутого контура не получиться выдавить объемную модель. Чтобы провести объединение наших узлов, делаем так: выбираем один из них, включаем привязку, перетягиваем одну точку на другую, выключаем привязку.

Кстати, в этом месте тип точки можно поставить Corner Bezier.

Как сгладить дуги сплайнов

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

Как объединить сплайны

Бывает, нужно объединить сплайны между собой. Особенно это удобно в том случае, если к ним будут применяться одинаковые модификаторы — тогда не придется проделывать все действия дважды. Для того, чтобы разобрать это на примере и закрепить предыдущий результат, создадим яблочку листик. Жмем Create/Shapes/Line. Кстати, в свитке внизу можно сразу выбрать тип линии Smooth.

Ставим наши точки и замыкаем первую точку с последней. На вопрос «Close spline?» отвечаем утвердительно.

Чтобы соединить листик и яблочко, выбираем одну из фигур, жмем кнопочку Attach и выбираем то, что хотим присоединить.

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

Как продолжить сплайны

Допустим, вы случайно бросили рисование линии, и хотите ее продолжить, а не стирать и начинать все сначала. На этот случай у нас есть еще одна полезная кнопка. Опять же, давайте на примере: нарисуем половинку контура веточки.

Переходим в режим редактирования Vertex и прокручиваем свиток вниз. Жмем кнопку Insert и продолжаем контур с точки разрыва.

Присоединим веточку с помощью Attach. Готово!

Теперь можно придать форме объем, выдавив поверхность с помощью, например, модификатора Extrude.

Автор урока: Алиса Куб

Откуда берутся технические этапы?

Всё круто, персонаж уже похож на персонажа, не хватает только текстур и анимации.

Но есть ряд моментов.

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

Давай посмотрим, сколько полигонов у нашей модели:

Считаем, сколько полигонов у нашего скульпта.

Господи, там 7,2 миллиона полигонов!

Обычно, в ААА-играх на проектах, на которых мы работали, стояло ограничение на 40 000 — 80 000 полигонов.

Вопрос, куда деть остальные 7,15 миллионов 🙂 Ведь удалять ничего не хочется.

Есть и ещё один момент. Открой любую программу для текстурирования, например, Substance Painter, и засунь в него скульпт модели.

Ты быстро поймёшь, что ничего не откроется. Программа крашнется.

Substance Painter не смог открыть наш скульпт

Если ты загуглишь, то быстро поймёшь, что корень проблемы лежит в том, что программы для текстурирования, как и игровые движки с трудом переваривают огромное количество полигонов. Такая модель будет неюзабельной.

Теперь ты понял, что у нас есть потребность в том, чтобы оптимизировать модель для игры и при этом не потерять качество. Просто засунуть модель напрямую из скульпта в игровой движок у нас не получится. Либо не потянет комп, либо игра будет жутко тормозить.

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

Идут технические этапы всегда в таком порядке:

  • Ретопология — мы создаём новую модель, которая соответствует требованиям игрового движка, сокращая количество полигонов в сотни и тысячи раз. Если скульпт модели называется highpoly, то мы сделаем lowpoly модель.
  • Развёртка — это твоя модель в UV пространстве, развёрнутая на плоскость. Она очень напоминает выкройку под одежду, как по функции так и по производству. После того как твоя модель развернута в 2D пространстве, на нее можно будет печь, проецировать и врисовывать необходимые текстурные карты.
  • Запекание — это достаточно непростой этап для новичков. Это как раз тот процесс проецирования (переноса) детализации с высокополигональной модели на низкополигональную. Мы постараемся всё очень доступно расписать, чтобы ты понял принцип работы на всю жизнь.

А потом, когда мы закончим с техническими этапами, мы добавим сочные текстуры и сделаем анимацию.Будет круто! Итак, начинаем технические этапы мы всегда с работы с сеткой. Приступаем!

Животные из бумаги с шаблонами

Белый медведь

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

Подробнее: белый медведь из бумаги

Бумажный поросенок

Забавный поросенок из бумаги создается очень легко. Все благодаря шаблону и простоте самой поделки. Всего-то и нужно, что вырезать по прямым линиям поросенка, согнуть в местах пунктирной линии и склеить.

Подробнее: поросенок из бумаги по шаблону

Бумажная собака

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

Подробнее: объемная собака из бумаги

Бумажная черепашка

Не знаете, как сделать черепаху из бумаги? А ведь есть очень простой способ: использовать шаблон и вырезать уже готовую поделку. Затем, при минимуме дополнений, создать объемного, устойчивого и симпатичного персонажа, с которым дети вполне могут и поиграть.

Подробнее: как сделать черепаху из бумаги

Олень из бумаги

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

Поделка лошади по шаблону

Лошадка сделана из картона, она устойчива и красива. Замечательная поделка для детского творчества для занятий сходной тематики, наглядное игрушка для детей, любящих лошадок.

Модификатор MultiRes

Первое, что нужно сделать после наложения этого модификатора — щёлкнуть по кнопке Generate в нижней части панели настроек модификатора (будет произведён предварительный просчёт модели). При этом Макс может задуматься довольно надолго.
Основные настройки задаются одним параметром: Vertex Percent / Vertex Count. Параметра два, но делают они одно и то же: задают количество вершин в модели (первый — в процентном соотношении, второй — в числовом). Значение Face Count показывает количество граней в оптимизированной модели, значения Max Vertex и Max Face — количество вершин и граней в исходной модели.

Дополнительные настройки:

  • Параметр Vertex Merging — задаёт максимальное расстояние между вершинами, которые будут объединены в ходе оптимизации.
  • Опция Within Mesh — включает режим, в котором будут сливаться вершины, принадлежащие разным элементам в пределах одного меша.
  • Опция Boundary Metric — включает режим, в котором оптимизатор будет стараться сохранять внешние контуры меша.
  • Опция Maintain Base Vertices — включает режим, в котором оптимизатор не затрагивает выделенные вершины (вершины выделяются как суб-элементы модификатора MultiRes).
  • Параметр Crease Angle — устанавливает минимальное значение угла между гранями, который будет отображаться как сглаженный.
Рейтинг автора
5
Материал подготовил
Степан Волков
Наш эксперт
Написано статей
141
Ссылка на основную публикацию
Похожие публикации