Геймдев
#статьи

Всё, что нужно знать о SpeedTree — инструменте для создания растений в 3D

Знакомимся с историей программы и её редактором.

Иллюстрация: SpeedTree / Interactive Data Visualization, Inc / Дима Руденок для Skillbox Media

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

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

В этом материале вы узнаете:


Тернистый путь к созданию 3D-деревьев

Проект SpeedTree разработан компанией Interactive Data Visualization, Inc (далее — IDV), которую основали Майкл Сечрест и Крис Кинг в начале нулевых. Изначально студия занималась разработкой 3D-технологий в военной и промышленной сфере, но однажды специалисты получили заказ на симулятор гольфа.

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

После тщетных поисков мы решили сами создать деревья и разработали небольшой программный пакет, в который вошёл некоторый функционал, впоследствии ставший знаковым [для SpeedTree], — в том числе алгоритм процедурной генерации геометрии, первая версия SpeedTreeCAD и общий подход к освещению и эффектам ветра.

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

Кевин Мередит,
экс-директор по развитию бизнеса Interactive Data Visualization, Inc

Через несколько месяцев IDV получила заказ от архитектурного бюро на создание рендера комплекса площадью более 100 000 м², в котором предполагалось использовать почти 1000 анимированных моделей деревьев высокого качества. Опасаясь, что их генератор не справится с задачей, разработчики обратили внимание на плагины других программ, в частности 3ds Max. Но попытки снова не увенчались успехом. Одни инструменты шли без алгоритма анимации ветра; другие предлагали только высокополигональные модели, что негативно влияло на оптимизацию; третьи и вовсе не соответствовали визуальным стандартам заказчика.

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

В декабре 2002 года начались первые продажи SpeedTreeRT — промежуточного ПО для рендеринга листвы и деревьев в реальном времени. В нём пользователь мог автоматически изменять уровень детализации листвы, настраивать эффекты ветра и освещение для сотен и даже тысяч моделей.

В марте 2009 года в рамках презентации на GDC IDV представила открытую бета-версию программы под названием SpeedTree 5.0, в которой была доступна не только процедурная генерация, но и настройка деревьев вручную с возможностью экспорта готового контента в игровые движки. Полноценный релиз состоялся в июле 2009 года.

Интервью с арт-директором SpeedTree Стивеном Клиповичем для CG Channel, в котором он рассказывает о программе на момент запуска бета-версии (GDC 2009)

Использование SpeedTree в играх и фильмах

На сегодняшний день SpeedTree активно используют для создания внутриигрового окружения такие ААА-студии, как Epic Games, Sony Interactive Entertainment, Microsoft Game Studios, CD Projekt RED, Square Enix, FromSoftware и Activision. Среди игр — Assassin’s Creed Valhalla, Red Dead Redemption 2, Days Gone, Tom Clancy’s Ghost Recon Breakpoint.

Шоурил с кадрами из игр, в которых использовалась технология SpeedTree

Программа востребована и в киноиндустрии. На счету IDV уже несколько десятков картин, в которых была задействована технология SpeedTree, включая фильмы от Disney и Marvel, а также блокбастеры «Аватар», «Волк с Уолл-Стрит» и «Безумный Макс: Дорога ярости».

SpeedTree применяется для создания окружения в телевизионных шоу с 2011 года, дебютировав в «Улице Сезам». В 2015-м IDV получила премии «Оскар» и «Эмми» за достижения в области технологии и инженерии.

Шоурил с кадрами из фильмов, в которых использовалась технология SpeedTree

Актуальная версия

Существует две версии SpeedTree 9: это Games (для разработки игр) и Cinema (для создания VFX и архитектурных визуализаций без возможности экспорта в Unity и Unreal Engine). Помимо большого разнообразия уже существующих инструментов для создания 3D-флоры с нуля, в программе появился новый функционал, в частности:

  • инструмент для фотограмметрии — Mesh Converter, который помогает оптимизировать детали отсканированного объекта, сохраняя при этом его уникальную геометрию и текстуры;
  • режим Freehand для ручного редактирования деревьев;
  • поддержка HDRI-освещения;
  • новые опции для редактирования ветвей;
  • цикличная анимация ветра.
Презентационный ролик SpeedTree 9

