Как сделать симуляцию ткани в unity

Добавил пользователь Morpheus
Обновлено: 04.10.2024

Комментарии • 21

Спасибо за урок.
P.S. буквосочетание "th" читается как что-то среднее между русскими с и з (язык немного выступает за передние зубы). То есть cloth звучит примерно как "клос" или "клоз", в зависимости от акцента :).

Огромное спасибо за видео! Еще было бы круто сделать урок, чтобы персонаж/враг мог бегать или ползать по стенам)

У вас такой прелестный английский). Спасибо за урок.

Привет) Сделаешь урок на счётчик дней! Ну например, игра началась идёт счётчик дней, при смерти показывается сколько дней прожил игрок. Пожалуйста!

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

да,в RPG играх часто можно встретить плащи и для того чтобы придать им физику поведения ткани используют именно такую штучку.Достаточно указать коллайдер персонажа(на видео я указывал коллайдер палки),чтобы плащ не проходит на сквозь тела и закрепить вершины плаща (подобно тому как я закреплял вершину флага к палке).Это придаст красивую физику поведения плаща.

Комментарии • 21

Спасибо за урок.
P.S. буквосочетание "th" читается как что-то среднее между русскими с и з (язык немного выступает за передние зубы). То есть cloth звучит примерно как "клос" или "клоз", в зависимости от акцента :).

Огромное спасибо за видео! Еще было бы круто сделать урок, чтобы персонаж/враг мог бегать или ползать по стенам)

У вас такой прелестный английский). Спасибо за урок.

Привет) Сделаешь урок на счётчик дней! Ну например, игра началась идёт счётчик дней, при смерти показывается сколько дней прожил игрок. Пожалуйста!

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

да,в RPG играх часто можно встретить плащи и для того чтобы придать им физику поведения ткани используют именно такую штучку.Достаточно указать коллайдер персонажа(на видео я указывал коллайдер палки),чтобы плащ не проходит на сквозь тела и закрепить вершины плаща (подобно тому как я закреплял вершину флага к палке).Это придаст красивую физику поведения плаща.

Снаряжение персонажей в Shadow Fight 3 имеет множество элементов, подверженных физической симуляции, которая добавляет динамики происходящему на экране. Одной из основных трудностей, с которой мы столкнулись при настройке физики для данных элементов, является тот факт, что кости, к которым они прискинены, находятся внутри иерархии скелета самого персонажа. При движении они повторяют трансформации родительских костей и не получают физически реалистичного импульса.

Самым простым решением стал детач костей. После инициализации всех элементов снаряжения с помощью скрипта мы вынимаем кости физически активных элементов из иерархии скелета персонажа и, используя компонент Character Joint, создаем связь с родительской костью.

Рассмотрим это решение на примере шлема мародёра, спартанский гребень которого подвержен физической симуляции. Мы разбили гребень на 5 частей, каждая из которых была прискинена к разным костям. В настройках Joint этих костей выставили лимиты на поворот по нужной оси и задали параметр Twist Limit Spring, отвечающий за эффект пружины.

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

Можно было бы считывать количество кадров в текущей анимации, потом вычитать из этого значения 15‑20 кадров и прикладывать импульс по истечении полученной разницы. Однако лишней арифметики нам удалось избежать, привязав момент срабатывания импульса к окончанию интервала анимации uninterrupted.

У каждой анимации (опять же кроме боевой стойки) есть преднастроенный период, в течение которого игрок не может её прервать. По истечении этого срока или в момент получения удара интервал uninterrupted заканчивает своё действие, и в этот момент срабатывает наш импульс. Нужно было только настроить исключения для нескольких анимаций.

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

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

В ряде случаев (например, с металлическими пластинами) использование коллайдеров неизбежно. Однако основную нагрузку несёт не само наличие коллайдеров, а расчёт их столкновений. Минимизировать эту нагрузку помогает тонкая настройка матрицы столкновения слоёв (Layer Collision Matrix) в Project Settings. Для подобных элементов мы используем два отдельных слоя, которые коллизятся только между собой, таким образом избегая просчёта столкновения с коллайдерами других слоев (оружия, пола, стен и так далее).

