Как и в случае с Rigid Body, добавление одежды в вашу сцену требует, чтобы вы понимали разницу
между Physics Shapes и Graphical Mesh.
Давайте предположим, что у вас есть персонаж из одного Graphical Mesh для рубашки.
Рубашка одета на персонажа у которого есть суставы и Skin Mesh.
Рубашка имеет визуальный хлопчатобумажный материал, который контролирует её внешний вид.
Graphical Mesh это то что будет видно на рендере. Мы называем это Graphical Mesh.
Вам необходимо, чтобы симуляция изменила именно вершины (Vertex) этого Graphical Mesh.
Есть 3 типа одежды: Separately (Отдельные), внутренне (internally) и незаметные (invisibly), для каждого
предмета одежды используются дополнительный Graphical Mesh. Именно вершины (Vertex) этой формой
перемещаются с помощью PhysX. Как вы, наверное, догадались, мы называем это “Physics Shapes”.
Положение вершин в этой сетке используется для обновления вершин в вашем Graphical Mesh.
Одним из основных различий между одеждой APEX и стандартной симуляцией ткани, является связь
между расположением вершин (Vertex) в Graphical Mesh и местоположением симуляции. При анимации
каждой физической вершине разрешено свободно перемещаться внутри сферы, (Рис.12). Радиус этой сферы
для каждой вершины определяется с помощью атрибута Max Distance (Максимальное Расстояние).
Установка небольших значений расстояния Max Distance позволяет привязывать или ограничивать
перемещение для определенных вершин в соответствии с вашей анимацией. Например, вы можете
использовать Max Distance, чтобы убедиться, что бретельки майки не спадают с плеч вашего персонажа,
или убедиться что бы, низ платья не поднялся выше определенной величины.
Рис.12
Одежда, созданная на персонаже, по умолчанию ничего не знает об остальной части персонажа.
Хотя вы можете использовать Max Distance равным нулю, чтобы некоторые вершины вообще
не перемещались из своего местоположения, но всё ровно остальные вершины смогут свободно
проходить прямо через тело вашего персонажа.Чтобы заставить вашу одежду взаимодействовать
с вашим персонажем, есть два механизма, ограничивающих её движение: Backstop и Rigid Body
Наименее затратным вариантом с точки зрения производительности является использование функции
под названием Backstop. Backstop иногда называют “animation collision” или “a-collision”, поскольку
он использует анимированную поверхность одежды в качестве поверхности столкновения для одежды.
(Это не совсем верно, но является хорошей отправной ментальной моделью того, как выглядит Backstop).
Для каждой вершины вы указываете расстояние в обратном направлении (по нормали), на которое может
перемещаться вершина. Backstop не позволяет вершине двигаться назад в эту область.
Закрашенная поверхность, показанная на Рис.13, представляет собой поверхность столкновения
с Backstop collision. (на самом деле поверхность сферы намного больше, чем сфера с Max Distance)
Рис.13
Positive (позитивные) значения позволяют вершине перемещаться в обратном направлении от исходного
местоположения. Чем больше значение, тем дальше назад может переместиться вершина. Если расстояние
Backstop больше радиуса сферы Max Distance (как показано в примере на Рис.13, сфера со значением +3),
Backstop не будет иметь никакого эффекта.
Используйте положительные значения Backstop, когда ваша одежда поверх нижележащих предметов,
и вы хотите, чтобы она могла немного отклониться назад.
Нулевые значения Backstop превращают сферу Max Distance в (примерно) полусферу. Обратите внимание,
что для любых convex (выпуклых) участков одежды (на Рис.13 видно вершину с Backstop со значением -2)
это все равно позволит вершине плавно перемещаться за Skin Mesh, если он соскользнет в сторону
от своего положения.
Используйте значения ноль Backstop для имитации тела под одеждой без каких-либо “Rigid Body”.
Вам даже не нужна та поверхность персонажа которую скрывает одежда.
Negative (негативные) Значения Backstop выталкивают полусферу наружу.
(Как показано на Рис.13 в значениях -2 и -6), разрешённые местоположения для вершины не включают
позицию с радиусом. Чем отрицательнее значение, тем более раздутой становится одежда.
Используйте небольшие отрицательные значения Backstop, чтобы помочь отодвинуть одежду
дальше от тела персонажа, предотвращая проникновение в нижележащей Graphical Mesh.
Для большинства областей вашей одежды вы хотите, чтобы внутренняя часть, была по существу плоской.
Для тех областей, где основной Graphical Mesh довольно изогнут (например, ткань на рукаве),
вы можете захотеть, чтобы Backstop был изогнутым. Для вершин в таких областях вы можете закрасить
“Backstop Radius” в меньшее значение. Однако обратите внимание, на то, как поверхность сферы,
изгибает Backstop во всех направлениях (например, не только вокруг рукава).
-skinned clothing normals указывают направление, в котором вы хотите ограничить движение.
(Не симулируйте морщины с помощью анимации суставов Skin Mesh.)
-surface of the clothing is not sharply concave - Поверхность одежды не является резко вогнутой.
(Его не следует использовать, например, в области подмышек.)
-simulated vertices не будут удаляться далеко от своего Graphical Mesh который привязан к суставам.
(Это не будет полезно в нижней части струящегося платья.)
-Animated vertices остаются примерно на одинаковом расстоянии от нижележащего Graphical Mesh.
(Вы не можете использовать Backstop, чтобы нога вашего танцующего персонажа не прошла через платье,
если это происходит во время анимации Skin Mesh). Для любых других областей вам нужно
использовать Rigid Body.
Rigid Body, в вашей сцене, будет раздвигать одежду примерно так, как вы могли бы ожидать.
Kinematic Rigid Body, прикрепленный к суставам вашего персонажа, позволяет размещать примитивы
столкновения, “Physics Shapes” представляющие части тела, и заставлять их отталкивать одежду
от этих частей тела.
По сравнению с Max Distance, Rigid Body являются значительно более не выгодным с точки зрения
производительности, способом ограничения движения одежды. Вы должны использовать Max Distance
для каждой вершины для каждой области, которая это позволяет, для трудных мест используйте
примитивы “Physics Shapes” Rigid Body но старайтесь использовать Rigid Body только по необходимости.
Rigid Body может быть создан вручную на суставах или путем создания “RagDoll”.
Использование тонкой поверхности для симуляции одежды обычно используют на закрытых участках
тела персонажа. Кто может сказать, на сколько толстая кожаная куртка на самом деле, просто взглянув
на ее поверхность? Однако если поверхность одежды, с видимым краем, то она обнажает
ее истинную толщину. (Рис.14)
Рис.14
Рассмотрим случай с тонким рукавом кожаной куртке. Вы можете использовать Max Distance и Backstop
для удержания рукава на расстоянии от руки, придавая пальто видимую толщину вдоль рукава. Однако край
рукава выглядит неправильно. Чтобы исправить это, нужно добавить толщину
к Graphical Mesh на рукаве. (Рис.15)
Рис.15
Пока все хорошо. Однако запуск симуляции показывает проблему. Поскольку рукаву не присущ объем,
вершины сворачиваются сами по себе. Представьте, что кожаный рукав на самом деле сделан
из сверхтонкого шёлка, поэтому он так не реально выглядит. (Рис.16)
Рис.16
Для решения этой проблемы существует атрибут для каждой вершины, называемый “Latch to Nearest”
(Привязка к ближайшему). что бы переключится на него Paint > Paint Attributes > Attributes > latchToNearest
Когда вы включаете для определенных вершин “Latch to Nearest”, он будет привязываться к ближайшей
симулируемой вершине. Несимулированные, фиксированные вершины перемещаются вместе
с симулированными вершинами на основе смещения от исходной формы местоположения.
Это позволяет рукаву оставаться “толстым” и все же прикрепляться к концу рукава. (Рис.17)
Рис.17
Белая область относится к подчиненным вершинам, (Рис.17) которые будут закреплены на ближайших
главных вершинах, показанных как черная область. Эти вершины будут имитировать и поддерживать
Max Distance с ближайшими главными вершинами, сохраняя таким образом, форму одежды. Другие случаи,
когда вы, возможно, захотите использовать “Latch to Nearest”, это прикрепит подол к низу платья или юбки,
привязать одну смещённую поверхность толстой накидки к другой поверхности или прикрепить к одежде
предметы, такие как карманы.
Рис.18
Чтобы использовать одежду APEX на вашей модели, вам
нужны, по крайней мере, две вещи:
Предположительно анимированный Персонаж с суставами.
Graphical Mesh для вашей одежды. Skin Mesh персонажа
должен быть отрегулирован таким образом, чтобы анимация
одежды удерживала его на постоянном расстоянии
от нижележащих частей тела. Поверхность одежды должна
быть гладкой, без смоделированных складок.
Как показано на Рис.18, ваш Graphical Mesh может
состоять из квадов вместо трианглов. Также показана
ситуация, когда одежда проникает сквозь Graphical Mesh
персонажа. Хотя это и не идеально, это просто потребует от
нас использования “Rigid Body” для столкновения,
вместо Backstop в этой области.
Первым шагом в создании одежды является добавление APEX Clothing на выбранный Graphical Mesh.
Это можно сделать, выбрав опцию “Create Clothing”
Maya HotBox > PhysX > PhysX Clothing > Create Clothing
Internally (Внутренний) создает триангулированный “Physics Shapes” из вашего Graphical Mesh,
который может отображаться в виде наложенного поверх Graphical Mesh.
Для поддержки дальнейшего тестирования рекомендуется установить флажок
в Outliner выбрать “MeshClothingNode” Attribute Editor > General > Enable Simulation In Playback.
Без этого, одежда APEX на самом деле ничего не будет делать внутри Maya. (Рис.19)
Рис.19
Вашей первой остановкой при создании одежды должно быть открытие инструмента рисования, чтобы
установить Max Distance и значения Backstop для каждой вершины. Что бы открыть Paint:
в Outliner выбрать “MeshClothingNode” Attribute Editor > Physical Material > Paint . (Рис.20)
Рис.20
Существует три способа визуализации значений при их изменении во время рисования:
с помощью выпадающего меню Visualization Mode в разделе Paint Attributes инструмента Paint
можно выбрать следущие варианты:
“Lines” - отображает значения покраски в виде линий
“Sphere Frame” - отображает значения покраски в виде каркасных сфер
“Sphere Solid” - отображает значения покраски в виде не прозрачных сфер. (Рис.21)
Рис.21
Начните с установки расстояния Max Distance для вершин в одежде. Чтобы убедиться, что у вас есть
чистый лист для работы, везде установите Max Distance равным нулю Убедитесь, что операция покраски
установлена в положение “Replace” (перезапись). Мы не хотим Add (добавлять), Scale (масштабировать)
или Smooth (сглаживать) существующие значения. Рис.20 функции Paint operation. Когда Max Distance
равен нулю, вы в режиме “Replace” нажмите кнопку “Flood”.
Если для “Visualization Mode” установлено значение “Lines”, вы увидите, что все красные линии для
значений каждой вершины исчезнут (из за того, что “Max Distance” установлен со значением ноль).
После этого используйте кисть, чтобы выборочно включить движение на вершинах. Чтобы убедиться, что вы
рисуете именно те значения, которые вы хотите, мы настоятельно рекомендуем в разделе Paint Brush
использовать кисть Solid Brush (сплошную кисть) No falloff (без снижения Opacity) Рис.22
Рис.22
Нажмите кнопку “Paint”, чтобы войти в режим рисования, а затем начните красить кистью, чтобы примерно
установить Max Distance для вершин. Оставьте Max Distance равным нулю в любом месте, где вы хотите,
чтобы одежда была прикреплена к этому месту.
Если в “Visualization Mode” установлено значение “Sphere Frame”, вы увидите для каждой вершины
красные сферы Max Distance. Чем больше радиус сферы, тем дальше может перемещаться вершина.
В нашем примере мы позволяем нижней части плаща перемещаться на довольно большое расстояние,
но нижняя половина плаща перемещается всего на несколько дюймов. Мы прикрепляем верхнюю
часть плаща к его телу, чтобы она не падала и не скользила. (Рис.23 Рис.24 Рис.25) в этом случаи
“Visualization Mode” переключен на “Lines”
Рис.23
Рис.24
Рис.25
После выполнения некоторой грубой покраски важно сгладить переходы Max Distance. Если вы позволите
одной вершине переместиться на 12 дюймов, но ее соседу переместиться только на 6 дюймов, ваша одежда
может натолкнуться на невидимые выступы и коряги, поскольку некоторые вершины перестают двигаться,
в то время как другие нормально двигаются. Чтобы исправить это, установите операцию “Paint”
в положение “Smooth” и либо покрасьте кистью резкие участки, либо несколько раз нажмите кнопку “Flood”.
Будьте осторожны при применении Flood со значением Smooth: беспорядочное сглаживание может быстро
превратить вершины Max Distance ровным нулю в вершины с очень малым значением Max Distance.
(Рис.23 Рис.24 Рис.25) Хотя это почти не будет иметь визуальной разницы, это повлияет на
производительность. Вершины с нулевым Max Distance фактически удаляются из просчёта симуляции,
что позволяет вам сосредоточить ресурсы симуляции на важных областях одежды, где это будет иметь
наибольшее значение. Используйте Max Distance ровным нулю везде, где это возможно.
Когда вы работаете со своей моделью, полезно запустить симуляцию и проверить, всё ли идёт по плану.
Вся симуляция для плагина PhysX может управляться с помощью Maya Shelf. Нажмите кнопку
“Start Simulation“, чтобы увидеть во вьюпорте Maya имитацию вашей одежды.
Рис.27
На данный момент с помощью нашей примерной модели,
симуляция показывает, что наш плащ свисает,
как и требовалось, но он проходит прямо через ноги
персонажа. Давай это исправим. (Рис.27)
Вашим первым инструментом для устранения проблем с проникновением, всегда должен быть Backstop,
из-за его значительно более низкой нагрузки, чем у Rigid Body. Чтобы рисовать с помощью Backstop,
перейдите в Paint Tool > Paint Attributes > Attributes и установите атрибут “backStopOffset”.
Backstop будет активен только в тех местах где присутствует Max Distance.
Выберите “Lines” из раскрывающегося списка “Visualization Mode” в разделе “Paint Visualizer”,
что бы при рисовании отображались линии для Backstop. (Рис.28)
Рис.28
Доступен тот же vertex false-coloring (ложная раскраска вершин), что и для Max Distance. Существует
дополнительное значение “No effect” для Backstop, визуализируемое в виде пурпурного цвета, которое
представляет любое значение Backstop, превышающее Max Distance.
Хорошим первым шагом для Backstop является заполнение со значением ноль. Это предотвратит движение
одежды назад из Skin Mesh положения (для областей, где одежда не сильно движется).
Если “Paint” или “Flood” дают вам неожиданные результаты, проверьте, в каком режиме покраски
вы работаете Replace mode или Smooth mode.
После установки Backstop везде на ноль, увеличенные значения Backstop и нарисуйте в том месте,
где ваша одежда должна иметь возможность двигаться назад. Используйте длину линий визуализатора
и blue surface (синюю поверхность), чтобы приблизить их к Graphical Mesh, но не касаться её.
Как и в случае с Max Distance, затем вы должны сгладить значения Max Distance,
чтобы обеспечить плавный переход от вершины к вершине.
Если вы рисуете подпорку и в некоторых местах одежда проникает в персонаж,
вы можете использовать режим масштабирования со значением чуть меньше 1,0 (например, 0,95),
чтобы постепенно уменьшить значение. Каждый щелчок и рисование немного укорачивают линию:
продолжайте нажимать и рисовать, пока красные линии не проникнут в нижележащий Graphical Mesh.
Флажок “Backstop Displacement” (в разделе “Paint Visualizer) обеспечивает альтернативный механизм
визуализации Backstop. Вместо того, чтобы создавать вторую blue surface (синюю поверхность)
для представления Backstop, Graphical Mesh одежды сам отодвигается назад, чтобы представить
теоретическую поверхность Backstop. (Backstop на самом деле представляет собой серию сфер
для каждой вершины, но визуализируя его в виде большой поверхности путем соединения точек
на этих сферах не очень далека от результатов, которые вы увидите при больших значениях
радиуса Backstop). В любом месте, где вы видите одежду, проникающую под плащ персонажа,
вам нужно уменьшить значение смещения Backstop, чтобы продвинуть одежду вперед.
Backstop не будет хорошо работать в любом месте, где одежда не находится на постоянном расстоянии от
основного Graphical Mesh (например, нога персонажа при анимации проникает в плащь), или вершины
одежды смогут ударяться об персонажа при анимации (например, струящаяся юбка или платье). Для таких
областей вы должны нарисовать значение Backstop “No Effect”, чтобы отключить Backstop.
Флажок “No Effect” переопределяет указанное значение и вместо этого устанавливает пользовательское
значение смещения Backstop, которое гарантированно будет больше любого Max Distance,
которое вы когда-либо могли создать.
Поставте флажок “Show Physical Mesh Solid” в разделе “General > Display” узла “APEX Clothing”,
чтобы что бы отобразить Physics Shapes. Включите флажок “Show Physical Mesh Wire”
что бы отобразить топологию Physics Shapes.
Как только вы добьетесь наилучших результатов, используя только Backstop, вам все равно может
потребоваться использовать “RagDoll” на суставах вашего персонажа. Он могжет быть добавлен
вручную к каждому суставу (см. “Создание “RagDoll”); Это позволяет указать, какие соединения
получает “RagDoll”, и настроить некоторые параметры, общие для всех них.
Для создания “RagDoll” на выбранных суставах вашего персонажа: Выберите skin mesh
вашего персонажа. (Если у вашего персонажа Graphical Mesh не привязан к суставам (No Skin),
суставы привязаны только к одежде, то вы можете выбрать эти суставы для симуляции “RagDoll”.
Maya HotBox > Ragdolls > Create Kinematic RagDoll. Это создает и выбирает новый Helper PhysX RagDoll.
По умолчанию все суставы добавляются в Helper. (Рис.29)
Рис.29
Рис.30
В разделе “Joint” вкладки “Attribute Editor” для “RagDoll” выберите те суставы, которые не должны соприкасаться с вашим персонажем, и затем нажмите кнопку “Remove”. Модификаторы “Rigid Body” добавляются в каждый сустав. По умолчанию все они представляют собой “Convex Hull”
размером с вершины skin mesh персонажа. (Рис.30)
Рис.31
Если у вас нет skin mesh или вам необходимо
дополнительно повысить производительность,
вы можете изменить Shape Type
в разделе Regenerate с “Convex Hull” на “Capsule”,
убедитесь, что Simulation Type установлен
на “Kinematic”, и нажмите кнопку
“Entire Skeleton” (Весь скелет),
чтобы регенерировать “Rigid Body”
на всём “RagDoll”.(Рис.31)
“Rigid Body” будет заменён на “Capsule”,
при столкновении с одеждой, сможет делать
симуляцию на порядок быстрее, чем “Convex Hull”
Чтобы дополнительно настроить параметры “Rigid Body”, дважды щелкните имя соединения в списке соединений “RagDoll” (чтобы выбрать его), а затем выберите вкладку “Rigid Body” в Attribute Editor,
чтобы отредактировать свойства модификатора “Rigid Body” .
Во время симуляции вы можете обнаружить, что одежда слегка проникает сквозь “Rigid Body”.
Чтобы контролировать, на каком расстоянии находится одежда от “Rigid Body”, отрегулируйте параметр Surface Thickness clothing в разделе Cloth > Material Attributes узла APEX Clothing.
На данный момент ваша одежда готова примерно на 90%. Все, что остается, - это настройка параметров,
значений покраски и размещения Collision (столкновения).
Хотя все параметры подробно описаны в справочнике модификатора APEX Clothing,
есть три параметра, на которые вы, возможно, захотите обратить особое внимание:
01 - Параметр Gravity Scale в разделе Material Attributes определяет,
насколько сильно гравитация влияет на вашу одежду.
Чем ниже значение, тем больше ваша одежда будет плавать.
Чем выше значение, тем больше ваша одежда будет тянуться и растягиваться.
02 - Говоря о растяжении, параметр растяжимости “Stretch Stretchiness” это ваша первая линия защиты
от чрезмерно растянутой одежды. Если ваша одежда слишком сильно растягивается и вы больше не можете
уменьшать Gravity Scale, увеличьте жесткость, чтобы ваша одежда меньше растягивалась.
03 - Если ваша одежда все еще слишком сильно растягивается, включите флажок для Anti-Stretch algorithm
(при незначительных затратах на производительность).
Чем больше Anti-Stretch Factor к 1,0 (в разделе “Advanced Attributes”) ,
тем меньше вашей одежде будет позволено растягиваться.
Ниже приведены некоторые дополнительные советы,
которые следует иметь в виду при создании одежды.
No Scaling
APEX Clothing (не говоря уже о большинстве игровых движков) плохо сочетается
с масштабированными суставами skin mesh. Вы, вероятно, столкнетесь с некоторыми проблемами,
если у вас где-то в вашем skin mesh или иерархии суставов будет не единый масштаб.
У вас почти наверняка возникнут проблемы, если в вашей сцене будет применён
какой-либо non-uniform scale (не одинаковый масштаб). Вам, безусловно, не нужно, что бы в вашей сцене
были какие-либо off-axis scales (перекосы или шкалы со смещением оси вращения).
Для достижения наилучших результатов держите всё в масштабе <1,1,1>.
Лучше использовать Backstop чем Rigid Body
форма столкновения Backstop - гораздо менее затратная по производительности, чем “Rigid Body”.
Хотя заманчиво бросить “Kinematic Ragdoll” на вашего персонажа, добавить все суставы
и установить их все на “Convex Hull”, это будет заметно медленнее, чем использовать Backstop
для имитации столкновения с персонажем, везде где это возможно.
Избегайте Graphical Mesh Под Одеждой
Иногда вам нужен Graphical Mesh под одеждой персонажа. Например в районе ног, которые могут быть
обнажены, когда платье задирается, или нижнюю часть спины персонажа, где корт может приподняться,
и оголить эту часть спины. В других областях Graphical Mesh на самом деле не требуется. Например,
плотный рукав куртки никогда не обнажит предплечье или локоть персонажа под ним.
Вы должны воспользоваться ситуацией,
когда Graphical Mesh не требуется, и в этих местах ваш персонаж должен быть без Graphical Mesh.
Удаление Graphical Mesh с этих мест ускорит конечный результат. Что еще более важно (для вас),
вам не придется беспокоиться о поиске или исправлении ошибок при проникновении ткани,
когда одежда может провалиться сквозь тело и отобразить его часть поверх.
Установите FPS соответствующим образом
Симуляция APEX Clothing использует частоту кадров, заданную в глобальных настройках вашей сцены,
чтобы определить, как далеко перемещать объекты в каждом кадре. Низкая частота кадров
позволяет объектам симуляции перемещаться очень далеко в одном кадре, возможно,
пропуская столкновение или взаимодействие, которые должны были произойти в середине кадра.
Установите частоту кадров вашей сцены как можно выше (или в соответствии с вашей игрой).
Точная Настройка Анимации
01 - Чтобы иметь возможность использовать Backstop в максимально возможной степени,
убедитесь, что ваша анимированная одежда всегда находится вне skin mesh вашего персонажа,
на постоянном расстоянии от него.
02 - В дополнение к поддержанию высокого уровня FPS (см. Выше) избегайте резких движений в анимации.
Резкая анимация (например, поворот на 180 градусов в одном кадре) создает физически
нереальные ускорения, которые в результате приводят к нереальной симуляции.
03 - Во время выполнения в вашей игре убедитесь, что FPS одинаков (или почти одинаков).
Неравномерная выборка FPS может привести к резким изменениям скорости vertex (вершин).