Контент, созданный в SpeedTree, можно легко интегрировать как в игровые движки, включая кастомные, так и в другие программы для 3D-моделирования и рендеринга — Maya, 3ds Max, Blender, Cinema 4D, Houdini, Arnold и Redshift.

Условия лицензирования

SpeedTree совместима с операционными системами Windows, Mac и Linux и распространяется по подписке. Всего существует три типа коммерческих лицензий:

  • Indie ($19 в месяц или $199 в год) — для инди-разработчиков и студий, чей доход или инвестиции не превышают $100 000 в год.
  • Pro ($299 в полгода или $499 в год) — для компаний с оборотом до $1 млн. Есть вариант оформления более дорогой плавающей лицензии, то есть с возможностью подключать софт на множестве рабочих мест поочерёдно, а также дополнительная покупка доступа к маркетплейсу SpeedTree — Games Tree Library.
  • Custom — договорная лицензия по запросу для крупных организаций с доходом выше $1 млн.

Все лицензии поддерживают экспорт в расширениях .obj, .fbx, .usd, .st, .stsdk, .cgf и .xml.

Если пользователь заинтересовался программой, но пока не готов купить её, он может скачать бесплатную версию Learning Edition. В ней доступны все функции для моделирования растений, но нельзя экспортировать модели в другие программы. Проекты, созданные и сохранённые в этой версии, работают только в ней и несовместимы с платными лицензиями. В этом ознакомительном материале мы рассмотрим возможности бесплатной версии SpeedTree.

Установка клиента

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

Learning Edition без экспорта моделей имеет неограниченный срок действия, но пользователь также может оформить пробную 10-дневную версию Pro, в которой будет доступен частичный экспорт в игровой движок.

Чтобы оформить Pro-версию на 10 дней, во вкладке Duration нужно выбрать пункт Evaluation
Источник: официальный сайт SpeedTree

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

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

Стартовое диалоговое окно в SpeedTree
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Интерфейс редактора

Поначалу интерфейс программы может сбить с толку из-за множества окон и настроек. Но если разобраться в его структуре, то окажется, что на практике создавать деревья в SpeedTree довольно просто, а большое количество ползунков даёт простор для самых смелых экспериментов. В рамках этого материала мы рассмотрим только основной функционал и несколько операций в SpeedTree Modeler. Ознакомиться со всеми возможностями софта можно в официальной документации.

Для начала откроем готовую модель дерева для наглядности и изучим схему интерфейса:

Интерфейс SpeedTree Games Modeler 9.1.3
Скриншот: SpeedTree / Interactive Data Visualization, Inc

В центре располагается Tree Window (на скриншоте выше — окно №1) — основной 3D-вьюпорт с панелью инструментов для генерации и моделирования объекта, настройки физики и рендеринга. Здесь же находится настройка освещения и направления ветра (значки в правом верхнем углу вьюпорта), а в левом нижнем углу расположена шкала уровня детализации объекта.

Навигация во вьюпорте осуществляется только с помощью мыши:

  • ЛКМ — вращение вокруг объекта.
  • ПКМ — вызов меню.
  • Удержание СКМ — перемещение в пределах плоскости.
  • Колёсико мыши — приближение/отдаление.
  • Двойной клик ЛКМ — фокус на выделенном объекте.

В верхнем левом углу находится Generator Editor (окно №2). Это система генерации, в которой все составляющие текущего дерева (или другой растительности) представлены в виде нодов и выстроены в логическую цепочку роста. Если выбрать определённый нод, то часть объекта, с которой связан данный фрагмент, будет выделена жёлтым цветом во вьюпорте. Например, на скриншоте выше отмечен нод ствола (Trunk).

Примечание. В Generator Editor удобно выделять отдельные сегменты модели, особенно если элементов очень много. Например, если во вьюпорте нужно скрыть все листья, достаточно выделить ноды Leaf и нажать кнопку H.

Выделение и скрытие мешей листьев
GIF: SpeedTree / Interactive Data Visualization, Inc

Чуть ниже находится основная панель с настройками — Properties (окно №3). Чтобы открыть настройки объекта, нужно выделить модель во вьюпорте.