В Shadow Fight 3 есть несколько типов оружия, для которых применяется физическая симуляция вне атакующих анимаций. На текущий момент это нож на цепи, кусаригама, нунчаки и цеп. По описанным выше причинам мы решили вынимать кости оружия из иерархии персонажа вне атакующих анимаций и возвращать обратно тогда, когда физическая симуляция не требуется.

Манипулируя параметром Is Kinematic в компоненте Rigidbody костей, в зависимости от ситуации мы включаем и выключаем физику для них.

Однако при использовании кусаригамы и ножа на цепи мы столкнулись с повышенной нагрузкой на слабых устройствах и получили просадку FPS. Проблема возникала именно тогда, когда кости возвращались в иерархию персонажа и физическая симуляция для них отключалась. Связано это с тем, что изменение трансформов родительской кости в иерархии скелета даёт нагрузку на физический движок для каждой дочерней кости, на которой есть компонент Rigidbody, даже если активен параметр Is Kinematic. И чем длиннее иерархия, тем больше нагрузка.

Решением стало создание физического клона. Рассмотрим это на примере ножа на цепи.

Во время загрузки боя для него инициализируется два скелета: основной, который находится внутри иерархии персонажа, и его физический клон. В костях основного скелета отсутствует компонент Rigidbody, на их трансформацию влияют только анимационные треки. Кости второго имеют настроенные связи (Joint) и компонент Rigidbody с активным параметром Is Kinematic.

В то время как на трансформацию костей основного скелета влияет анимационный трек, например, во время удара, параметр Is Kinematic в компоненте Rigidbody костей физического клона остаётся активным. Кости не трансформируются и не подвергаются физической симуляции. Во время последнего кадра анимации происходит синхронизация трансформов костей двух скелетов.

Физический клон считывает положение и ротацию костей основного скелета и задаёт своим точно такие же параметры. Затем деактивируется Is Kinematic, и кости физического клона подвергаются симуляции. Далее, вплоть до начала следующей атакующей анимации, уже основной скелет считывает каждый кадр трансформ костей физического клона, которые в этот момент двигаются по физике, и задаёт эти параметры своим костям. Такой подход позволил существенно снизить нагрузку на физический движок и улучшить производительность на слабых устройствах.

Также симуляцию тканей мы использовали при создании FX-эффекта пламени на оружиях и на голове босса Теневой разум. В настройках Cloth для этих элементов мы отключили влияние гравитации и задали значения ускорения (Acceleration) по оси Y: постоянный, чтобы пламя стремилось вверх, и рандомный — для эффекта трепыхания. Чтобы при движении не было резкого искажения геометрии, мы выставили повышенное значение сопротивления (Damping). Таким образом мы получили достаточно реалистичный и дешёвый в плане производительности эффект пламени.

В момент смерти и в определённых ситуациях при получении удара для персонажей в Shadow Fight 3 активируется симуляция физики. Долгое время для этого использовалась стоковая физика твёрдых тел Unity. Однако при внедрении синхронного PvP в проект от неё пришлось отказаться в пользу собственной разработки.

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

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

Самое простое, на первый взгляд, решение — во время физической симуляции брать положение персонажа на одном клиенте и передавать на другой, синхронизируя их. Но регдолл персонажа представляет из себя длинную иерархию костей с большим количеством отдельных независимых твердых тел (конечности, голова), для корректной синхронизации положения которых нужно передать большой объем данных за короткий промежуток времени.

Итак, что же представляет из себя наш регдолл? Тело состоит из узлов, которые являются материальными точками. У них нет ориентации, но есть положение и масса, и между ними реализованы связи регулируемой жесткости. К каждой кости внутри скелета персонажа привязана группа таких узлов. Данная архитектура подразумевает отсутствие внутренних коллизий и ограничений в суставах, а внешние коллизии и трение реализованы на уровне узлов. При движении узлов в пространстве учитываются гравитация, внешние силы и инерция.

