Анимация приземления парашюта с помощью nCloth

Доброго времени суток.

Хочу поделиться небольшим уроком по созданию анимации приземления парашюта со стропами.

Разделю его на 4 части:

  1. Создание парашюта
  2. Динамика с помощью nCloth
  3. Использование nCache
  4. Немного о настройках nucleus и nCloth

1. Создание парашюта (упрощённая модель)

Для начала создадим сам парашют — Сфера (Subdiv. Axis 40 Subdiv. Height 25). Удаляем нижнюю полусферу, придаем форму парашюта. Выделяем каждую вторую группу вертикальных ребер и масштабируем их совсем немного в положительное значение по осям х и z. Применим Edit MeshCrease Tool. Нажав «3», включим режим сглаживания и увидим, как выглядит наш парашют в итоге.

Теперь перейдем к стропам. Это будет обычный цилиндр с 12 делениями по высоте и 4 по диаметру.  Радиус у меня получился 0.02. Удаляем верхние и нижние грани.

Опускаем точку привязки стропы (Pivot point) в самый низ, поворачиваем стропу к краю купола и дотягиваем масштабированием.

Делаем 19 «копий» стропы с помощью «Duplicate Special» с углом поворота по y = 18, добавляем маленькую стропу снизу, которая будет крепиться к спускаемому аппарату, и объединяем их в один Mesh (Выделяем их, в наборе меню Polygons, меню Mesh → Combine. Затем удалим историю преобразований «Delete History»). И, соответственно, добавим сам спускаемый аппарат.

Можно прорезать в основании парашюта дырДочку для реализма. Есть, как минимум, 2 варианта это сделать: 

  1. Вырезать удалением полигонов (что не очень корректно скажется на их поведении как ткани при просчете). Их, конечно, можно будет «сшить» описанным ниже способом, но это скажется на времени просчета…
  2. Созданием Ramp на прозрачности.

Первая часть урока готова.

2. Динамика с помощью nCloth

Создаем землю — Polygon Plane. Группируем парашют и привязываем его к группе спускаемого аппарата с помощью ConstrainParent. Анимируем спускаемый аппарат.

Выделяем купол, включаем набор меню 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.

Присоединим «локатор» к группе СА через ConstraintParent в группе меню 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 (КЭШ).

Перейдем на первый кадр, выделим купол и стропы и зайдем в настройки nCacheCreate 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 — более быстрые, но менее точные вычисления.
  • 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

662 0 850 15
11
2011-05-21
Интересно, спасибо!
2011-05-21
ну... а где результат?
2011-05-22
2 Skif [quote]previz_test_01 и previz_test_02[/quote] наверное, где-то там :)
2011-05-22
неплохо. но пробовать не буду. вреде и так все более менее понятно. Вот если бы автор добавил сюда ветер или собрал пароплан, вот тогда бы удивил. Да и результата очень не хватает.
2011-05-22
Результат сразу перед началом 3 части.
2011-05-22
[quote=V-snejok] Результат сразу перед началом 3 части. [/quote] о пасиб.. ну чтож.. не плохо... но не более... довольно стандартно... было бы интереснее если бы показал как парашютист прыгает и выкидывает параплан.
2011-05-23
2 sky_myth, Skif простите, конечно, что вмешиваюсь [smile=09] имхо, если урок называется «Анимация приземления парашюта с помощью nCloth», и в нем доступно описано, как сделать анимацию приземления парашюта с помощью nCloth — то это, как минимум, хороший урок. о парашютисте с парапланом речь изначально не шла, то есть, претензии, скажем так, странны. кстати, описание параметров ветра есть, в самом начале 4-ой части
2011-05-24
[quote=Александр Несмеянов] о парашютисте с парапланом речь изначально не шла, то есть, претензии, скажем так, странны. [/quote] внимательно прочитайте мои сообщения. претензий не было... я всего лишь высказал, то что считаю более нетривиальной задачей. а урок неплох, я об этом написал. оценку не поставил.
2011-05-24
[quote=Skif] ну чтож.. не плохо... но не более... [/quote][quote=Skif] я всего лишь высказал, то что считаю более нетривиальной задачей [/quote] задачи разные нужны, задачи разные важны. для кого-то этот урок будет открытием, а для кого-то и парапланерист — тривиальщина. у каждого свой уровень, и, как мне кажется, если автора не закидывать шапками с формулировкой «неинтересно», а, наоборот, поддержать и предложить развить тему, следующий урок может быть интересен даже тем, кому скучен этот (ничего личного :) 2 a1ex3d народ просит парапланеристов при сильном ветре, так что ждем новых уроков ;)
2011-05-24
Благодарим автора за урок, надеемся, что будет продолжение. Думаю, при текущем затишье текстовых уроков в рунете, автору нашедшему время взять и написать (причем качественно) особенная благодарность!
2011-06-13
мне как новичку лучше видеоурок, а здесь много непонятно, а в видео всё нагляднее... Ребята делайте больше видеоуроков со звуком, они и проще делаются и эфекта от них больше...
RENDER.RU