Water Body
Water body позволяет имитировать физическое поведение жидкостей различной плотности и вязкости. Оно также моделирует соответствующую выталкивающую силу для погруженных в воду объектов и динамику волн при расчете двустороннего взаимодействия. Симуляция воды хорошо выглядит и достаточно быстро работает, поэтому ее можно использовать в игровой среде; однако, если меш большой и плотный, использование воды может быть затратным.
Water body можно присвоить следующим типам объектов:
- Объект Water Mesh
- Объект Dynamic Mesh
Дополнительная информация#
- Статья о Water Mesh
- BodyWater класс
- Фрагмент видеоурока по физике, демонстрирующий использование тела Water для моделирования различных типов жидкостей
Требования к мешу#
Меш, на который назначается тело Water, должен соответствовать требованиям, приведенным здесь. Требования к мешу одинаковы как для Dynamic Mesh, так и для Water Mesh.
Имитационная модель решетки#
Water body моделируется как двумерная решетка с точечными частицами, расположенными в вершинах меша. Движение частицы ограничено двумя направлениями: ее можно поднять вверх или потянуть вниз. В случае изменения своего положения частица приобретает скорость, которая влияет на соседние частицы и, таким образом, описывает решетку тела Water на каждом временном шаге физики. Таким образом, волны генерируются, когда физические тела вступают в контакт с водой или частице напрямую задается новая скорость.
Вязкость#
Параметр Liquidity (вязкость) определяет вязкость воды (или любой другой жидкости): он определяет, насколько легко вода разбрызгивается, и влияет на формирование волн. Он умножает скорость, с которой частицы воды передают векторы скорости соседним частицам.
- Чем выше значение, тем более вязкая вода и тем меньше волны, поднимаемые объектами (например, сироп).
-
Низкие значения обеспечивают более высокие поверхностные волны (например, водопроводная вода).
Будьте осторожны, не устанавливайте слишком высокие или слишком низкие значения, потому что это может привести к нестабильному поведению воды. Чтобы восстановить стабильность, попробуйте настроить параметр Interaction.
Плотность#
Параметр Density (плотность) воды определяет плавучесть объектов по закону Архимеда. Исходя из объема погруженной части формы и ее массы, сила плавучести прилагается к ее центру массы и толкает объект вверх, при этом средняя нормаль решетки покрывается точками погруженной формы.
- При минимальном значении 0 объекты не будут плавать в воде, а скорее будут проваливаться сквозь нее без какого-либо сопротивления.
- Более высокие значения увеличивают выталкивающую силу. При слишком высоком значении погруженные объекты начинают выталкиваться в воздух.
Физическое поведение объектов в воде#
Двустороннее динамическое взаимодействие обеспечивает как физически, так и визуально убедительное моделирование волн от физических тел, когда они возмущают жидкость. Представьте движущуюся лодку, которая образует за собой кильватерную волну, или персонажа, создающего рябь при движении в воде (см. изображение выше).
Взаимодействие с объектами#
Физический объект, погруженный в воду (или любую другую жидкость), имеет собственный вектор скорости. С другой стороны, все частицы воды, которые покрыты этим физическим телом или окружают его, имеют свой собственный интегрированный вектор скорости, который приблизительно соответствует состоянию воды. Значение Interaction — это коэффициент, определяющий, насколько скорость объекта влияет на скорости частиц воды и, таким образом, генерирует волны.
- При минимальном значении 0 объект не вызывает возмущений на поверхности воды.
-
Более высокие значения делают возмущение водной поверхности более интенсивным, а волны от движущихся объектов становятся сильнее.
Слишком высокие значения могут вызвать нестабильное поведение воды, поскольку закон сохранения энергии не ограничивает систему! Попробуйте уменьшить значения гашения колебаний для восстановления стабильности.
Линейное и угловое гашение колебаний#
Ожидается, что движение объектов, попадающих в воду, будет замедляться, поскольку сопротивление воды выше, чем сопротивление воздуха. Значения демпфирования работают наоборот по сравнению с коэффициентом Interaction:
Linear Damping определяет, насколько линейная скорость погруженного объекта уменьшается с течением времени под влиянием скоростей окружающих частиц воды. Точно так же Angular Damping определяет постепенное уменьшение поворота объекта. Как линейные, так и угловые демпфирующие силы накапливаются перед тем, как будут приложены к объекту.
- При минимальном значении 0 вода не препятствует движению объектов. В результате на воде нет волн.
-
Более высокие значения делают затухание линейных или угловых скоростей более интенсивным, и объекты замедляются быстрее, когда они попадают в воду. Волны от объектов в этом случае становятся более выраженными по мере увеличения энергии системы.
Вода может повести себя нестабильно, если значения будут очень высокими. Попробуйте уменьшить значение Interaction, чтобы восстановить стабильность.
Эмиссия частиц#
Возможно создание дополнительного визуального эффекта мелких капель, брызг или пузырьков на воде при падении в нее предметов. Чтобы включить этот эффект, выполните следующие действия:
- Создайте эффект Particle system, щелкнув Create -> Effect -> Particle system в главном меню UnigineEditor.
- Перейдите в окно Parameters.
- В разделе Dynamic выберите Spark Emitter для создания частиц, выбрав Emitter -> Spark.
- Сделайте систему частиц дочерним элементом объекта Water Mesh.
Частицы будут генерироваться только тогда, когда объект впервые коснется поверхности воды, в то время как уже погруженные тела будут плавать, не создавая их.
Границы водного пространства#
Следующие параметры, относящиеся к границам водного пространства, позволяют создавать резервуары разных типов в игровой среде. Эти параметры обеспечивают гибкость в настройке физического поведения воды для больших естественных озер и небольших бассейнов.
Глубина#
Depth (глубина) определяет размер волн: высокие волны образуются в глубоких водах (например, в море), тогда как на мелководье (например, в бассейне) возникает лишь небольшая рябь:
- При минимальном значении 0 объекты не образуют волн в воде.
- Более высокие значения приводят к более высоким волнам, создаваемым движущимися объектами.
Пересечение с землей#
Intersection (пересечение) воды с подстилающей поверхностью может потребоваться, например, для оценки фактической глубины водного бассейна. Чтобы включить пересечение с землей, выполните следующие действия:
- Сделайте объект Water Mesh или Dynamic Mesh дочерней нодой объекта Terrain или Static Mesh
- Включите флаг Intersection в окне Parameters → вкладка Physics → раздел Body.
Пересечение реализовано следующим образом: лучи трассируются вниз от поверхности Water Mesh до расстояния Depth. Если луч пересекает родительскую ноду, полученная глубина используется в расчетах; в противном случае используется заданное значение глубины.
Пересечение также прослеживается вверх, чтобы проверить, находится ли вода под землей и нет необходимости ее отображать.
Абсорбция#
Absorption (абсорбция) — это опция, которая создает эффект либо ограниченного бассейна, либо, наоборот, открытой водной поверхности, не имеющей обозначенных границ.
- Если опция Absorption включена, волны рассеиваются по периметру меша. В этом случае уровень воды по краям меша будет постепенно опускаться до нулевого уровня.
- Если опция отключена, имитируется обратный поток от стены: волна, достигая края воды, отражается и возвращается в обратном направлении.
Оптимизация симуляции#
Обновление в каждом кадре огромного количества объектов, расположенных далеко от камеры, которые трудно различимы или сливаются вдали в одно целое, является пустой тратой ресурсов.
Чтобы улучшить производительность и избежать чрезмерной нагрузки, имитация воды может обновляться с уменьшенной частотой кадров. Когда Water body находится за пределами области, указанной параметром Update Distance Limit, физические вычисления не выполняются, хотя объекты сохраняют свою плавучесть.
Приведенный ниже набор частот кадров позволяет указать, как часто симуляция воды должна обновляться, когда объект виден, когда видна только его тень или когда он не виден вообще.
Эта функция включена с настройками по умолчанию, обеспечивающими оптимальную производительность, и может быть настроена для каждого объекта в UnigineEditor или через API во время выполнения.
Назначение водного объекта#
Чтобы присвоить объекту тело Water через UnigineEditor, выполните следующие действия:
- Откройте окно World Hierarchy.
-
Выберите объект Water Mesh или Dynamic Mesh, которому нужно присвоить тело Water.
Убедитесь, что меш объекта соответствует требованиям! -
Перейдите на вкладку Physics в окне Parameters и назначьте физическое тело выбранному объекту, выбрав Body -> Water.
- Задайте название тела и при необходимости измените другие параметры.