This page has been translated automatically.
Видеоуроки
Interface
Essentials
Advanced
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Professional (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Players
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Materials and Shaders
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
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
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Сэмплы материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

Оптимизация физики

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

Общие настройки#

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

Примечание
Чтобы настроить параметры физики, откройте окно Settings, выбрав Window -> Settings в главном меню и выбрав раздел Runtime -> World -> Physics.

  • Укажите расстояние от камеры, от которого не рассчитываются физические взаимодействия. Если расстояние между камерой и физическим узлом превышает этот предел, узел «застывает» и его физические вычисления пропускаются до тех пор, пока узел не приблизится к камере.

    Имитация ткани останавливается, начиная с указанного расстояния от камеры

    Примечание
    Физические тела Cloth, Rope и Water также имеют свой собственный параметр Simulation Distance.
  • Использование параметра Iterations может повысить стабильность, но также может привести к увеличению нагрузки. Большое количество итераций может привести к заметным задержкам, так как очень трудоемкие вычисления автоматически пропускаются. Для простых сцен вполне достаточно одной итерации физики.
  • Настройте бюджет времени для симуляции физики.

Оптимизация обнаружения столкновений#

Фильтрация взаимодействий#

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

Если у вас есть несколько объектов, которые участвуют в физическом моделировании, разделите те, которые вряд ли будут взаимодействовать друг с другом, на разные «группы» с помощью механизма Bit Masking .

Ограничение столкновений#

Установите соответствующие маски Collision для тех конкретных коллизионных форм (shapes), поверхностей (surface) и тел (body), которые, как ожидается, будут сталкиваться. Если маски не совпадают, фигуры и тела просто игнорируют друг друга, проходя сквозь них.

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

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

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

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

Фильтрация физических эффектов#

Укажите определенные физические узлы , которые должны влиять только на соответствующие тела, используя Physical Masks так же, как и для столкновений. На изображении ниже объект Physical Wind влияет на флаг, но не на сферу.

Физический ветер действует на ткань, но не на сферу
Physical маска тканевого баннера
Physical маска сферы
Physical-маска объекта Physical Wind

Маска пересечения#

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

Хотя это только программный подход, он требует установки Intersection Masks для целей фильтрации.

И физические формы , и поверхности имеют маски пересечения.

Упрощение геометрии коллайдеров#

Как правило, большинство 3D-объектов должны быть представлены сложной и подробной видимой сеткой и невидимой упрощенной формой, используемой физическим движком для обнаружения столкновений ( коллайдер ).

Детализированная видимая сетка
Невидимое физическое представление с использованием упрощенных форм

Использование более простых фигур#

Физические формы , состоящие из простых примитивов, упрощают расчеты столкновений, сохраняя при этом высокую производительность и приемлемую точность. Поэтому рекомендуется аппроксимировать геометрию простыми примитивами ( Sphere , Capsule , Cylinder , Box ), которые работают быстрее и требуют меньше памяти.

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

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

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

Грубого приближения вполне достаточно

Использование более простой геометрии#

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

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

Используйте самый низкий уровень детализации для пересечений и столкновений

Аппроксимация форм столкновений с помощью примитивов также является хорошей практикой. Вы можете применить следующий подход:

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

  2. Добавьте в сцену цилиндрический объект, выбрав Create -> Primitive -> Cylinder в строке меню, и закройте исходную сетку примитивом.

  3. Убедитесь, что опция поверхности Collision включена для примитива.
  4. Скрыть визуальное представление поверхности примитива. Вы можете сделать это либо очистив его маски Viewport и Shadow, либо просто установив его параметр Max Visibility на отрицательную бесконечность (-inf) - это гарантирует, что поверхность не будет видна на любом расстоянии.

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

Подход к обнаружению столкновений#

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

В большинстве случаев дискретного обнаружения столкновений будет достаточно. Для этого выберите фигуру и снимите для нее флажок Continuous.

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

Оптимизация физических тел#

Застывание#

Рекомендуется включить Freezing для всех тел типа Rigid, Ragdoll и Fracture. Это позволяет сэкономить много вычислительных ресурсов, пропуская физические вычисления неподвижных объектов до тех пор, пока на них не воздействует какая-либо сила или объект.

Чтобы включить застывание, выполните следующие действия:

  1. Включите флаг Freezable для всех типов физических тел, перечисленных выше.
  2. Установите соответствующие значенияFrozen Linear Velocityа такжеFrozen Angular Velocityпараметры для каждого физического тела или настройте глобальные параметры . Эти глобальные пороговые значения застывания сравниваются с порогами, установленными для каждого тела, и выбирается максимальное значение для застывания тела.

  3. Отрегулируйте количество Frozen Frames. Чем ниже значение, тем быстрее объекты застывают.

Разрушаемые тела#

Не смотря на то, что разрушаемое тело (fracture) является относительно недорогим в плане вычислений, в случае большого количества обломков его влияние на производительность может стать значительным. Чтобы избежать падения производительности, можно воспользоваться следующими советами:

  • Используйте параметр Volume Threshold, чтобы уменьшить количество обломков.
  • Уберите обломки сломанного тела со сцены.

Пример на основе кода, иллюстрирующий, как удалить (со временем исчезнуть) фрагменты трещин со сцены, можно найти в разделе Physics примеров UnigineScript .

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