Создание воды

Xtreme3D

Урок 16
Создание воды

Уровень: средний
Версия Xtreme3D: 3.0.x
Автор урока: Gecko

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

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

Код создания воды выглядит следующим образом:

water = WaterCreate(global.scene);
WaterSetResolution(water, 128);
WaterSetRainTimeInterval(water, 1000);
WaterSetRainForce(water, 1000);
WaterSetViscosity(water, 0.95);
WaterSetElastic(water, 10);
ObjectSetPosition(water, 0, 2.5, 0);
ObjectSetScale(water, 1000, 1000, 1000);

Объект Water имеет несколько важных свойств:

Resolution (разрешение)
Число полигонов по стороне сетки. Геометрия воды строится из квадратов в сетке, поэтому общее число полигонов равно R2, где R - значение Resolution. Ясно, что, чем выше это значение, тем выше качество воды, и, соответственно, ниже скорость ее работы. Значение по умолчанию: 64.

Rain time interval (временной интервал дождя)
Эффект "дождя", когда поверхность анимируется, создавая в случайных местах сетки волновые возмущения. Данная опция задает длину паузы в миллисекундах между двумя возмущениями. Значение по умолчанию: 500. Максимальное значение: 1000000. Минимальное значение: 0 (нет дождя).

Rain Force (сила дождя)
Интенсивность возмущений; чем меньше это значение, тем быстрее волны "затухают". Значение по умолчанию: 5000. Максимальное значение: 1000000. Минимальное значение: 0.

Viscosity (вязкость)
Амплитуда возмущений; фактически, максимальная высота волн: чем меньше это значение, тем гелеобразнее жидкость. Значение по умолчанию: 0.99. Максимальное значение: 1. Минимальное значение: 0.

Elastic (эластичность)
Скорость распространения возмущений. В реальном мире это свойство зависит от плотности вещества (например, у ртути плотность гораздо выше, чем у воды, поэтому волны распространяются быстрее). Значение по умолчанию: 10.

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

MaterialCreate('mMask', 'watermask.bmp');
WaterSetMask(water, 'mMask');