This page has been translated automatically.
Видеоуроки
Интерфейс
Основы
Продвинутый уровень
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Профессиональный уровень (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Режимы вывода изображения
Физика
Браузер SDK 2
Лицензирование и типы лицензий
Дополнения (Add-Ons)
Демонстрационные проекты
API Samples
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Контроль версий
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Player-ноды
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
Унифицированный язык шейдеров UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Материалы и шейдеры
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
Animations-Related Classes
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
VR-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Учебные материалы
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

Физика

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

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

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

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

Примечание
Не рекомендуется использовать реальные значения массы, плотности, силы тяжести и т. д. Для обеспечения реалистичного поведения значения следует подбирать экспериментально.

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

Дополнительная информация#

Сценарии использования и ограничения встроенной физики#

Физический модуль UNIGINE весьма ограничен; однако в ряде случаев это упрощает работу программистов и дизайнеров. Вот список случаев, когда лучше использовать встроенную физику, а не заранее заданные через код условия или скелетную анимацию:

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

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

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

Посмотрите отрывок из нашего видеоурока по физике, иллюстрирующий эту главу.

Альтернативы встроенной физике#

Когда задачу невозможно решить с помощью встроенного физического модуля или это занимает слишком много времени, можно использовать ряд других подходов: скелетная анимация, жесткое программирование или использование внешнего физического движка.

Скелетная анимация#

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

Скелетная анимация — это техника, в которой анимированный объект представлен двумя компонентами:

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

Меш и скелет

Меш и скелет

Этот прием позволяет сделать процесс анимации более удобным. Каждая кость рига связана с некоторой частью меша объекта. Скиннинг — это процесс создания этой связи. Изменение трансформаций костей изменяет меш.

Есть два способа использования скелетной анимации:

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

Меши и анимацию можно создавать с помощью стороннего графического программного обеспечения (3ds Max, Maya и т. д.), затем импортировать в UNIGINE в собственном формате (.mesh и .anim) и использовать в мире.

  • Первый вариант использования — создание сложного механизма с большим количеством различных сочленений, работающих в заводском цеху для создания фона. Моделирование этого механизма с помощью физики значительно снизит производительность. Вместо этого вы можете использовать запеченную скелетную анимацию.
  • Второй вариант использования определяется тем фактом, что кости нельзя повредить физически. Представьте, что у нас есть антенна, которая представлена ​​единственным мешем, содержащим несколько костей, прикрепленным к транспортному средству. Чтобы заставить его двигаться реалистично, мы должны написать скрипт (на C++ или C#), вычисляющий необходимые преобразования костей и обеспечивающий желаемое поведение антенны.

Программное моделирование физики#

Другой способ заменить моделирование физики с достижением реалистичного результата без падения производительности — это программное моделирование, которое включает в себя написание кода для программного изменения преобразований объектов и их поведения.

  • Первый вариант использования — моделирование деформации объекта в результате неупругого столкновения. Встроенная физика не реализует моделирование неупругих столкновений. Однако мы можем обнаружить столкновение и затем изменить меш деформированного объекта через скрипт (в UnigineScript, C ++ или C #), обеспечивая желаемую деформацию.

    Примечание
    Деформация (т.е. изменение положения вершин меша) доступна только для динамических мешей!
  • Второй вариант использования — это большое количество взаимодействующих элементов, например танковые гусеницы и подвеска. Если у нас много танков, расчет физики уронит FPS. Более того, из-за ошибок аппроксимации весь механизм может разорваться или выглядеть неестественно. Мы пишем скрипт, который рассчитывает движение пластин подвески и гусеницы, обеспечивая устойчивость и желаемую степень реализма.

Использование решений на основе кода позволяет поддерживать приемлемый FPS и настраивать поведение объектов.

Сторонние решения для моделирования физики#

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

Комбинированный подход#

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

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

Физическое взаимодействие объектов. Основные сущности#

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

Отношения между сущностями

Отношения между сущностями

Тело (Body)#

Для взаимодействия с другими объектами, а также с внешними физическими силами объект должен иметь тело. Тело можно рассматривать как физическую аппроксимацию объекта, оно описывает его поведение и представляет собой набор его динамических параметров, таких как масса, скорость и т. д. Существует несколько типов тел: dummy, rigid, ragdoll, fracture, rope, cloth, water, path. Каждый тип тела используется для моделирования определенного типа объекта.

Сцена с несколькими типами тел

Сцена с несколькими типами тел: вода, тряпичная кукла, твердое тело

Параметры массы тела можно настроить вручную или определить автоматически с помощью параметров формы. Это удобно, когда тело имеет несколько форм.

Масса и плотность тела используются для моделирования плавучести в соответствии с принципом Архимеда.

Форма (Shape)#

В то время как тело определяет поведение объекта, форма представляет собой объем пространства, занимаемого физическим телом. Эта форма невидима и не обязательно должна совпадать с мешем объекта. На самом деле грубое приближение (sphere, capsule, cylinder, box, convex hull) часто более эффективно и неотличимо от детального. Физическое тело имеет одну или несколько коллизионных форм, позволяющих объектам сталкиваться друг с другом.

Аппроксимация автомобиля с использованием одной и нескольких форм

Аппроксимация автомобиля с использованием одной и нескольких форм

Примечание
Максимальное количество коллизионных форм для одного тела - 32768.

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

Сочленение (Joint)#

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

Сочленение, соединяющее два твердых тела

Сочленение, соединяющее два твердых тела

Сочленение соединяет два твердых тела и представляет определенные ограничения, то есть ограничивает движение соединяемых тел относительно друг друга. Когда сила, приложенная к сочленению, слишком велика, сочленение ломается. Реализация разрушаемых сочленений включает пределы линейного и углового движения, поэтому, если сила превышает эти пределы, сочленение разрушается. Есть несколько типов сочленений: fixed, hinge, ball, prismatic, cylindrical, suspension, wheel, path.

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

Таким образом, при создании модели автомобиля не устанавливайте массу кузова 2000 кг, а колес — 10 кг, возможно, лучше использовать 5 кг для кузова и по 1 кг для каждого колеса, чтобы обеспечить реалистичное поведение.

Обнаружение столкновений и пересечений#

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

В UNIGINE реализовано два типа обнаружения столкновений:

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

    Примечание
    Непрерывное обнаружение коллизий доступно только для форм сфера и капсула.

Дискретное и непрерывное обнаружение коллизий

Дискретное (a) и непрерывное (b) обнаружение коллизий

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

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

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

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

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

Примечание
Масштабирование мешей, участвующих в обнаружении коллизий, не поддерживается.

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

Пересечение луча с кубом

Пересечение луча с кубом

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

Моделирование физики#

Моделирование физики выполняется в циклической последовательности следующих этапов для каждого кадра:

Цикл моделирования физики

Цикл моделирования физики

Физика в UNIGINE моделируется в многопоточном режиме, когда некоторые операции выполняются параллельно.

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

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

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

    Застывшие синие и незастывшие красные кубики: импульс, приложенный к пирамиде из кубиков, разморозит их все, кроме одного
  • Если взаимодействующие объекты находятся далеко от зрителя, они не вносят заметного вклада в изображение в целом, поэтому ими можно пренебречь. Параметр Расстояние моделирования определяет на каком расстоянии от зрителя физические взаимодействия больше не рассчитываются.

Глобальные настройки физики#

Глобальные настройки физики (FPS, гравитация, расстояние моделирования, стоп-кадры и скорости, коэффициент проникновения, погрешность проникновения) доступны через панель Physics settings в редакторе.

Последнее обновление: 16.08.2024
Build: ()