Первые шаги в Maya. Урок 24. Работа с модулем Fluid Effects
Волнующаяся океанская гладь с плывущей лодкой
Для придания реалистичности моделируемым сценам с учетом динамических воздействий в Maya предусмотрена возможность внедрения в них самых разных типов динамических объектов: частиц (Particles), твердых и мягких тел (Bodies), тканей (Cloth), волос (Hair), жидких и газообразных структур (Fluids) и т.д. С большей частью названных типов объектов мы уже сталкивались, а этот урок посвящен флюидам, которые позволяют моделировать разнообразные атмосферные (облака, туман, пар и дым) и пиротехнические (огонь, взрывы, включая ядерные) эффекты, а также создавать вязкие структуры (грязь, лаву и пр.) и реалистичные водные поверхности (включая спокойную водную гладь и волнующийся океан).
Теоретические аспекты
Флюиды (Fluids) представляют собой объемные частицы, умеющие проявлять свойства поверхностей. Они управляются с учетом законов гидрогазодинамики, подвержены воздействию разнообразных физических сил, в частности гравитации, турбулентности и ветра, под действием которых траектория флюидов будет изменяться. Кроме того, флюиды (как и обычные частицы) могут сталкиваться с поверхностями объектов сцены (например, с твердыми и мягкими телами и обычными частицами) и взаимодействовать с ними. Работа с флюидами реализуется через специальный модуль Maya Fluid Effects, позволяющий создавать объемные частицы и управлять их плотностью, прозрачностью, особенностями распространения и т.д. Проводимые для этого расчеты достаточно длительны, а затраты системных ресурсов существенны.
Флюиды могут использоваться для создания динамических, нединамических и океанских fluid-эффектов. Динамические fluid-эффекты моделируются с учетом законов гидрогазодинамики как при формировании fluid-поверхности, так и при ее изменении в ходе анимации. При создании нединамических fluid-эффектов законы гидрогазодинамики учитываются лишь при формировании поверхности на базе флюидов, а динамическое изменение поверхности реализуется по методу ключевых кадров. Данный подход нередко практикуется для снижения нагрузки на системные ресурсы и более быстрого достижения результатов и, как правило, вполне подходит для создания облаков, тумана, космического пространства и т.п. Принцип формирования водных fluid-эффектов совершенно иной — для создания реалистического движения волн на больших поверхностях воды здесь используются шейдеры.
За работу с флюидами отвечает меню FluidEffects (Fluid-эффекты; рис. 1), которое доступно лишь в режиме Dynamics (Динамика), активируемом при нажатии клавиши F4. В этом меню находятся команды, применяемые для создания fluid-частиц, а также для выполнения некоторых операций с ними. В поставку программы включены примеры файлов с уже готовыми системами динамических, нединамических и океанских флюидов. Ознакомиться с примерами можно, открыв окно Visor (команда FluidEffects=>GetFluidExample — Fluid-эффекты=>Загрузить Fluid-примеры либо FluidEffects=>GetOcean/PondExample — Fluid-эффекты=>Загрузить примеры океанов/водоемов; рис. 2) и загрузив интересующий файл с помощью команды ImportMayaFile, вызванной из контекстного меню. Обратите внимание, что в разделе Notes редактора атрибутов нередко отображаются ключевые моменты получения рассматриваемых в примерах fluid-эффектов. Данные системы флюидов можно редактировать, а значит, на их базе можно создавать собственные эффекты.
Рис. 1. Меню FluidEffects
Рис. 2. Окно Visor с активированной вкладкой FluidExample
Создавать динамические и нединамические fluid-эффекты можно двумя способами. Первый из них заключается в том, чтобы вначале внедрить в сцену 2D- либо 3D-контейнер, вызвав из меню FluidEffects команду Create2DContainer (Создать 2D-контейнер) или Create3DContainer (Создать 3D-контейнер) соответственно, и только потом добавить к контейнеру эмиттер с помощью команд Add/EditContents=>Emitter (Добавить/редактировать контент=>Эмиттер) или Add/EditContents=>EmitFromObject (Добавить/редактировать контент=>Эмиттер из объекта), также вызываемых из меню FluidEffects. Первая команда просто создает эмиттер, а вторая применяется в том случае, когда в роли эмиттера должен выступить некоторый имеющийся на сцене объект. В качестве такого объекта может быть указан любой полигональный объект либо NURBS-поверхность, расположенные в контейнере, — теоретически объект может находиться и вне контейнера (программа не выдаст ошибку), но тогда испускаемые им флюиды отображаться не будут, поскольку область их распространения ограничена пределами контейнера.
С таким же успехом контейнер может быть создан сразу со встроенным эмиттером — для этого достаточно вызвать из меню FluidEffect команду Create2DContainerwithEmitter (Создать 2D-контейнер с эмиттером) либо FluidEffect=>Create3DContainerwithEmitter (Создать 3D-контейнер с эмиттером). Эмиттер определяет точку либо площадь, из которой станут появляться флюиды, задает направление их распространения и непосредственно генерирует флюиды. Он же позволяет управлять видом флюидов путем добавления и регулирования таких характерных для fluid-частиц свойств, как Density (Плотность), Temperature (Температура), Fuel (Топливо) и Color (Цвет). Контейнер задает пространство, которое могут заполнять флюиды, и позволяет управлять областью их распространения. Все вышесказанное справедливо лишь для динамических и нединамических fluid-эффектов, поскольку океанские fluid-эффекты не требуют создания контейнеров и внедрения в них эмиттеров.
Контейнеры бывают двух типов: плоские и пространственные (рис. 3). Различие между ними заключается лишь в том, что первые ограничивают область распространения флюидов плоскостью, а вторые — некоторой областью пространства. Fluid-контейнеры представляют собой трехмерные сетки, каждую единицу которых называют вокселем1 (voxel). 2D-контейнеры имеют глубину в один воксель, глубина 3D-контейнеров составляет два и более вокселей (рис. 4). Количество вокселей в контейнерах регулируется: при увеличении их числа качество получаемого fluid-изображения повышается, но одновременно увеличиваются и временные затраты на проведение расчетов. Флюиды на базе 3D-контейнеров очень требовательны к системным ресурсам, а их обработка занимает много времени. Для флюидов, распространяемых внутри 2D-контейнеров, необходимо меньше памяти и генерируются они гораздо быстрее. В достаточно большом числе случаев плоские системы флюидов вполне способы заменить пространственные системы, которые без существенной на то необходимости использовать не стоит.
Рис. 3. Пример 2D- (слева) и 3D-контейнеров с эмиттерами (эмиттеры выделены зеленым цветом)
Рис. 4. Структура 2D- (слева) и 3D-контейнеров с позиции их глубины
Параметры эмиттера и формируемой им системы флюидов устанавливаются сразу при их создании (для этого следует щелкать на квадратиках, расположенных справа от соответствующих команд) либо корректируются позднее в окне каналов или в редакторе атрибутов. В зависимости от того, какие параметры требуется изменить, следует выделять либо эмиттер, либо систему частиц.
Базовые настройки эмиттера
Основные параметры эмиттера сконцентрированы в свитках BasicEmitterAttributes и FluidAttributes (рис. 5):
- EmitterType — позволяет установить тип эмиттера;
- Density/Voxel/Sec — определяет среднее значение эмиссии плотности для одного вокселя в секунду;
- Heat/Voxel/Sec — устанавливает среднее значение эмиссии температуры для одного вокселя в секунду;
- Fuel/Voxel/Sec — задает среднее значение эмиссии топлива для одного вокселя в секунду;
- FluidDropoff — определяет уровень снижения эмиссии флюидов по мере удаления от источника.
Рис. 5. Базовые параметры эмиттера флюидов
При работе с флюидами могут быть задействованы следующие типы эмиттеров (рис. 6):
- Omni (Всенаправленный) — формирует флюиды, которые распространяются из одной точки во всех направлениях;
- Surface (Поверхностный) — позволяет испускать флюиды одной из поверхностей объекта сцены, который может представлять собой полигональный объект либо объект, созданный на базе NURBS-кривых;
- Curve (Криволинейный) — обеспечивает распространение флюидов NURBS-кривой;
- Volume (Объемный) — формирует флюиды, которые возникают в некоторой точке фиксированного объема (куба, сферы, цилиндра, конуса или тора) и распространяются во всех направлениях.
Рис. 6. Типы fluid-эмиттеров
Базовые настройки контейнера
Основные параметры контейнера расположены в свитках ContainerProperties, ContentsMethod, DynamicSimulation и Shading. Свиток ContainerProperties (рис. 7) позволяет регулировать следующие параметры:
- X/Y/ZResolution — устанавливает количество вокселей в контейнере, от числа которых напрямую зависит качество получаемого fluid-изображения;
- X/Y/ZSize — регулирует размер контейнера (рекомендуется, чтобы параметры X/Y/ZResolution и X/Y/ZSize были пропорциональны, то есть при размере 10x5x2 следует задать разрешение 40x20x8);
- BoundaryX/Y/Z — задает направление эмиссии флюидов.
Рис. 7. Свиток ContainerProperties
В свитке ContentsMethod (рис. 8) устанавливаются методы формирования параметров Density, Velocity, Temperature, Fuel и Color:
- Density (Плотность) — задает плотность флюидов, при этом более высокая плотность делает объект менее прозрачным;
- Velocity (Скорость) — определяет поведение флюидов и тесно связан с воздействием силовых полей. Данный параметр используется только для динамических флюидов;
- Temperature (Температура) — «нагревает» флюиды, заставляя их активнее двигаться и повышая уровень самосвечения флюидов (то есть становится заметнее воздействие параметра Incandescence);
- Fuel (Топливо) — в сочетании с параметрами Density и Temperature позволяет имитировать происходящие с флюидами пиротехнические реакции типа возгорания и взрыва, например повышение значения параметра Temperature в совокупности с высокой плотностью флюидов (Density) может привести к возгоранию топлива, что повлечет за собой эффект взрыва. По мере горения топлива (то есть в процессе реакции) значения Density и Fuel уменьшаются (топливо как бы сгорает), что автоматически приводит к постепенному затуханию процесса. Данный параметр используется только для динамических флюидов;
- Color (Цвет) — устанавливает цвет флюидов, который сильнее проявляется в тех областях, где плотность флюидов значительна, а в областях с близкой к нулю плотностью не проявляется никак.
От выбора метода в свитке ContentsMethod зависит то, каким именно образом будут устанавливаться значения вышеназванных параметров. Формирование первых трех параметров может осуществляться с применением предустановленных градиентов (Gradient), статистических (StaticGrids) либо динамических сеток (DynamicGrid). Для Fuel допускается использование только градиентов и динамических сеток, а для Color допустимы варианты UseShadingColor, StaticGrids и DynamicGrid. В случае применения градиентов значения параметров в разных вокселях будут неодинаковыми, причем устанавливаться они будут автоматически на базе градиентных текстур. В отличие от градиентов, статические и динамические сетки обеспечивают точный контроль над значениями параметров в каждом из вокселей контейнера, поскольку значения параметров в разных вокселях могут выставляться вручную инструментом PaintFluidsTool. При этом в случае динамических сеток выставленные значения со временем еще и будут изменяться — то есть они вычисляются заново в каждом кадре анимации, что значительно увеличивает расчетное время. Это означает, что нединамические эффекты могут создаваться на базе градиентов и статистических сеток, а динамические требуют, чтобы по крайней мере плотность флюидов (Density) формировалась как динамическая сетка. Что касается варианта UseShadingColor для параметра Color, то он для данного параметра (в отличие от StaticGrids и DynamicGrid) позволяет напрямую определять цвет fluid-частиц.
Рис. 8. Свиток ContentsMethod
Свиток DynamicSimulation (рис. 9) позволяет регулировать спектр параметров, отвечающих за динамическое изменение флюидов. В их число включены следующие параметры:
- Gravity (Гравитация) — устанавливает уровень гравитационной силы;
- Viscosity (Вязкость) — задает степень сопротивления текучести флюидов, при высоких значениях данного параметра имитируемый материал становится вязким, как смола;
- Friction (Трение) — определяет уровень трения;
- Damp (Заглушение) — уменьшает скорость симуляции;
- HighDetailSolve (Разрешить высокую детализацию) — позволяет детализировать изображение; по умолчанию находится в положении Off (то есть высокая детализация запрещена);
- StartFrame — устанавливает кадр, в котором начинается испускание флюидов;
- SimulationRateScale — определяет масштаб эмиссии.
Рис. 9. Свиток Dynamic Simulation
В свитке Shading (рис. 10) настраиваются градиенты и дополнительные значения входных параметров для цвета флюидов (раздел Color), а также уровня их самосвечения (раздел Incandescence) и непрозрачности (Opacity). Обратите внимание, что если для параметра Color в свитке ContentsMethod будет выбран не вариант UseShadingColor (он задан по умолчанию), то группа Color окажется недоступной для редактирования — в этом случае для fluid-частиц задается тот цвет, который установлен по умолчанию для данных типов сеток.
Рис. 10. Свиток Shading
Нединамические fluid-эффекты
Принцип моделирования нединамических fluid-эффектов следующий. Вначале создается fluid-контейнер, причем (в отличие от динамических эффектов) это может быть и почти плоский параллелепипед. Затем для параметра Density в свитке ContentsMethod в качестве варианта формирования устанавливается Gradient либо StaticGrid. После этого производится настройка цвета (свиток Shading) и подключение текстуры (свиток Textures). На последнем этапе при необходимости получения имитации движения дополнительно создаются ключи для параметра TextureTime (свиток Textures).
Для примера создайте в новой сцене 3D-контейнер, применив команду FluidEffects=>Create3DContainer и установив при выделенном контейнере в свитке ContainerProperties размер 3x3x3 (X/Y/ZSize), — рис. 11. Добавим к контейнеру флюиды. В окне проекции Perspective включите режим SmoothShadeAll (команда Shading=>SmoothShadeAll из меню окна проекции) — иначе при установленном по умолчанию каркасном режиме Wireframe флюиды будут отображаться в виде точек. Укажите в свитке ContentsMethod для параметра Density в качестве варианта формирования Gradient с типом градиента Constant, а все остальные параметры, кроме Color (то есть Velocity, Temperature, Fuel и Falloff), вообще отключите, установив для них вариант Off (рис. 12). Добавьте в сцену источник света типа Directional, немного переместите источник относительно оси Z и поверните так, как показано на рис. 13.
Рис. 11. Появление 3D-контейнера
Рис. 12. Определение методов формирования параметров в свитке ContentsMethod
Рис. 13. Добавление источника света
Откройте свиток Shading, увеличьте интенсивность свечения (GlowIntensity) примерно до 0,4, установите для параметра DropoffShape вариант Sphere, а затем увеличьте порог снижения интенсивности плотности (EdgeDropoff) до 0,1 (рис. 14). Установите для параметров Color (Цвет) и Incandescence (Самосвечение) в полях ColorInput и IncandescenceInput вариант CenterGradient. Визуализируйте сцену, и вы увидите круглое и практически полностью непрозрачное светящееся облако флюидов (рис. 15). В свитке Color на градиентной шкале установите два слайдера: у левого задайте красный цвет, у правого — оранжевый (рис. 16); в итоге облако станет светиться уже красно-оранжевым цветом (рис. 17).
Рис. 14. Основная корректировка параметров свитка Shading
Рис. 15. Первая визуализация
Рис. 16. Дополнительное изменение настроек параметров свитка Color
Рис. 17. Вторая визуализация
Переключитесь в свиток Textures, включите флажки TextureColor и TextureOpacity, удостоверьтесь в том, что в поле TextureType выбрана текстурная карта PerlinNoise, и увеличьте значение параметра Frequency (Частота), отвечающего за уровень детализации шума, до 3 — свечение станет уже неоднородным (рис. 18). Неоднородность будет гораздо более выраженной, если дополнительно увеличить частотный коэффициент шума (FrequencyRatio), а также размеры зерна цвета (ColorTexGain) и зерна непрозрачности (OpacityTexGain) — рис. 19.
Рис. 18. Первая корректировка параметров свитка Textures
Рис. 19. Вторая корректировка параметров свитка Textures
Сделайте копию контейнера и увеличьте ее масштаб (рис. 20). Не снимая выделения с контейнера-дубликата, перейдите на свиток Shading и увеличьте значение параметра EdgeDropoff до 0,314, а в разделе Opacity измените вид тональной кривой в соответствии с рис. 21 и введите в поле InputBias значение 1. Данные действия позволят получить вокруг шара светящийся ореол, в результате чего изображение станет похожим на светящуюся звезду (рис. 22).
Рис. 20. Масштабирование контейнера-дубликата
Рис. 21. Изменение настроек параметров контейнера-дубликата
Рис. 22. Светящаяся звезда
1 Воксель (англ. voxel, volume picture elements) — минимальный (простейший) элемент объемной геометрии. Возврат