Физика
В отличие от многих других движков, использующих сторонние решения, Unigine имеет собственный встроенный физический модуль.
Преимущества использования встроенного модуля физики:
- Эффективность использования памяти - используется один экземпляр мира (если используется внешнее решение, необходимо создать и сохранить еще одну копию мира).
- Производительность - исключены вызовы внешних функций, чрезмерное преобразование данных и передача между интегрированными системами.
Должно быть ясно, что это не высокоточная симуляция физики реального мира! Моделирование - это всего лишь приближение, основанное на упрощенных вычислениях и пониженной точности , обеспечивающее реалистичный вид в строгих пределах режима реального времени. Достижение реалистичного результата всегда требует компромисса между точностью и производительностью.
Хотя в целом Unigine использует упрощенную физику Ньютона с импульсным подходом, интеграция обнаружения столкновений , гравитации, трения , плавучести , суставы и внешние физические силы обеспечивают реалистичное моделирование физических тел и сложных взаимодействий между ними.
Смотрите также#
Сценарии использования и ограничения встроенной физики#
Физический модуль UNIGINE весьма ограничен; однако в ряде случаев это помогает программистам и дизайнерам упростить их работу. Вот список случаев, когда лучше использовать встроенную физику, а не жесткое кодирование или анимацию на основе костей:
- Обнаружение столкновений (предотвращение прохождения сквозь стены, взаимопроникновения твердых тел и т. д.)
- Моделирование идеально упругих столкновений (перераспределение кинетической энергии)
- Моделирование различных шарниров , двигателей и пружин
- Моделирование основных физических явлений: гравитация, трение (статическое и скользящее), плавучесть (для относительно спокойной воды без больших волн)
- Моделирование внешних сил ( ветер , силовое поле )
- Процедурное разрушение сеток
- Моделирование деформируемой ткани и веревок
- Тряпичная кукла симуляция
Следует понимать, что объем моделирования с использованием встроенной физики ограничен перечисленными выше случаями. Таким образом, существует большое количество случаев, которые не могут быть решены таким образом, в том числе следующие:
- Высокоточное физическое моделирование
- Моделирование динамики полета
- Моделирование динамики жидкости
- Моделирование гравитационных полей
- Моделирование неупругих столкновений
- Копание земли
- Физическое разрушение сложных объектов
Хотя некоторые задачи, связанные с большим количеством объектов, можно решить с помощью встроенной физики, это может значительно снизить производительность. В этом случае, как и в случаях, перечисленных выше, рекомендуется использовать альтернативные способы, описанные в следующей главе.
Посмотрите отрывок из нашего видеоурока по физике , иллюстрирующий эту главу.
Альтернативы встроенной физике#
Когда проблема не может быть решена с помощью встроенного физического модуля или занимает слишком много времени, можно использовать несколько других подходов: анимация на основе кости, жесткое кодирование или использование внешнего физического движка.
Костная анимация#
В некоторых случаях, когда поведение объекта невозможно реализовать с помощью моделирования физики или требуется слишком много вычислений, вместо этого можно использовать анимацию на основе костей.
Костная анимация - это техника, в которой анимированный объект представлен двумя компонентами:
- Представление поверхности, используемое для рисования объекта (называемое кожей или сеткой )
- Иерархический набор взаимосвязанных костей (называемых скелетом или ригом), используемый для анимации (позы и ключевого кадра) сетки.
Этот прием позволяет сделать процесс анимации более удобным. Каждая кость рига связана с некоторой частью меша объекта. Снятие шкур - это процесс создания этой ассоциации. При изменении преобразований костей изменяется сетка.
Есть два способа использования костной анимации:
- Анимация запеченных костей с использованием предварительно запеченных ключевых кадров, хранящихся в файле .anim
- Процедурная анимация костей с использованием класса ObjectMeshSkinned для изменения преобразований костей в реальном времени
Меши и анимацию можно создавать с помощью стороннего графического программного обеспечения (3ds Max, Maya и т. д.), затем импортировать в UNIGINE в собственном формате (.mesh и .anim) и использовать в мире.
- Первый вариант использования - создание сложного механизма с большим количеством различных узлов, работающих на фоне заводского цеха. Моделирование этого механизма с помощью физики значительно снизит производительность. Вместо этого вы можете использовать запеченную анимацию на основе кости.
- Второй вариант использования определяется тем фактом, что кости нельзя повредить физически. Представьте, что у нас есть антенна, которая представлена единственной сеткой , содержащей несколько костей, прикрепленной к транспортному средству. Чтобы заставить его двигаться реалистично, мы должны написать сценарий (на C ++ или C # ), вычисляющий необходимые преобразования костей и обеспечивающий желаемое поведение антенны.
Кодовый подход#
Другой способ заменить симуляцию физики с достижением реалистичного результата без падения производительности - это подход на основе кода, который включает в себя написание некоторого кода для программного изменения преобразований объектов и их поведения.
- Первый вариант использования - моделирование деформации объекта в результате неупругого столкновения. Встроенная физика не реализует моделирование неупругих столкновений. Однако мы можем обнаружить столкновение и затем изменить сетку деформированного объекта в скрипте (в UnigineScript , C ++ или C # ), обеспечивая желаемую деформацию .
Деформация (т.е. изменение положения вершин сетки) доступна только для динамических сеток !
- Второй вариант использования - это большое количество взаимодействующих элементов, например танковые гусеницы и подвеска. Если у нас много танков, расчет физики упадет FPS. Более того, из-за ошибок аппроксимации весь механизм может взорваться или выглядеть неестественно. Мы пишем скрипт, который рассчитывает движение пластин подвески и гусеницы, обеспечивая устойчивость и желаемую степень реализма.
Использование трюков на основе кода позволяет поддерживать приемлемый FPS и настраивать поведение объектов.
Механизмы внешней физики#
В случаях, когда требуется точное физическое моделирование (например, динамика полета, гидродинамика и т. д.), рекомендуется использовать специализированное стороннее решение, обеспечивающее необходимую функциональность. Unigine в настоящее время не предлагает решения для интеграции сторонней физики. Таким образом, все необходимые руководящие принципы для конкретного продукта о том, как интегрировать определенное стороннее решение в ваше приложение, должны быть получены от стороны, предлагающей это решение.
Комбинированный подход#
Очень часто наилучших результатов можно достичь, используя комбинацию различных методов или приемов. Таким образом, описанные выше подходы можно успешно комбинировать, чтобы обеспечить убедительный внешний вид и приемлемую производительность.
Вариант использования , иллюстрирующий успешное сочетание нескольких подходов, связан с моделированием физического разрушения сложных объектов, например рушатся мосты, взрываются здания и т. д. Реалистичное моделирование в этом случае невозможно в реальном времени. Однако его можно предварительно вычислить с помощью стороннего программного обеспечения для автономного моделирования физики, а затем преобразовать в запеченную анимацию на основе кости для использования в приложении реального времени.
Физическое взаимодействие объектов. Основные сущности#
В то время как большинство типов узлов в сцене служат вспомогательными средствами или украшениями, тип Object может иметь физические свойства и взаимодействовать с другими объектами и средой. Для назначения этих свойств объект должен иметь " body " (физическое приближение объекта), а тело должно иметь по крайней мере одну " shape " ( объем в пространстве, занимаемом телом). Для соединения тел и ограничения их движения относительно друг друга используются « суставы ». На рисунке ниже показаны отношения между этими объектами.
Тело#
Для взаимодействия с другими объектами, а также с внешними физическими силами объект должен иметь тело. Тело можно рассматривать как физическое приближение объекта, оно описывает его поведение и представляет собой набор его динамических параметров, таких как масса, скорость и т.д. Существует несколько типов тел: dummy, rigid, ragdoll, fracture, rope, cloth, water, path. Каждый тип тела используется для моделирования определенного типа объекта.
Массовые параметры тела можно настроить вручную или определить автоматически с помощью параметров формы. Это удобно, когда тело имеет несколько форм.
Масса и плотность тела используются для моделирования плавучести в соответствии с принципом Архимеда.
Форма#
В то время как тело определяет поведение объекта, форма представляет собой объем пространства, занимаемого физическим телом. Эта форма невидима и не обязательно должна совпадать с сеткой объекта. На самом деле грубое приближение (sphere, capsule, cylinder, box, convex hull) часто более эффективно и неотличимо. Физическое тело имеет одну или несколько форм столкновения, позволяющих объектам сталкиваться друг с другом.
Объекты с формой также падают под действием силы тяжести, отскакивают от статических поверхностей или скользят по ним. Скольжение и подпрыгивание определяются коэффициентами восстановления и трения, включенными в список параметров формы. Тело, которому не присвоена единственная форма, ведет себя как фиктивное тело , которое может быть соединено с другими телами с помощью суставов, но не сталкивается и невосприимчиво к гравитации.
Совместное#
В виртуальных мирах, как и в реальном мире, мы хотели бы иметь сложные объекты, состоящие из нескольких взаимосвязанных частей (например, манипулятор или автомобиль). Именно для этого и используются суставы.
Соединение соединяет два твердых тела и представляет определенные ограничения, то есть ограничивает движение связанных тел относительно друг друга. Когда сила, приложенная к суставу, слишком велика, сустав ломается. Реализация разрушаемых соединений включает пределы линейного и углового движения, поэтому, если сила превышает эти пределы, соединение разрушается. Есть несколько типов стыков: fixed, hinge, ball, prismatic, cylindrical, suspension, wheel, path.
При использовании шарниров очень важно соблюдать баланс масс - избегать соединения слишком тяжелых тел с легкими, иначе система может стать нестабильной. Как упоминалось ранее, при физическом моделировании используются приблизительные расчеты, поэтому, если разница масс между двумя соединенными телами значительна, накопление ошибок и проблем с точностью приведет к нестабильности результата.
Таким образом, при создании модели автомобиля не устанавливайте массу кузова 2000 кг, а колес - 10 кг, возможно, лучше использовать 5 кг для кузова и по 1 кг для каждого колеса, чтобы обеспечить реалистичное поведение.
Обнаружение столкновений и пересечений#
Чтобы ограничить взаимопроникновение твердых тел, предотвратить перемещение сквозь стены и сделать вещи более естественными и привычными для глаз, используется обнаружение столкновений .
В Unigine реализовано два типа обнаружения столкновений:
- Дискретное обнаружение столкновений выполняется через определенные промежутки времени, и каждый кадр обрабатывается отдельно от других. В целом дискретизация улучшает производительность. Однако, когда частота кадров проекта уже низкая, небольшой быстро движущийся объект, скорее всего, телепортируется из одной точки в другую вместо того, чтобы плавно перемещаться туда, и столкновение не будет обнаружено.
- Непрерывное обнаружение столкновений не сталкивается с этой проблемой, поскольку движущееся тело выдавливается по своей траектории (между двумя соседними кадрами). Если что-то попадает в этот объем и обнаруживается столкновение, тело отправляется назад во времени, чтобы исправить реакцию на столкновение.
Обнаружение столкновений - очень дорогостоящая операция, и поскольку наша сцена может содержать сотни объектов, много усилий вкладывается в оптимизацию.
- Первый параметр, влияющий на стоимость, - сложность формы столкновения. Как правило, большинство трехмерных объектов представлено сложной и подробной видимой сеткой и невидимой упрощенной формой shape , используемой физическим движком для обнаружения столкновений. Доступные типы фигур перечислены выше .
Чтобы уменьшить вычислительную нагрузку, настоятельно рекомендуется по возможности использовать простые формы столкновения вместо сложных.
- Второй параметр - это количество проверок, которые необходимо выполнить - в худшем случае все будет против всех. Чтобы исключить ненужные проверки (например, два объекта вряд ли столкнутся, если они находятся далеко друг от друга), сцена должна быть разбита на секции.
За обнаружением столкновения следует важный шаг - реакция на столкновение или результат столкновения (например, два шара отскакивают друг от друга). Friction , restitution и другие параметры учитываются при расчете реакции на столкновение.
Если некоторые поверхности объекта участвуют в столкновениях, а другие - нет, обнаружение столкновений можно включить для каждой поверхности. Например, вы можете отключить обнаружение столкновений для приборной панели внутри кабины, так как она закрыта другими поверхностями.
Обнаружение пересечения лежит в основе обнаружения столкновений, но представляет собой частный случай пересечения лучей (ray casting), который служит немного другим целям. Вычисление пересечения луча, направленного из определенной точки в определенном направлении, и поверхности выполняется быстро и недорого, поэтому иногда его можно использовать вместо вычисления столкновения. Например, расчет столкновений колес с землей требует времени и снижает частоту кадров. В этом случае мы можем использовать пересечение лучей, падающих из днища автомобиля с землей, вместо точного обнаружения столкновений с использованием форм столкновения, что снижает вычислительные затраты и увеличивает производительность.
Чтобы сделать обнаружение столкновений и пересечений гибким и выборочным, а также снизить затраты на вычисления, используется механизм битового маскирования . Например, у нас есть объект, который не участвует во взаимодействии с другими, но мы хотим, чтобы он лежал на земле. Соответствие битовых масок столкновения этого объекта и земли (хотя бы один бит в масках должен совпадать) дает необходимый эффект. Один объект может участвовать в нескольких проверках столкновений и пересечений, поскольку для сопоставления пары объектов требуется только один бит в маске.
Моделирование физики#
Моделирование физики выполняется в циклической последовательности следующих этапов покадрово:
Физика в UNIGINE моделируется в многопоточном режиме , когда некоторые операции выполняются параллельно.
Физика моделируется со своим собственным фиксированным FPS , который не зависит от частоты кадров рендеринга: здесь нельзя использовать переменную FPS, потому что это делает результаты вычислений нестабильными.
Расчет физики для всех динамических объектов на сцене занимает слишком много времени. Чтобы обеспечить постоянную частоту кадров и исключить ненужные вычисления, используются некоторые подходы к оптимизации:
- Когда тело движется медленнее, чем указанная минимальная линейная или угловая скорость в течение определенного периода ( стоп-кадры ), предполагается, что оно останавливаться. Во время этого периода бездействия фактически нет необходимости моделировать его. Если это происходит, объект остается в состоянии покоя, пока на него не воздействует другой объект или сила. Следовательно, такой объект исключается из всех этапов моделирования, кроме обнаружения столкновений . Это состояние называется замораживанием и позволяет сэкономить много вычислительных ресурсов.
Замороженные синие и незамороженные красные коробки: импульс, приложенный к пирамиде коробок, разморозит все, кроме одного
- Если взаимодействующие объекты находятся далеко от зрителя, они не вносят заметного вклада в изображение в целом, поэтому ими можно пренебречь. Параметр Расстояние моделирования определяет расстояние от зрителя, когда физические взаимодействия больше не рассчитываются.
Глобальные настройки физики#
Глобальные настройки физики (FPS, гравитация, расстояние моделирования, стоп-кадры и скорости, коэффициент проникновения, допуск проникновения) доступны через панель Physics settings в Editor .