В Properties есть три режима для редактирования. По умолчанию включён режим Generator, который отвечает за генерацию ключевых элементов растения: ствола, корней, ветвей, листьев. В Generator элементы редактируются кластерами (например, можно увеличивать длину всех веток одновременно), а режим Node позволяет изменять каждую часть по отдельности. Freehand даёт ещё больше свободы — здесь можно рисовать и моделировать вершины объекта вручную.

Меню Materials (окно №4) отображает свойства импортированных в проект текстур. Также здесь есть вкладки для объектов (Meshes), масок (Masks) и карт смещения (Displacement). Их можно включить/отключить в главном меню: WindowAssets.

Окно вывода Output (№5) отображает информацию о внутренних процессах программы.

Первые шаги

Создание растений в SpeedTree — довольно творческий процесс с множеством экспериментов, но изучение функционала программы может занять немало часов. В этом материале мы создадим простое дерево с нуля (шаблон Blank). Шаблоны можно открыть при запуске программы или через меню FileNew.

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

Для начала сформируем ствол. Переходим в редактор нодов, кликаем ПКМ по значку Tree и во всплывающей вкладке выбираем Add geometry to selectedTrunk.

Стандартные параметры можно настроить сразу во вьюпорте при помощи меток, которые появятся, если щёлкнуть по стволу в режиме Generator. Управление происходит путём передвижения мыши — предварительно нужно зажать ЛКМ на одной из меток.

Расшифровка меток
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Для простых операций с мешами можно воспользоваться горячими клавишами:

  • Tab — переключение режимов редактирования,
  • H — скрыть выделенный объект,
  • W — перемещение,
  • E — вращение.

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

С помощью стандартных параметров придадим стволу нужную форму. В этом проекте мы создаём дерево, похожее на дуб, поэтому ствол будет коротким и широким.

Модификация ствола
GIF: SpeedTree / Interactive Data Visualization, Inc

По умолчанию ствол представляет собой объект в виде трубки. Если нужно добавить геометрию среза, то нажимаем ПКМ на нод Trunk, переходим в Add geometry to selectedCap. Этот нод пригодится при создании пня или спиленной верхушки дерева.

Ствол с мешем Cap
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Генерация корней

Массивное дерево предполагает массивные корни. Их генерирует ствол, поэтому нажимаем ПКМ на нод Trunk и переходим в Add geometry to selectedDecorationsRoots.

После этого в схеме генерации появится ещё два нода: Root и Root Twings — это основные корни и их ответвления. Если до этого радиус ствола был увеличен, то корни во вьюпорте могут не отобразиться — по умолчанию они «приварены» к стволу и из-за наложения геометрии пропадают. Наличие корней легко проверить, если вновь уменьшить радиус.

Чтобы исправить этот недочёт, выделяем Roots и открываем вкладку Skin (окно Properties). Ищем раздел Welding и убираем галочку с пункта Enabled или отмечаем Keep Failed. И в том, и в другом случае корневая основа перестанет зависеть от геометрии ствола.

Настройка отображения корней во вьюпорте при увеличенном радиусе ствола
GIF: SpeedTree / Interactive Data Visualization, Inc

Отображённые корни выглядят не очень удачно. Исправить их форму, длину и направление можно при помощи настроек во вкладке Spine. Для начала необходимо поработать с тремя параметрами длины (Length):

  • Absolute — минимально допустимая длина;
  • + % of parent — длина, которая получается, если умножить значение этого параметра на длину родителя (в данном случае ствола) и прибавить значения Absolute;
  • + % radius — для вычисления длины умножается значение этого параметра на радиус объекта (в данном случае корня) и прибавляется Absolute и + % of parent.

Расшифровка не самая простая, но, поэкспериментировав с ползунками, понять действие параметров гораздо легче.

Настройка длины корней при помощи трёх параметров
GIF: SpeedTree / Interactive Data Visualization, Inc

Если по задумке корни дерева должны немного вылезать из земли, их высоту можно отрегулировать как в режиме Node, так и в Generator — в частности, при помощи ползунка Start Angle в параметре Orientation (вкладка Spine).

Форма корневого массива настраивается во вкладке Gen (Generation). Здесь есть 10 режимов генерации, настройки которых влияют на направление роста корней, их толщину, количество отростков и так далее. Сгенерированные корни можно вновь отредактировать в индивидуальном порядке в режиме Node.

Пример редактирования корней в режиме Node
GIF: SpeedTree / Interactive Data Visualization, Inc

