Изменения физики в Unity 2022.1: расширение робототехнического инструментария

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

Улучшения Physics Debugger

Physics Debugger — это важный инструмент как для понимания внутреннего устройства физического движка, так и для осмысления конкретного поведения, наблюдаемого в каком-либо проекте. Хороший дебагер — важнейший инструмент для создания убедительной, современной и проработанной физики. Учитывая это, мы полностью обновили его пользовательский интерфейс и добавили несколько интересных фич. 

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

До обновления, раздел “Info” инспектора (Inspector) двух компонентов Rigidbody и ArticulationBody был сворачиваемым, его можно было развернуть для просмотра дополнительной информации, например, данных текущей линейной скорости. Однако после того, как мы разворачивали это раздел, общая производительность редактора значительно снижалась. Кроме того, в предыдущей версии сравнивать параметры разных тел было неудобно, так как нужно было открывать две панели инспектора. Для решения этих проблем, мы переместили все свойства в раздел “Info” окна Physics Debugger, где они будут отображаться для каждого из выбранных объектов рядом друг с другом, чтобы вы могли легко их сравнивать.

Также теперь можно визуализировать точки контакта, нормаль контакта и расстояние разделения.

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

Инверсная динамика

До сих пор в Unity были инструменты, которые поддерживали только то, что мы называем прямой динамикой: суть которой состоит в том, чтобы по заданному набору объектов и приложенным к ним силам вычислять их траектории. Хотя это невероятно полезно, мы хотели расширить наш робототехнический набор инструментов. В связи с чем, в Unity 2022.1 добавлена ​​поддержка инверсной (обратной) динамики, то есть при заданном объекте и заданной траектории вычисляются силы, результирующие в этой траектории при симуляции.

Осуществление всего задуманного будет возможно за несколько релизов, так как мы подходим к реализации итеративно. В Unity 2022.1 мы предоставим набор функций для расчета компонентов текущей общей силы, приложенной к ArticulationBodies, которым необходимо противодействовать, прежде чем применять внешнюю силу для направления их по желаемой траектории. В последующих релизах будут реализованы другие интересные концепции, такие как общая сила, необходимая для противодействия импульсу, приложенному решателем (solver). Предлагаем вам опробовать это и поделиться своими мыслями на форуме.

В частности, новые функции, которые будут добавлены:

  • получение данных о текущей силе, приложенной к телу движителем. Это показатель того, насколько сильно движитель пытается достичь желаемой цели. Это зависит от жесткости и демпфирования движителя, а также от текущих дельт положения и скорости цели;

  • получение данных о суммарной силе, необходимой для противодействия силам тяжести, Кориолиса и центробежным силам, действующим на тело; и

  • получение данных о суммарной силе, необходимой для достижения желаемого ускорения. 

Интерполяция и экстраполяция

Чтобы создать впечатление плавного движения при симуляции со сравнительно низкой частотой, Rigidbody использует как интерполяцию, так и экстраполяцию. Внутренне это реализуется путем вычисления поз трансформов при каждом обновлении. В случае интерполяции две последние смоделированные позы используются для расчета новой позы трансформа для данного кадра. В случае экстраполяции вместо этого используются последняя смоделированная поза и скорость. Однако в целях оптимизации физического движка, мы не передаем эти позы ему обратно. Позы представлены только для систем вне физики (например, графика и анимация). По этой причине, например, raycast не обнаружит тело в интерполированной позе.

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

  1. Если в сцене присутствует хотя бы одно интерполированное тело, все изменения трансформов всех физических компонентов синхронизировались с физическим движком при каждом апдейте (даже если они требуются всего один раз для FixedUpdate); и

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

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

