Анимация приземления парашюта с помощью nCloth
Доброго времени суток.
Хочу поделиться небольшим уроком по созданию анимации приземления парашюта со стропами.
Разделю его на 4 части:
- Создание парашюта
- Динамика с помощью nCloth
- Использование nCache
- Немного о настройках nucleus и nCloth
1. Создание парашюта (упрощённая модель)
Для начала создадим сам парашют — Сфера (Subdiv. Axis 40 Subdiv. Height 25). Удаляем нижнюю полусферу, придаем форму парашюта. Выделяем каждую вторую группу вертикальных ребер и масштабируем их совсем немного в положительное значение по осям х и z. Применим Edit Mesh → Crease Tool. Нажав «3», включим режим сглаживания и увидим, как выглядит наш парашют в итоге.
Теперь перейдем к стропам. Это будет обычный цилиндр с 12 делениями по высоте и 4 по диаметру. Радиус у меня получился 0.02. Удаляем верхние и нижние грани.
Опускаем точку привязки стропы (Pivot point) в самый низ, поворачиваем стропу к краю купола и дотягиваем масштабированием.
Делаем 19 «копий» стропы с помощью «Duplicate Special» с углом поворота по y = 18, добавляем маленькую стропу снизу, которая будет крепиться к спускаемому аппарату, и объединяем их в один Mesh (Выделяем их, в наборе меню Polygons, меню Mesh → Combine. Затем удалим историю преобразований «Delete History»). И, соответственно, добавим сам спускаемый аппарат.
Можно прорезать в основании парашюта дырДочку для реализма. Есть, как минимум, 2 варианта это сделать:
- Вырезать удалением полигонов (что не очень корректно скажется на их поведении как ткани при просчете). Их, конечно, можно будет «сшить» описанным ниже способом, но это скажется на времени просчета…
- Созданием Ramp на прозрачности.
Первая часть урока готова.
2. Динамика с помощью nCloth
Создаем землю — Polygon Plane. Группируем парашют и привязываем его к группе спускаемого аппарата с помощью Constrain → Parent. Анимируем спускаемый аппарат.
Выделяем купол, включаем набор меню nDynamics и в меню nMesh выбираем Create nCloth. При этом автоматически создается решатель динамики nucleus1 и nCloth1, который лучше сразу переименовать, например, в nCloth_kupol. Делаем то же самое для строп. Для земли — Create Passive Collider.
Можно проиграть анимацию и посмотреть, что получится. Парашют и стропы независимо друг от друга и от спускаемого аппарата падают на землю.
Выделим стропы и парашют, включим режим редактирования вершин F9. Выделяем все вершины касания строп и парашюта.
В меню nConstraint выбираем Component to Component, тем самым «сшивая» два nCloth в выделенных вершинах. Появился dynamicConstraint1. Перейдя в первый кадр анимации (если мы еще не там), мы увидим, какие именно вершины он «сшивает».
По умолчанию в параметрах dynamicConstraintShape1 — Constraint Method установлен в Spring — пружина. Лучше поставить его в режим Weld (связать). А параметр Connection Method (по умолчанию Nearest Pairs — ближайшие пары) — в параметр Whithin Max Distance, в моем случае, с параметром 0.2, чтобы не связывались лишние вершины. Переименуем dynamicConstraint1 в dynamicConstraint_top. То же самое сделаем для нижней части строп, где соединяются 20 строп с одной. Дадим имя dynamicConstraint_mid.
Присоединим стропы к спускаемому аппарату (СА). Выделяем самые нижние вершины и в меню nConstraint выбераем Transform. Для нижних вершин создастся dynamicConstraint1 в виде «локатора». Переименуем его в dynamicConstraint_bot. Опять же, изменим Constraint Method в Weld.
Присоединим «локатор» к группе СА через Constraint → Parent в группе меню Animation (выделим сначала группу СА, затем dynamicConstraint_bot).
Осталось изменить время включения просчета в момент касания спускаемого аппарата. Для этого достаточно задать параметр Start Frame решателя nucleus1 в момент времени касания СА с землей (40 в моем случае).
Также можно добавить ветер прямо в решателе nucleus1 во вкладке Gravity and Wind. Параметры Wind Speed = 12 и Wind Direction = -1 по оси Z (в моем случае). (Есть возможность добавлять стандартные динамические поля, путем выделения нужных nCloth и выбора нужного Field. Вкладка дублирована в наборе меню nDynamics.)
previz_test_01 и previz_test_02
3. Использование nCache
Полезно использовать каждый раз nCache (КЭШ).
Перейдем на первый кадр, выделим купол и стропы и зайдем в настройки nCache → Create New Cache.
Cache directory — папка хранения кэша.
Cache name — имя файла, соответственно.
File distribution:
- One file per frame — создаст общий для выделенных объектов набор файлов для каждого кадра
- One file — создаст единый файл КЭШа для выделенных объектов
- One file per geometry — будет создавать для каждого выделенного объекта свои наборы файлов или один файл на объект.
По умолчанию, симуляция просчитывается для каждого кадра и результат сохраняется для каждого кадра.
Evaluate every — просчитывать динамику для каждого # кадра.
Save every — записывать динамику в файл для каждого # просчета.
Evaluate every # frame(s) и Save every # evaluation(s) полезны, например, когда, вы планируете растянуть длину просчета nCache для создания эффекта «slow motion», для этого Evaluate every # frame(s) устанавливаем в 0.1 и Save every # evaluation(s) в 1 для записи данных экстраКЭШ в nCache. Когда вы смасштабируете nCache в 10 раз (параметр Scale), симуляция будет выглядеть как эффект «замедленное движение».
При неудачном или непонравившемся просчете удаляем КЭШ «Delete Cache» с выделенных объектов.
4. Немного о настройках nucleus и nCloth
4.1. Nucleus
Enable — вкл/выкл все вычисления.
Gravity and Wind
- Gravity — стандартная настройка гравитации для всех nCloth.
- Gravity Direction — направление гравитации. По умолчанию y = -1.
- Air Density — влияние ветра на nCloth. Ветер не оказывает влияния при значении 0
- Wind Direction — это не вектор, это усилитель Wind Speed, например 0.5, 1 и 0.5 будет означать, что Скорость ветра Wind Speed будет вполовину по x и z и полное значение по y.
- Wind Noise — добавляет случайное движение ветру
Ground Plane
- Use Plane — при значении On создается воображаемый Plane, расположеный по значениям Plane Origin, и будет действовать как Passive Collider.
- Plane Bounce — по умолчанию 0, при значении 1 вся энергия от падающего на поверхность объекта возвратится ему обратно, и, как результат, он отскочит.
- Plane Friction — чем больше значение, тем больший эффект трения создает поверхность.
- Plane Stickiness — объекты «прилипают» или как бы »цепляются» за поверхность.
Solver Attributes
- Substeps — количество вычислений за один кадр, по умолчанию 3. Вы можете увеличить это значение до 6, например, для большей детализации анимации, однако это увеличит время просчета.
- Max Collision Iterations — количество проверок пересечений объектов в одном Substep. по умолчанию 4, вы можете увеличить до 32, например, для более точного результата.
- Collision Layer Range — использовать слои столкновения, например, 1, 2, 3 и 4. По умолчанию collision layer range равен 4, при этом все объекты будут участвовать в вычислении. Чтобы collision layer (разбиение просчета по слоям) работал, необходимо уменьшить layer range до 0.5 и для кажого объекта указать свой слой в настройках nCloth (параметр Collision Layer), тогда все 4 объекта будут просчитываться отдельно. Collision Layer Range = 4 (preview_01) и Collision Layer Range = 0-0.9 (preview_02). При Collision Layer Range = 1 первый и второй объекты объединяются в первый слой, остальные перейдут на следующие (preview_03).
Time Attributes
- Start Frame — просчет будет осуществляться только с этого момента времени.
Scale Attributes
- Time Scale — временно?е масштабирование. Например, при значении 0.5 результат более плавный, но более замедленный. Если значение = 2 , симуляция происходит в 2 раза быстрей визуально.
- Space Scale — пространственное масштабирование. По умолчанию значения задаются в метрах. Если хотите поменять на дециметры, тогда 0.1, на сантиметры 0.01
4.2. nCloth
Enable (On) — вкл/выкл вычисления для данного nCloth
Collisions
- Collide (On) — вкл/выкл просчет столкновения для данного nCloth
- Self Collide (On) — вкл/выкл просчет самопересечения для данного nCloth
- Collision Flag (Face) — позволяет определить, какие компоненты полигона будут участвовать в вычислении столкновения:
- face — более точный, но менее быстрый.
- edge, vertex — более быстрые, но менее точные вычисления.
- face — более точный, но менее быстрый.
- Collide Strength (1) — значения от 0 (что то же самое, что Collide Off) до 1, что означает полное вычисление взаимодействия между nCloth.
- Collision Layer (0) — задает слой, в рамках которого будут просчитываться столкновения. Например, у вас есть 2 флага на палках, выбираете одну пару и присваиваете ей collision layer = 1, для другой collision layer = 2. Это разделит две пары от взаимодействия друг с другом, сократив время симуляции. по умолчанию collision layer = 0, что означает, что просчет взаимодействия будет происходить для всех объектов. Важно: работает с Collision Layer Range в параметрах nucleus.
- Thickness (0.024) — толщина поверхности для просчета взаимодействия в passive colliders. Этот параметр не влияет на самопересечение, что делает self collision width scale.
- Self Collide Width Scale (1) — Self Collision Thickness = Self Collide WIdth Scale × Thickness. По умолчанию = 1, при этом self collision thickness = thickness, при значении = 0.5, только наполовину. Действует только на самопересечение.
- Friction (0.1) — обычно значение по умолчанию дает не очень реалистичный результат, или, например, как будто шелк скользит по бритой ножке (как в рекламе). При увеличении этого параметра шелк будет «цепляться» за поверхность. Вычисляется в направлении касательной.
- Stickiness (0) — похоже на Friction, только вычисляется в направлении нормали. Создайте наклонный Passive и nCloth Plane c 20 делениями по горизонтали и вертикали. Поэкспериментируйте.
Dynamic Properties
- Stretch Resistance (20) — сопротивление растяжению. Малые значения — более эластичная ткань. Stretch resistance зависит от разрешения объекта (необходимо увеличивать это значение, если объект высокого разрешения).
- Compression Resistance (10) — сопротивление сжатию. Контролирует, насколько вершины «сопротивляются» сжатию друг к другу (см. test_stretch_compress).
- Bend Resistance (0.1) — определяет, насколько объект сопротивляется изгибу по граням. Высокие значения — практически не сгибается.
- Rigidity (0) — определяет, насколько текущий nCloth будет вести себя как твердотельный. Значение 1 делает nCloth твердотельным, когда как значения 0-1 делают гибрид между cloth (ткань) и rigid body (твердое тело).
- Deform Resistance (0) — определяет, насколько текущий nCloth пытается сохранить свою форму.
- Mass (1) — Определяет плотность nCloth или вес nCloth, когда nucleus gravity больше, чем 0. Например, 0 подходит для шелка и 1 для felt (войлок, фетр).
Описание всех параметров nCloth с иллюстрациями и анимацией (на англ. языке): http://www.joelstutz.com/VC/nCloth.html