Для не посвящённых, меня зовут Хигерович Людмила. Я биотехнолог по профессии, а по хобби художник и 3D-моделлер со стажем. Многие приёмы в 3D мне в свое время приходилось осваивать самой, а кое-чему даже учить других.
Сейчас по многим программам можно найти толковые туториалы, и даже на русском языке. Однако большая часть из них написана для тех, кто УЖЕ что-то начал изучать в этом направлении и знает десяток-другой специальных терминов или принципов, что только повышает порог вхождения в индустрию даже на уровне любителя. Что ж, это не очень справедливо.
Мы начинаем цикл статей, в котором простым языком знакомим вас с тонкостями 3D-технологий. Сегодня мы расскажем вам об одной важной механике, продвинувшей игростроение, мультипликацию и 3D в целом на многие годы вперед — о риггинге.
Примечание:
пост рассчитан на тех, кто еще только знакомится с тонкостями 3D-моделирования, и в некоторых случаях понятия подаются несколько утрировано для понимания сути процесса. В тексте будет много упоминаний программ, сайтов и сервисов, а также игр и разработчиков игр. Не сочтите это за рекламу. Также в тексте будут встречаться рендеры моделей и текстуры из различных игр. Это иллюстративный материал, приведенный в качестве примера работы той или иной карты. |
▎Риггинг и анимация
Спойлер:
Некоторые термины из предыдущих статей, связанные с 3D-моделированием^
- Меш (mesh) — «физическая» часть модели, поверхность модели, состоящая из полигонов (многоугольников) и их вершин. Совокупность мешей составляет объект (в случае замкнутой геометрии) или модель (в любом случае. Даже один полигон — уже модель).
- Текстура или карта (texture map) — изображение, накладываемое на полигоны меша, раскраска модели. Может быть картой цвета, картой нормалей (имитации объема) или частью шейдера (программного скрипта с эффектом визуализации).
Риггинг (англ. rigging — оснастка) — процесс создания и настройки костей (bones) скелета модели, а также создания «развесовки» (weight) для подготовки модели к анимации. |
Риг персонажа в Unity. Иллюстрация с сайта learn.unity.com
Разумеется, не вся анимация моделей костная. Идея привести модель в движение родилась практически одновременно с мыслями о создании самих 3D-моделей, хотя первые анимации были исключительно геометрическими, а риггинг пришел в индустрию намного позже.
Условно анимацию модели можно подразделить на следующие типы:
• Костная анимация (rigged animation)
— Положение и деформации модели зависят от движения костей в пространстве.
Костная анимация мимика (моя модель для одного из прошлых проектов)
• Деформации и морфы (deform mesh, morphing)
— Программа записывает непосредственно изменения самого объекта или его части, будь то смена одной геометрической сетки на другую или перемещение части вершин или полигонов относительно модели.
Почти вся мимика и настройка рас персонажей TES V: Skyrim выполнена в виде морфов. Да, даже аргонианская. Разве что для каждой расы базовая голова своя. Лица ГГ при этом хранятся также в виде файлов-пресетов, включающих настройки морфов геометрии лица и текстур. Лица NPC (неигровых персонажей) в большинстве своем также продублированы в виде сохраненных отдельно голов, что облегчает создание модификаций. |
Напротив, лица героев серии Dark souls, а также Bloodborne, Demons souls и Elden Ring хранятся только в виде морфов базовой головы (файлы с расширением .tri) и не имеют отдельных моделей, посему модифицировать внешность NPC и тем более вытащить ее из файлов становится затруднительно. |
• Динамическая текстура (dynamic map)
— Анимированная текстура, либо сменяющая части карты (как при создании спрайтов, наподобие Hollow knight и типичных текстур эффектов пламени в играх) или постепенно мигрирующая по поверхности меша текстура (эффекты воды и передвижение облаков в играх)
Атлас (карта спрайтов) главного героя Hollow knight и текстура динамического фантомного эффекта Dark souls III
• Векторная деформация
— характерна для программ, не имеющих полигонального построения, крайне редка по причине редкости векторной 3D графики
Есть и другие типы, но большая часть из них является разновидностью вышеназванных. Хотим обратить ваше внимание на то, что 3D-индустрия не является наукой, ее терминология неконвенциональна (т. е. не является общепризнанной) и названия инструментов, принципов и отдельных приемов могут варьировать в зависимости от автора и «школы».
Основное преимущество именно костной анимации заключается в том, что в ее основе лежит скелет. |
Скелет модели полностью оправдывает свое название — мало того, что у гуманоидных и большинства негуманоидных моделей он и правда повторяет основные кости и суставы настоящего скелета, так еще и выполняет схожую функцию. Конечно, если его удалить, модель не упадет на пол бесформенной куклой (если вы не накосячили с физикой), но кости позволяют двигать модель более реалистично, чем просто вращать части модели «гизмой».
Впрочем, бывает, что модель все же падает — если вы неправильно настроили иерархию костей, и по какой-то причине родительская кость находится рангом ниже своих дочерних костей. Мой мимик из предыдущего проекта.
Gizmo — стандартный инструмент деформации, ориентированный на изменение по трем осям (XYZ). Включает перемещение (move), поворот (rotate) и масштабирование (scale/size). В общем виде обычно визуализируется как три стрелки из общей точки, параллельные осям координат, и три кольца в разной плоскости. Кроме того, словом «гизмо» могут также называть все подобные инструменты, режимы редактирования модели по осям и соответствующий инструмент настройки внемодельных функций.
▎Анатомия модели. Скелет и кости
Скелет модели в общем виде выглядит примерно так:
Есть несколько основных костей, каждая из которых имеет свое имя и/или номер. Имя кости нужно для регистрации изменений ее положения в пространстве относительно оси координат и других костей, а также для сохранения этих положений в формате поз или анимаций и последующей загрузки их на эту же модель или модель с аналогичным скелетом. Плюс по названию кости вы с легкостью найдете ее в общем списке даже с начальным уровнем английского языка.
Учтите, что анимации скелета с одними названиями не подойдут для скелета с другими именами. Это один из камней преткновения при создании игровых модификаций: я часто встречаю запросы типа «я хочу модельку отсюда с его родной анимашкой взмаха мечом вот в эту игру» (особенно из Dark souls в Skyrim). Но здесь помимо проблем с именами костей встает еще масса препятствий, о которых, быть может, мы расскажем позже.
Окно скрипта-помощника по настройке вашего риггинга персонажа под параметры VRchat:
Обращаем ваше внимание на то, что названия костей и иерархия скелета могут отличаться в зависимости от программы, в которой вы работаете, поэтому мы будем приводить сразу несколько вариантов названий. |
Сейчас мы кратенько пройдемся по общей схеме строения скелета, более-менее универсальной для всех программ.
Базовая кость (dummy, root bone, motherbone, basic bone, etc) — кость, обычно расположенная в центре осей координат (иногда в центре «масс» модели). Ее уже достаточно для создания простейшей анимации прыгающего мяча, например.
Для модели человека эта кость обычно находится в области таза и является «родительской» (parent bone) для всех остальных костей модели.
Лирическое отступление
Для удобства работы иногда добавляют еще одну базовую кость (God или аналогично названные root ground, basic, null и т. п.), более «старшую», чем основная кость. Иногда это необходимо, если первая кость не находится в центре осей, а располагается в центре модели в случае, когда модель находится над сеткой координат XZ или смещена относительно центра. Эта кость всегда находится в нулевой точке и предназначена для облегчения перемещения модели над сеткой так, чтобы не было необходимости серьезно менять положение центральной кости. Например, при ходьбе модели по сложной траектории эта кость двигает всю модель целиком, тогда как базовая кость тела обеспечивает покачивание и наклон тела перемещением относительно нее.
Это может показаться сложным, пока не начнете настраивать модель и анимировать ее самостоятельно. В большинстве крупных игр (особенно бродилок) сначала настраиваются «статичные» анимации. То есть, аниматор отрабатывает все движения тела персонажа при ходьбе или взаимодействии, не перемещая модель относительно нулевой точки (по крайней мере, не трогая ту самую нулевую старшую кость), и только потом подключает возможность перемещения за ту самую кость.
Но надо понимать, что некоторые камерные игры (например, детективные триллеры на Unreal engine) или отдельные сцены (например, катсцены — пре-записанные игровые анимации и синематики) могут пренебрегать этим правилом для красоты кадра или в случае нецелесообразности создания таких базисных анимаций. Скажем так, нет необходимости записывать триста тридцать три варианта бега, ходьбы и переходных анимаций между ними, если ваш условный персонаж сделает два шага по комнате до карты на столе, нажмет кнопку и на этом его полномочия все.
От материнской кости модели отходят две важные ветви — верхний и нижний скелет.
Нижний скелет (lower body) обычно короче, так что начнем с него.
Кость таза (hip bone, pelvis/pelvic bone, lowerbody) — дочерняя непосредственно корневой кости. К ней крепятся кости бедер (thigh, upperleg), и при наличии — кости хвоста (tail), юбки (skirt), живота (belly, underbelly), гениталий и т.п. За костями бедер (thigh) идут кости голеней (knee bones, calf bones, lowerleg, shin) с пометкой «правая» и «левая» соответственно (right/left, _R/_L), а следом кости стопы (foot bones, ankle).
У животных и демоноподобных моделей за костями голени могут следовать кости horseshin (т.н. лошадиное колено), обеспечивающие риг запястья и плюсны соответствующего вида, а уже следом за ними могут идти кости стопы.
Кости стопы могут быть последними в списке (в самых простых скелетах), а могут продолжаться костями передней части стопы и пальцев (общая кость toes), либо костью каждого пальца (toe 1, toe a1, toe big и т.п.) и даже когтей (toeclaw).
Верхний скелет (upperbody) начинается с кости спины (spine). Если в спине модели несколько костей, то они именуются, соответственно, spine 1, spine 2, либо spine lower, spine middle, spine upper, spine chest и т.п.
Самая верхняя кость спины (chest, spine upper) является родительской сразу для нескольких важных костей, в первую очередь, кости шеи (neck, cervix) и костей плеч (shoulders, clavicles, collarbones), а также второстепенных костей воротника, амулетов и прочего.
Кости плеча/ключицы (collarbones, clavicles, shoulders) продолжаются соответственно плечевой костью (upperarm, shoulder lower), а потом костью предплечья (elbow, forearm, lowerarm). К предплечью крепится кисть (hand, wrist. Удивительно, не правда ли? :-)), а к ней кости пальцев (fingers и thumbs, также с номерами либо с приписками названий пальцев — ring (безымянный) и т.п.).
Интересный факт
Еще совсем недавно даже в топовых играх не все пальцы имели хотя бы одну собственную кость. Игра Dark souls PDTE имела по три кости для большого и указательного пальца, и три общие кости для среднего, безымянного и мизинца вместе взятых. На тот момент этого было достаточно для создания видимости движений и захвата оружия, а большей детализации не требовалось, да и работа аниматоров сильно облегчилась. Сейчас этот лайфхак используют только маленькие студии и разработчики мобильных игр — вы все равно вряд ли разглядите анимацию пальцев, если не будете знать о такой маленькой хитрости.
Перчатка черного сета Вилки из Dark Souls PTDE
Кости шеи (neck) именуются так же, как и кости спины — в зависимости от количества (длины шеи вашего персонажа) — neck 1, 2, 3 или neck lower, neck middle, neck upper. За ними, естественно, следуют кости головы — cranium, head. На этом базовый скелет заканчивается и начинается ужас под названием «лицевой риггинг».
Каждый, кто хоть раз настраивал лицевые кости без скриптов и уловок, знает, как это тяжело!
Лицевой риггинг в базовом своем виде включает кость нижней челюсти (jaw), кости глазных яблок (eye, eyeball), кости верхних век (upper eyelid), и кости бровей (brows). В более продвинутом варианте добавляют кости нижних век (lower eyelids), кости губ (lips), языка (tongue) и добавочные кости бровей (аналогично пронумерованные). В очень продвинутом варианте в губах может быть 6-8 костей, плюс добавлены кости щек (cheekbones, checks), кости уголков глаз и иногда кости ушей (ears, особенно для эльфов), кости подбородка (chin) и носа (nose, nosetip).
Не у всех язык без костей!
Особенно это актуально для ММО РПГ, где окно настройки лица вашего персонажа работает не с морфами, как в Скайриме и Elder ring, а с костями. В этом есть как плюсы (вроде более тонкой настройки), так и минусы (например, «слетающие» пресеты и «ломающиеся» лицевые анимации во время игры).
Лицевой риг Genesis — базовой модели Daz Studio 3D, основы создания персонажей для ленивых и богатых
Как я называю, в «упоротом» варианте в губах модели может быть до 20 костей, по 8 в каждой щеке-скуле, 6 для бровей, 8 для разных частей носа (крыльев, переносицы, кончика носа) и дополнительные кости, названия которых вам ни о чем не скажут. Но надо отметить, что иногда такой риггинг оправдан — например, в случае переноса захвата движений в анимацию (motion capture). Так, например, лицевые анимации в игре Detroit: become human выполнены именно захватом мимики живых актеров. На лицо каждого из них крепили маленький шарик-маркер, изменение положения которого и регистрировала программа, а потом превращала это в движение костей лица.
Кадры со «съемок» Detroit: Become human. Интерактивное кинцо в действии
Но обычно такой детализации риггинга не требуется. Так что вы со спокойной душой можете использовать любой понравившиеся вам скелет, лишь немного подогнав его по суставам. Либо использовать предустановленный — обычно такие скелеты идут в комплекте с программным обеспечением.
▎Особенные кости
Помимо обычных и базовых костей, двигающих непосредственно конечности, есть ещё специальные кости. Их существует несколько видов.
Фикс-кости
Первые из них — кости дополнительного влияния или фикс-кости (adjustment, joint, fix, adj, roll и т.д.) — они мало чем отличаются от обычных костей. Однако их область влияния чрезвычайно мала (в играх 2010 — 2017 они буквально тянули две-три вершины или пару полигонов). Однако их роль не так малозначительна.
Фикс-кости располагаются обычно в суставах (местах соединения костей) или вдоль основной кости и зачастую не имеют дочерних костей. Их функция проста: когда сгибается условный локоть у модели, фикс-кость чуток поправляет меш, чтобы тот не сильно деформировался. На первый взгляд, ненужная мелочь, однако её работа становится заметной при полном сгибании сустава или повороте руки вокруг продольной оси (условной кости предплечья). В некоторых случаях (например, в Witcher 3, последних Final fantasy, а также в мультипликации) отдельные участки (то же предплечье) могут целиком состоять из цепочки adj-костей для обеспечения плавности разворота руки.
ADJ-кости в руках Авалакха из Withcher 3 (имена костей не оригинальные)
Маркеры и Dummy
Ещё один вид костей — «пустые» материнские кости или кости-маркеры. Они не имеют влияния на меш, из-за чего при конвертации из одного формата в другой они могут «потеряться», так как программа не увидит их влияние на меш и посчитает лишними, но являются родительскими для нескольких отходящих от них костей. Так, например, в тех же ММО РПГ (Bless online, например) все кости лица держатся на такой пустой кости, имя которой является маркером для редактора персонажа. Аналогичная кость-маркер есть и для волос, прикрепляющихся к ней словно парик.
Маркер прикрепления магии на скелете дракона из TES V
Кроме того, такие кости могут служить местом прикрепления SFX или попросту эффектов. В TES V Skyrim есть кость, отвечающая за прикрепление ту’ума (местной магии, в том числе огненное дыхание драконов). Аналогичная кость в играх есть и для оружия и магии.
Маркеры вращения
Кости, немного похожие по своим функциям на adj кости, но редко имеющие собственное влияние на меш, как предыдущие. Эти кости нужны для придания частям основного скелета дополнительных функций, и на практике именно в играх встречаются нечасто. В основном они используются в графическом движке для создания анимаций, а после удаляются из финальной модели.
Поворотные маркерные кости в Autodesk Maya
Зависимые кости
Связанные кости (linked) — особый вид костей, включающий два функциональных подвида: маркер и цель, или руководящие и зависимые кости (собственно, linked bones, target bones). Смысл их существования в том, чтобы прилинкованные кости повторяли вращение за ведущей костью-маркером.
Руководящая кость может находиться где угодно, хотя обычно располагается либо непосредственно перед управляемыми костями (и является дочерней к их главной кости), либо крепится за базовые кости (root), но в иерархическом списке костей она всегда должна быть выше (не все программы требуют строгого соблюдения этого правила, но не стоит рисковать). Зависимые кости же могут быть самостоятельными или организованными в цепь. При этом на один маркер может приходиться до нескольких десятков ведомых костей.
Linked bones, организованные в цепи, очень удобно использовать для анимаций хвостов, хлыстов, цепей и тентаклей. Все тот же мимик
Некоторая модификация прилинкованных костей — управляющие маркеры в некоторых инструментах Maya Autodesk и аналогичных программ.
IK-кости
Кости инверсивной кинематики или IK-кости (inverse kinematic) — совершенно уникальный тип костей. У нас опять есть кость-маркер (только на сей раз ее положение строго регламентировано) и прилинкованная к ней цепочка зависимых костей. Только на этот раз маркер находится на конце прилинкованной цепочки, и его позиция в списке не так важна, а изменение положения этого маркера осуществляется преимущественно не вращением, а перемещением. При этом, перемещая маркер инверсивной кинематики, мы заставляем прилинкованные кости реагировать так, будто мы двигаем конец настоящей цепочки суставов.
IK-кости обычно делают дочерними самой начальной кости (той самой нулевой),
чтобы было удобнее контролировать движение
Этот прием широко используется в играх и мультипликации для создания более-менее реалистичных движений при ходьбе. Если вы сделали IK-кости ног, то перемещение торса относительно нулевой кости ощущается, как переминание с ноги на ногу без отрыва пяток от земли.
▎Развесовка. Влияние костей
Итак, вы создали модель и даже сделали ей риг. Что дальше?
Дальше идет процесс под названием развесовка или рисование влияния (weight painting). Суть его заключается в том, чтобы назначить каждой косточке участок модели, который она будет за собой тянуть. Процесс весьма сложен, и заслуживает отдельной статьи, поэтому остановимся на нем кратенько.
Визуально это обычно выглядит так: красным обозначается максимальное (100%) влияние выбранной кости, а синим минимальное (~0%). Черным окрашивают вершины, не поддающиеся влиянию выбранной кости.
В разных программах окраска переходного влияния может различаться.
Для большей плавности, между двумя соседними костями настраивают совместное влияние: одну и ту же вершину одновременно тянут две кости. В зависимости от нужд моделлера и конкретного участка модели граница между участками влияния может быть как более жесткой (для суставов и механических частей), так и сильно размытой (для волос, щупалец или хвоста).
Опять же, нет какого-то единого правила для настройки веса. Более того, многие программы оснащены инструментами автоматической развесовки. Однако в случае более сложных моделей, чем базовый манекен, они не слишком-то хорошо справляются, и все равно приходится «допиливать руками».
▎Скелет — это база!
Есть и еще одно неоспоримое преимущество скелета, благодаря которому игровая индустрия взяла старт на первой космической скорости — его универсальность.
Как мы уже говорили ранее, в каждой программе существует свой базовый набор имен костей или даже базовые скелеты, предустановленные в папках образцов и пресетов. Причем имена эти различны не только между разными программами, но и внутри одной программы. Кроме того, никто не мешает вам придумать свои названия для каждой кости, но и анимации и некоторые инструменты вам также придется перенастраивать.
Зачем еще нужен этот предустановленный скелет? Неужели только для примера?
На самом деле, нет. Как правило, с этим предустановленным скелетом в комплекте идут и предустановленные анимации. Самые простые — вроде ходьбы. Загружая предустановленные позы и анимации, вы сможете проверить, как настроили веса.
Являясь базой для создания и загрузки анимаций, скелет позволяет не создавать отдельно анимации для каждой модели, а делить их (анимации) и использовать повторно (при условии одинаковых имен костей). Более того, в некоторых случаях различия в скелете и именах костей являются ключевым моментом в организации игровых механик. Так все действующие лица и животные TES V Skyrim поделены на расы, в основе которых — особенный скелет со своим набором анимаций (исключение — гуманоидные расы, имеющие общий скелет, и аргониане с каджитами, скелет которых отличается от человеческого только наличием костей хвоста). Разумеется, в редакторе можно применить расу и к другому скелету, но это потребует борьбы со скриптами и шаманизма в плане взаимодействия «фракций».
Узнаете анимации? Да, это модели из Dark souls PDTE, но переригованные на скелет драконов Скайрима. Увы, сделать новый скелет на основе дарксоуловского в редакторе Creation kit невозможно, а посему пришлось немного изменить пропорции моделей и поджать передние лапы Каламиту
В большинстве современных игр анимации, так или иначе, используются повторно в рамках одной игры. Однако некоторые разработчики идут дальше и используют те же анимации в последующих своих проектах. Так из игры в игру в серии Dark Souls (а помимо этого, в Bloodborne, Demon’s souls и Elden ring) кочуют некоторые анимации персонажа при использовании оружия, отдельные сеты анимаций рядовых противников и даже пара анимаций боссов. Но надо отдать разработчикам должное: анимации выполнены настолько круто, что смотрятся уместно даже в современной игре, и незнающий человек не заметит подвоха (да, и я не придираюсь).
Только ленивый фанат не попинал Аватар Древа Эрд, вспоминая Демона прибежища и двух его брательников. Но похожий босс повторялся еще в Dark souls 3. А если вспомнить Авангарда из Demon’s souls…
Кроме одинаковых скелетов, анимации можно загружать и на скелеты других конфигураций, имеющие соответствующие названия костей. И они даже будут работать. Только вот при этом даже самая проработанная анимация, скорее всего, будет «ломаться»: малейшее отступление от изначальной позы скелета влияет на загруженные движения. Порой это не так заметно (на гуманоидных моделях, близких к Т позе), порой очень режет глаз (например, при попытке загрузить танец маленьких лебедей на какого-нибудь монстра). Впрочем, это не мешает плодить дешевые шоу на ТВ и копеечные мини-игрушки в Steam.
▎Итого
Риггинг — важная веха в истории 3D-моделирования. Наравне с изобретением карт нормалей и физики, это один из самых мощных принципов визуализации. А главное — двигатель прогресса в игростроении и инструмент колоссального облегчения работы 3D-моделлеров и игро- и киноделов.
Для начинающего моделиста риггинг может оказаться почти непосильной задачей. Однако большинство программ так или иначе содержат туториалы и образцы скелетов для апробации Ваших сил без необходимости тратить нервы на создание правильной иерархии костей.
Если вам все же захотелось сделать свой риг (или ваша модель «неконвенциональна» и имеет оригинальную геометрию), то вот несколько простых правил, работающих абсолютно в каждой программе:
- Начинайте с «нулевой» кости. Самая первая кость в начале осей координат (положение 0;0;0) будет самой старшей в иерархии, и её наличие в последствии избавит вас от некоторых проблем.
- Если есть возможность, не стесняйтесь использовать встроенные в движок скелеты — редактировать их обычно намного проще, чем настраивать иерархию самому. Если нет возможности — подсмотрите названия костей и их положение у схожих моделей и сделайте по подобию.
- Если вы делаете модель для определенного движка, то для начала ознакомьтесь с требованиями к костям. Некоторые старые графические движки поддерживают ограниченное количество костей (Оpen GL в свое время держал до 60-80 костей скелета, а формат PMD до сих пор с трудом переваривает больше 160), другие не «едят» инверсивную кинематику, третьи перед загрузкой требуют переименовать маркеры.
- Уточняйте имена костей. Опять же, это важно, в первую очередь для игрового движка, однако некоторые графические редакторы тоже могут придираться к именам костей. Так имена костей Red engine (Witcher 3), Unreal engine и Creation engine (Skyrim) различаются настолько сильно, что одного взгляда будет достаточно, чтобы определить, из какого движка скелет перед вами.
- Старайтесь перед риггингом расположить вашу модельку так, чтобы ее было максимально комфортно риговать и анимировать. Обычно это вариации Т-позы или Л-позы. Оптимальным считается вариант с положением рук в 30 градусов вниз от горизонтальной плоскости — так удобнее настраивать «развесовку» и потом анимировать модель.
Модель здорового человека и модель Бифезды (угадайте, где чья. Ось Z направлена вправо).
Конечно, можно поступить, как Bethesda при создании Скайрима — наплевать на ориентацию по осям, придумать свои имена костей и изменить Л-позу, опустив руки почти вертикально вниз. Однако хотя бы поверхностное знакомство с моддингом Скайрима покажет, какими проблемами это чревато.
На сегодня на этом все. Эта статья должна была быть еще больше, но мой рабочий компьютер отказался делать наглядные иллюстрации после недели рендеринга для большого проекта с работы, поэтому подробные разборы непосредственно процесса анимирования и создания правильных кейфреймов мы разберем как-нибудь в другой раз.
▎Всего хорошего и не болейте!
НЛО прилетело и оставило здесь промокод для читателей нашего блога: — 15% на все тарифы VDS (кроме тарифа Прогрев) — HABRFIRSTVDS