Ветви и листья

Перейдём к созданию ветвей. Лучше всего начать с крупных: TrunkAdd geometry to selectedBranchesBig. После к ноду Big можно добавить малые ветви (Little), а к нему, в свою очередь, ещё один нод Little. Чтобы крона дерева выглядела более пышной, малые ветви можно дополнить нодом, отвечающим за разветвление, — Bifurcating.

Создание ветвей
GIF: SpeedTree / Interactive Data Visualization, Inc

Ниже приведено несколько настроек, на которые можно обратить внимание первым делом.

Вкладка Gen:

  • Расположение ветвей — режимы (Mode).
  • Увеличить количество ветвей —
  • параметр Number в режимах Proportional, Absolute;
  • параметры Number и Steps в Proportional Steps, Absolute Steps (два параметра зависят друг от друга);
  • Frequency в режимах Classic, Interval (значение Count в этом режиме влияет на количество ветвей, растущих на одном уровне);
  • Absolute в режимах Flood и Parent;
  • Threshold в Bifurcation. При экспериментах с этими параметрами стоит помнить, что ветви генерируются по алгоритму, обусловленному тем или иным режимом.
  • Общий размер ветви — параметр Size Scalar во вкладке Gen.

Вкладка Spine:

  • Согнуть ветви — настройки в разделе Noise.

Закончив настройку ветвей, выделяем мелкие ветки в редакторе нодов и создаём листья: Add geometry to selectedLeaf. Чтобы листва была более пышной, увеличим количество мешей с помощью ползунка Number во вкладке Gen.

Стрелкой отмечен параметр, который отвечает за количество листвы
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Создание материалов

Теперь добавим текстуры для нашего дерева в меню Materials. Нажав на + рядом с предыдущей кнопкой, можно импортировать свои текстуры или загрузить готовые от SpeedTree — это очень удобно, если нужно создать простые реалистичные деревья в короткие сроки.

В разделе Settings есть несколько слотов для разных типов карт (если панели Meshes, Displacements и Masks их перекрывают, то последние стоит закрыть). Если кликнуть по слоту, откроется меню настройки текстуры.

В текущем примере мы воспользуемся готовыми текстурами дубового листа из набора SpeedTree (их можно найти в папке samples/Broadleaf/Leaves). С помощью кнопки + находим и выбираем цветную текстуру листа (в данном случае — Oak_Front 1.png). Программа подгрузит весь набор доступных карт в нужные слоты.

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

Стрелкой отмечено расположение меню с альфа-каналом в карте Opacity
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Готовый материал следует установить на листву методом перетаскивания при помощи значка ладони в верхней части окна.

Перенос материала на меши листьев. Для большего объёма размер листьев немного увеличен
GIF: SpeedTree / Interactive Data Visualization, Inc

Если материалов много, желательно упорядочить их по названиям. Открываем список, нажав на значок +/− в правой верхней части окна. Здесь можно создавать (Add new), удалять (Remove) и переименовывать материалы — для последнего достаточно кликнуть ЛКМ по названию два раза.

Стрелкой отмечены кнопки вызова меню
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Теперь создадим материалы для ствола, корней и веток тем же способом, что и для листьев. Вновь используем готовые текстуры из стартового набора SpeedTree (папка samples/Broadleaf/Bark).

Готовый результат
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Импорт стороннего объекта и настройка физики

В SpeedTree существует инструмент Forces, который отвечает за трансформацию моделей под воздействием определённых условий. В данном материале мы рассмотрим физику дерева относительно стороннего объекта в программе — площадки для будущего домика на дереве.

Для этого загрузим в сцену заранее подготовленный меш в формате .fbx: открываем вкладку Meshes, по аналогии с материалами нажимаем кнопку + и импортируем модель, а затем перетаскиваем её в сцену.

Примечание. В SpeedTree существует своя система исчислений в футах (её можно изменить в Preferences…Tree WindowScene Unit). Объекты, импортированные из других программ, могут оказаться большими по сравнению с деревом. Поэтому после импорта важно открыть настройки модели в окне Properties, при необходимости изменить размер в разделе TransformScale и ввести новые параметры в пункте Uniform.

Также желательно сбросить координаты в разделе Translation. Это избавит от возможных проблем, связанных с расположением меша при дальнейшем экспорте.

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