Между узлами существует два вида связей: жёсткие рёбра (синие) и эластичные мышцы (красные). Рёбра играют роль костей, заставляя узлы находиться на определенном расстоянии друг от друга и не давая им разлететься в разные стороны. Мышцы же из любого стартового положения формируют из узлов определённую позу, стягивая их, если расстояние между ними больше целевого значения, и расталкивая, если меньше.

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

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

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

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

Изначально при переходе в физику мышцы жёстко расталкивали узлы, приводя их в нужную позицию. Зачастую резкость этого расталкивания также приводила к тому, что конечности сильно выкручивались. Мы добавили плавное увеличение силы мышц, чем сильно улучшили ситуацию.

В течение первых двух кадров после начала симуляции физики сила мышц сохраняется максимальной, чтобы стабилизировать узлы после применения к ним импульса. Затем мышцы расслабляются, их сила становится 55% , а далее в течение 120 кадров сила постепенно увеличивается вплоть до 100%.

Последним шагом стало добавление двух стабилизирующих узлов: спереди на уровне груди и сзади на уровне ног. Эти узлы имеют рёберные связи с фиксированными узлами груди и таза соответственно, а мышцами стягивают нестабильные узлы. Стабилизирующие узлы имеют низкое значение массы и не имеют коллизии с полом, в отличие от остальных узлов.

На гифке ниже вы видите результат: мы получили полностью детерминированную физику, построенную на целочисленных вычислениях, стабильно работающую при 60 FPS даже на самых слабых устройствах, которые мы поддерживаем.

Cloth можно использовать только с Skinned Mesh Renderer, но это не означает, что при использовании простых объектов вы также должны экспортировать FBX с информацией о скине в Max. Фактически, вы можете создать новый GameObject и назначить компонент Cloth, который автоматически добавит Skinned Компонент Mesh Renderer, а затем назначьте сетку основного тела в компоненте Skinned Mesh Renderer и установите правильный материал. Ткань может воспринимать внешние воздействия, но совсем не будет оказывать влияние на внешнее твердое тело, другими словами, Физическое моделирование тканевой системы является односторонним.

По соображениям производительности существует только два Collider-а, которые могут влиять на Cloth, SphereCollider и CapsuleCollider, но SphereCollider можно назначить два как группу (конечно, вы также можете назначить только один. Эти два остаются нулевыми), тогда третий тип может появиться путем объединения этих двух SphereCollider. Unity соединит два SphereCollider в этой группе, тогда может быть конусообразный коллайдер.

щелкните здесь

, чтобы открыть режим ограничения редактирования.

Max DistanceВы можете установить максимальное расстояние перемещения каждой вершины. Чаще всего используется установка максимального расстояния неподвижных вершин равным 0.

Surface PenetrationОн контролирует максимальную степень, в которой вершины могут быть встроены в сетку. Разницу можно четко сравнить, когда вершины сетки ткани относительно редки.

VisualizationЗдесь вы можете выбрать текущий предварительный просмотр в режиме просмотра сцены.Max Distanceвсе ещеSurface Penetration. (Выберите один из двух), вы также можете выбрать, разрешить ли операции воздействовать на вершину на задней стороне области просмотра.

В режиме редактирования Select вам нужно выбрать несколько вершин с помощью выделения кадра или Shift + щелчок, чтобы выбрать вершины, а затем установить флажок перед Max Distance или Surface Penetration, что означает, что я хочу изменить значение выбранных вершин сейчас! Затем сзади Введите желаемое значение в значение, и все в порядке.Если вы хотите установить вершины с текущим значением на Без ограничений, вам нужно только выбрать вершины со значением и снять соответствующий флажок.

Читайте также: