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

ANTHONY YAKOVLEV / UNITY TECHNOLOGIESContributor
May 12, 2022|6 Мин
Расширение набора инструментов для робототехники: Изменения в физике в Unity 2022.1
Эта веб-страница была переведена с помощью машинного перевода для вашего удобства. Мы не можем гарантировать точность или надежность переведенного контента. Если у вас есть вопросы о точности переведенного контента, обращайтесь к официальной английской версии веб-страницы.
3D-рендеринг вагона в пользовательском интерфейсе Unity
Расширение набора инструментов для робототехники: Изменения в физике в Unity 2022.1

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

Улучшения в отладчике физики

Отладчик физики - это важный инструмент для понимания внутренней работы физического движка, а также для понимания особенностей поведения, наблюдаемого в проекте. Хороший отладчик - важнейший инструмент для создания убедительной, современной, насыщенной физики. Исходя из этого, мы полностью переработали пользовательский интерфейс (UI) и добавили несколько интересных функций.

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

Меню пользовательского интерфейса Unity

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

Опции меню пользовательского интерфейса Unity

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

Пользовательский интерфейс Unity с красной рамкой и стрелками манипуляций, направленными вниз

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

Пользовательский интерфейс Unity с перемещением фигур
Обратная динамика

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

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

В частности, новыми функциями являются:

  • получить текущую силу, приложенную к телу приводом. Это показатель того, насколько сильно диск пытается достичь желаемой цели. Она зависит от жесткости и демпфирования привода, а также от текущего положения дельта-цели и скорости дельта-цели;
  • получить силы в суставах, необходимые для противодействия гравитационной, кориолисовой и центробежной силам, действующим на тело; и
  • получите совместную силу, необходимую для достижения желаемого ускорения.
Пользовательский интерфейс Unity, управляющий двумя персонажами
<p>Интерполяция и экстраполяция</p>

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

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

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

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

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

<p>Работа с отзывами на форумах</p>

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

  • Многие проекты, особенно крупные, часто используют множество слоев GameObject, поэтому матрица, описывающая комбинации слоев и создающая контактные пары для физики, тоже становится довольно большой. В этом выпуске мы выделили текущую выбранную строку и столбец, чтобы ими было удобнее пользоваться.
изображение выбранной сетки
  • Шарнир используется для соединения двух жестких тел и определяет ограничения на их относительное движение. Начиная с Unity 2020.2, шарнир также можно использовать для соединения Rigidbody с ArticulationBody. Чтобы сделать это возможным, каждый класс Joint получил дополнительное свойство, которое отображается в Инспекторе. Одновременная привязка к Rigidbody и ArticulationBody невозможна, поэтому отображение обоих вариантов, когда один из них уже задан, занимает вертикальное пространство без всякой причины. Теперь отображается только то свойство, которое было задано.
Выбор пунктов в строке меню
  • Кинематическое жесткое тело - это особый тип тела, которое может влиять на другие тела, не позволяя при этом ничему другому влиять на себя. В этом отношении он аналогичен статическому коллайдеру, за исключением того, что его предполагается часто перемещать. Типичные примеры использования - контроллеры персонажей, физика, управляемая анимацией, симуляция запястий в виртуальной реальности (VR) и так далее. Управление осуществляется путем задания кинематической цели, которую тело достигнет за один кадр моделирования. Основное отличие от статического коллайдера заключается в том, что кинематическая цель достигается не мгновенной телепортацией (сменой позы), а вычислением линейных и угловых скоростей, необходимых для достижения цели в одном кадре, и последующей передачей их решателю. Таким образом, движение может внести правильный вклад в матрицы якобиана ограничений, и, следовательно, любая присоединенная цепь суставов будет реагировать правильно (без глюков). В этом выпуске Unity мы открыли новый метод, позволяющий задать положение и вращение кинематической цели за одну операцию.
  • Модификация контактов, появившаяся в Unity 2021.2, позволяет изменять детали точек контакта, сгенерированные на узкой фазе, непосредственно перед тем, как они будут использованы для создания контактных ограничений решателя. В этом выпуске мы добавили новые геттеры для скоростей тел в контактной паре, для расширенных случаев использования, таких как этот пример пользовательского анизотропного трения.
  • Версия PhysX была обновлена до 4.1.2, последней в линейке 4.x на сегодняшний день. Это минорный релиз, поэтому в нем устранены только критические ошибки и сбои. Информация о выпуске доступна здесь.
  • Когда динамическое тело накладывается на коллайдер, решатель стремится найти корректирующий импульс, который раздвигает их, удовлетворяя всем ограничениям. Внутри системы этот импульс вычисляется для каждой точки контакта в паре, но у нас было только суммарное значение, которое возвращало общую сумму по всем точкам. В этом выпуске мы открываем новое свойство структуры ContactPoint, которое позволяет получать импульсы для каждой точки контакта.
  • Мы внимательно следим за отзывами о компоненте ArticulationBody, поступающими от сообщества робототехников. Чтобы облегчить создание и настройку поведения некоторых небольших частей робота, мы закрепили ручки ограничения суставов в пространстве экрана, чтобы они больше не загораживали коллайдеры в сцене.
увеличение масштаба объекта Unity
  • Пакетные запросы физики были результатом хакатона Unity и поставлялись непосредственно для реализации определенных сценариев использования, но с минимальной функциональностью. Они продолжают развиваться, обрастая новыми функциональными возможностями, позволяющими использовать еще большее количество приложений, например, с более сложными шаблонами потоков, а типы запросов становятся все более разнообразными. В этом выпуске мы позволяем запускать пакетные запросы на любой физической сцене и добавляем один новый тип пакетного запроса(Physics.ClosestPointCommand).
  • Чтобы сетку можно было использовать в MeshCollider, ее нужно сначала запечь. Запекание - это дорогостоящий процесс создания пространственных поисковых структур, необходимых для обнаружения столкновений. Обычно это происходит неявно при каждом изменении свойства сетки MeshCollider, и выполняется в главном потоке, блокируя дальнейшую работу до завершения. В Unity 2019.3 мы открыли потокобезопасный метод для выполнения запекания вне основного потока по требованию. Цель заключалась в том, чтобы сделать возможным создание более сложных процедурно генерируемых сеток, поскольку теперь можно было джойсифицировать генерацию содержимого и запекание сетки, что позволило бы получить гораздо более высокую загрузку потоков. Однако особым недостатком этой функции было то, что она поддерживала только выпечку с параметрами приготовления по умолчанию. В этом выпуске мы исправили это, открыв новый вариант Physics.BakeMesh, который поддерживает запекание с любыми параметрами приготовления.

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