Фидбэк с форумов

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

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

  • Для соединения двух Rigidbodies используется джоинт, который определяет ограничения их относительного движения. Начиная с Unity 2020.2, джоинт также можно использовать для соединения Rigidbody с ArticulationBody. Чтобы сделать это возможным, каждый класс Joint получил дополнительное свойство, которое отображается в инспекторе. Одновременное соединение Rigidbody и ArticulationBody невозможно, поэтому отображение обоих параметров, когда один из них уже установлен, необоснованно занимает лишнее место по вертикали. Теперь же, отображается только то свойство, которое было установлено.

  • Кинематическое Rigidbody  — это особый тип тела, которое может влиять на другие тела, однако само не подвергается воздействию других тел. В этом отношении оно аналогично статическому коллайдеру, за исключением того, что оно предназначено для частого перемещения. Типичными вариантами использования являются контроллеры персонажей, анимационная физика, моделирование запястий в виртуальной реальности и т.д. Оно управляется путем установки кинематической цели, которую тело достигнет всего за один кадр симуляции. Основное отличие статического коллайдера здесь в том, что достижение кинематической цели достигается не мгновенной телепортацией (смена позы), а вычислением линейной и угловой скоростей, необходимых для достижения цели за один кадр, и последующей передачей их в решатель. Таким образом, движение может правильно влиять на якобиан ограничений, и, таким образом, любая присоединенная цепочка джоинтов будет реагировать правильно (без сбоев). В этом релизе Unity будет представлен новый метод для установки положения и поворота кинематической цели за одну операцию.

  • Модификация контактов, представленная в Unity 2021.2, позволяет изменять сведения о контактных точках, созданные узкой фазой, прямо перед тем, как они будут использоваться для создания контактных ограничений для решателя. В этом релизе мы добавим новые геттеры для скоростей тел в контактной паре для нетривиальных юзкейсов, таких как этот пример кастомного анизотропного трения

  • Версия PhysX была обновлена ​​до 4.1.2, последней в линейке 4.x на сегодняшний день. Это минорный релиз, поэтому он устраняет только критические ошибки и сбои. Примечания к релизу собраны здесь.

  • Когда динамическое тело накладывается на коллайдер, решатель стремится найти корректирующий импульс, который разъединит их, удовлетворяя при этом всем ограничениям. Внутренне этот импульс вычисляется для каждой точки контакта в паре, но у нас было только агрегированное значение, которое возвращало общую сумму по всем точкам. В этом релизе мы представляем новое свойство структуры ContactPoint, позволяющее получать импульсы для каждой точки контакта.

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

  • Пакетные физические запросы были результатом Unity hackweek и поставлялись напрямую, чтобы поддержать определенные варианты использования, но с минимальной функциональностью. Они продолжают развиваться, с новыми функциями, позволяющими реализовать еще больше юзкейсов, например, с более сложными шаблонами потоков, а типы запросов становятся более разнообразными. В этом релизе разрешено выполнение пакетных запросов для любой физической сцены и добавлен один новый тип пакетного запроса (Physics.ClosestPointCommand). 

  • Чтобы меш можно было использовать с MeshCollider, его нужно сначала запечь. Запекание — это дорогостоящий процесс создания структур пространственного поиска, необходимых для обнаружения коллизий. Обычно это происходит неявно каждый раз, когда изменяется свойство меша в MeshCollider, и выполняется в основном потоке, блокируя любую дальнейшую работу до завершения. В Unity 2019.3 мы предоставили потокобезопасный метод для выполнения запекания не в основном потоке по желанию. Замысел состоял в том, чтобы позволить более сложные процедурно генерируемые меши, поскольку теперь можно было генерировать контент и запекать меши, благодаря намного лучшему использованию потоков. Однако одним из главных недостатков этой функции являлось то, что она поддерживала запекание только с дефолтными параметрами. В этом релизе мы исправили это, предоставив новый вариант Physics.BakeMesh, который поддерживает запекание с любыми параметрами.

Нам не терпится увидеть созданные вами работы с помощью новых API Inverse Dynamics и обновленного Physics Debugger. Загрузите последний билд Unity 2022.1 сегодня и присоединяйтесь к обсуждению на форуме робототехники и превью физики


Перевод материала подготовлен в преддверии старта курса "Unity Game Developer. Basic"