В Generation Editor выделяем ноды ветвей, положение которых будет зависеть от стороннего объекта, переходим во вкладку Forces и в одноимённом разделе ставим галочки напротив Allow и названия импортированного меша (в данном случае Plane). После этого сегменты дерева по умолчанию начнут тянуться к стороннему объекту.

Модель дерева после привязки к сторонней модели
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Теперь выделим сторонний меш, перейдём в Properties и найдём раздел Behaviour. Здесь находятся свойства, которые отвечают за «реакцию» растительности на объект.

Пункт Force:

  • Attract — ветви притягиваются к объекту (стоит по умолчанию);
  • Avoid — ветви отклоняются от объекта;
  • None — геометрия остаётся без изменений.

Пункт Collide влияет на рост ветвей:

  • Obstruct — ветви сталкиваются с геометрией стороннего меша и растут дальше, изгибаясь;
  • Prune — ветви сталкиваются с геометрией и ломаются;
  • Stop — принцип схож с Prune, но ветви не ломаются, а прекращают свой рост при столкновении с геометрией.
Реакции тонких ветвей при разных настройках
GIF: SpeedTree / Interactive Data Visualization, Inc

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

Регулировка направления ветвей по отношению к объекту с помощью дополнительного маркера во вьюпорте. Для наглядности лишние сегменты скрыты
GIF: SpeedTree / Interactive Data Visualization, Inc

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

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

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

Часто предупреждения в программе вызывают настройки Late в разделе Noise (вкладка Spine), которые не учитывают деформацию ветвей после воздействия физики. В этом случае желательно выставить их значения на 0 (включая настройки Variance Settings, которые открываются при нажатии на +/−) и при необходимости поработать над изгибами ветвей в параметрах Amount и Turbulence в пункте Early
Скриншот: SpeedTree / Interactive Data Visualization, Inc

При необходимости отдельные ветки подгоняем вручную.

Выборочное смещение ветвей в режиме Node
GIF: SpeedTree / Interactive Data Visualization, Inc

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

Полученный результат
Скриншот: SpeedTree / Interactive Data Visualization, Inc

Примечание. В полной версии SpeedTree свою работу можно экспортировать через File → Export to game… или Export mesh… Ниже — руководства по экспорту в Unreal Engine 4 и Unity.

Процесс экспорта в Unreal Engine 4
Процесс экспорта в Unity
Финальная работа с моделью дома и симуляцией ветра
GIF: SpeedTree / Interactive Data Visualization, Inc

Итог

SpeedTree — гибкий инструмент для создания растений. Его относительно несложно освоить, но, как и все редакторы, он требует усидчивости: тестирование всех настроек и возможностей займёт не один день. Но если разобраться в основных инструментах программы и иметь чёткий концепт на старте проекта, то процесс пойдёт значительно быстрее. Вопрос только в том, насколько сам разработчик нуждается в софте.

Максим Курбанов

3D-художник, IThub games

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

Огромный плюс SpeedTree — дружелюбный и интуитивный интерфейс, который легко освоить. Также программа значительно экономит время: например, процесс создания дерева может ускориться в три раза по сравнению с обычным софтом для 3D-моделирования. Не могу не отметить возможность рандомизировать параметры, что добавляет деревьям ту самую природную хаотичность. Если освоить процедурную генерацию, можно получать огромное количество вариаций одного и того же дерева в один клик.

Ещё хочется отметить возможность настраивать автоматический риг дерева, процедурные уровни детализации и коллизии, адаптивную оптимизацию и Vertex Colors, что очень помогает при работе с растительностью для игр. Когда работаешь в SpeedTree, то понимаешь, что разработчики любят своё детище и делают его на совесть. По моему мнению, сейчас программа справляется с созданием деревьев лучше, чем любой другой 3D-пакет».

Крупные студии используют SpeedTree в разработке масштабных проектов с огромными мирами, которые нуждаются в богатой и реалистичной флоре: создавать вручную гектары лесов слишком долго и затратно. В инди-сегменте ситуация немного иная, всё зависит от формата проекта.

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

Проверьте свой английский. Бесплатно ➞
Нескучные задания: small talk, поиск выдуманных слов — и не только. Подробный фидбэк от преподавателя + персональный план по повышению уровня.
Пройти тест
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована