Fracture Body
Тело Fracture обеспечивает убедительное разрушение объектов в реальном времени. Когда происходит столкновение с телом, разрушаемый объект процедурно разбивается на куски, которые, в свою очередь, также можно разбивать до тех пор, пока не будет достигнут желаемый уровень разрушения. Тело Fracture относится к недорогому типу и может быть разбито на умеренно большое количество частей.
Дополнительная информация#
- Класс BodyFracture
- Фрагмент видеоурока по физике, демонстрирующий процедурное разрушение тел Fracture
Физическая аппроксимация#
Тело Fracture (а также все части, на которые он распадается) на самом деле является телом Rigid, которое движется в соответствии с динамикой твердого тела. Следовательно, оно обладает следующими свойствами:
- масса;
- плотность;
- линейное и угловое демпфирование;
- максимальные линейная и угловая скорость;
- трение;
- восстановление;
- застывание.
После того, как тело было разрушено, его масса распределяется между частями, и они падают вниз, как твердые тела.
Ошибка аппроксимации формы#
Тело Fracture всегда аппроксимируется выпуклым многогранником, который может содержать слишком много деталей для коллизионной геометрии. Как правило, в этом нет необходимости, потому что использование высокодетализированной формы не обеспечивает заметной визуальной разницы, но существенно влияет на производительность. Настройка Approximation Error (ошибка аппроксимации) позволяет контролировать количество вершин в результирующей коллизионной форме:
- При значении 0 форма точно дублирует меш, охватывая весь его объем.
- Чем выше значение, тем меньше вершин в созданной форме, но пропускается больше деталей, и форма может не охватить весь объем меша. Максимальное значение — 1.
Разрушение#
Существует три модели разрушения:
Эти модели определяют пути разрушения, которые имеют отношение к различным механическим свойствам материалов (например, их вязкости и пористости). Шаблоны разрушений доступны для выбора на уровне скрипта.
Разрез#
Разрез — это способ разрушения, разделяющий объем меша на две части плоскостью. Плоскость проходит через заданную точку тела. Угол разреза определяется заданной нормалью.
Чтобы разрезать тело Fracture, используйте метод createSlicePieces().
Растрескивание#
Растрескивание — это способ разрушения, при котором образуются радиальные трещины от точки столкновения. Все части трещин немного различаются по размеру для обеспечения визуального реализма. Кроме того, меш можно дополнительно разломать по концентрическим кольцам, имитируя распространение импульса. Чем тоньше и хрупче материал (например, стекло), тем больше колец образуется в результате разрушения. Указанное расстояние между кольцами также варьируется случайным образом, чтобы обеспечить убедительный результат.
Чтобы создать трещины на теле Fracture, используйте метод createCrackPieces().
Разрушение на осколки#
Разрушение на осколки — это способ разрушения, при котором объем меша случайным образом распадается на заданное количество выпуклых частей.
Чтобы разбить тело Fracture, используйте метод createShatterPieces().
Пороговое значение объема#
После разрушения тела, особенно несколько раз, маленькие кусочки могут начать снижать производительность. Значение Volume Threshold (пороговое значение объема) определяет минимальный объем фрагментов и, таким образом, контролирует интенсивность раскалывания. Все фрагменты, которые меньше указанного значения, не будут генерироваться.
- При минимальном значении 0 моделируются все фрагменты, созданные в результате разрушения вплоть до самого маленького.
- При более высоких значениях генерируются только достаточно большие фрагменты. Если ни одна из частей не имеет достаточного объема, тело остается целым.
Сломанное тело#
После того, как тело было сломано, для него включается флаг Broken. Снятие этого флага возвращает сломанный меш в неразрушенное состояние. Сломанное тело остается представленным в виде одной ноды в Иерархии UnigineEditor. Сгенерированные части с трещинами автоматически представляются как тела Fracture и наследуют физические параметры тела Fracture (например, демпфирование линейной и угловой скоростей, трение, восстановление и маски).
Материал поверхности разрушения#
При разрушении меша необходимо указать материал, который будет применяться ко всем вновь созданным поверхностям расколотого тела. Те грани фрагментов, которые были внешними, сохраняют исходный материал.
Свойство поверхности разрушения#
Также можно назначить новое свойство для всех поверхностей расколотого тела. Они определяют игровое поведение и дополнительные физические свойства, однако параметры тела переопределяют их.
Физические пересечения#
Физические пересечения можно использовать как быстрый способ проверить, попал ли в разрушаемый объект снаряд. Вы можете использовать Physics Intersection Mask, чтобы включить выборочное обнаружение пересечения для тела (например, чтобы сделать его уязвимым для определенных снарядов). Физические пересечения обнаруживаются только для сопоставления битовых масок.
Советы по оптимизации производительности#
Хотя тело Fracture является относительно недорогим типом, в случае большого количества кусочков, на которые раскололся объект, влияние на производительность может стать значительным. Чтобы избежать падения производительности, воспользуйтесь следующими советами:
- Используйте параметр Volume Threshold для уменьшения количества фрагментов.
- Уберите осколки со сцены.
Пример на основе кода, иллюстрирующий, как удалить (заставить исчезнуть со временем) осколки со сцены, можно найти в разделе Physics примеров UnigineScript.
Назначение тела Fracture#
Чтобы присвоить объекту тело Fracture через UnigineEditor, выполните следующие действия:
- Откройте окно World Hierarchy.
- Выберите объект Mesh Dynamic, которому нужно присвоить тело Fracture.
-
Перейдите на вкладку Physics в окне Parameters и назначьте физическое тело выбранному объекту, выбрав Body -> Fracture.
- Задайте название тела и при необходимости настройте другие параметры.