Первые шаги в Maya. Урок 25. Работа с модулем Maya Hair
Примеры создания сцен с использованием Hair-систем
Анимированный телефонный провод
Для достижения большей реалистичности динамических воздействий в Maya предусмотрено внедрение в сцены самых разнообразных типов динамических объектов: частиц (Particles), твердых и мягких тел (Bodies), тканей (Cloth), волос (Hair), жидких и газообразных структур (Fluids) и т.д. С большей частью названных типов объектов мы уже сталкивались, а этот урок посвятим знакомству с Hair-объектами, которые позволяют моделировать волосы (свободно падающие, колышущиеся под воздействием ветра, плавающие под водой и т.д.) и формировать на их основе различные прически (включая стрижки и прически с начесами, хвостами, косами и пр.). Кроме того, Hair-системы могут использоваться при моделировании не связанных с волосами динамических объектов — веревок, цепей, кабелей, проводов и т.д.
Работа с Hair-объектами выполняется с помощью специального модуля Maya Hair, позволяющего формировать Hair-системы на базе полигональных моделей и NURBS-поверхностей либо получать их путем конвертирования из обычных NURBS-кривых.
Теоретические аспекты
Любая Hair-система представляет собой множество отдельных кривых-волосков, каждый из которых связан со своим волосяным фолликулом (Follicle) и является Nurbs-кривой (рис. 1). Фолликулы (а значит и связанные с ними волосы) объединены в пучки (Hair Clump) — площадь таких пучков, равно как и количество фолликулов в них, регулируется. За работу с Hair-объектами отвечает меню Hair (Волосы, рис. 2) — оно доступно лишь в режиме Dynamics (Динамика), активируемом при нажатии клавиши F5 (в более ранних версиях Maya — F4).
Рис. 1. Hair-система с выделенными фолликулами (слева) и волосами (справа)
Рис. 2. Меню Hair
Генерировать Hair-системы можно двумя способами: формируя их на базе существующих полигональных объектов или Nurbs-поверхностей либо получая из предварительно созданных Nurbs-кривых. Как правило, первый вариант используется при формировании настоящих волос и причесок из них; для его реализации достаточно выделить исходный объект и запустить процесс генерации Hair-системы, выбрав команду Hair=>CreateHair (Волосы=>Создать волосы). При желании на одной и той же поверхности может быть создана не одна, а две и более систем волос. Параметры Hair-системы устанавливаются сразу при ее создании (для этого следует щелкать на квадратике, расположенном справа от соответствующей команды), либо корректируются позднее в окне каналов либо в редакторе атрибутов (последнее возможно не для всех параметров — например, изменить расположение фолликулов, регулируемых параметрами Ucount и Vcount, после создания системы будет невозможно).
Второй вариант чаще всего применяется, когда требуется получить не волосы, а подобные им в плане динамических воздействий объекты: провода, веревки и т.д. В этом случае вначале создают одну Nurbs-кривую либо целый набор таких кривых (их придется объединить в группу), при этом каждая из кривых должна иметь достаточно большое количество управляющих вершин (в противном случае добиться желаемого динамического эффекта не удастся). А затем назначают кривые Hair-системой с помощью команды Hair=>AssignHairSystem=>NewHairSystem (Волосы=>Назначить Hair-системой=>Новая Hair-система) либо превращают в динамические кривые командой Hair=>MakeSelectedCurvesDynamic (Волосы=>Сделать выделенную кривую динамической). В первом случае будет сформирована система Hair-кривых, каждый фолликул которой порождает пучок волос, во втором — лишь один единственный волос. Параметры созданной такими способами Hair-системы обычно корректируются уже после ее создания в окне каналов либо в редакторе атрибутов, хотя при конвертировании часть параметров может потребоваться указать заранее (то есть в окне Make Curves Dynamic Options).
Готовые Hair-системы при визуализации могут быть представлены Nurbs-кривыми (данный вариант используется по умолчанию) либо штрихами Paint Effects (рис. 3). Во втором случае требуется предпринять дополнительные шаги: выделить Hair-кривые, открыть окно кистей Paint Effects (команда PaintEffects=>GetBrush — Paint Effects=>Выбрать кисть), выбрать нужную кисть, установить ее размер через окно настроек кисти (вызывается при нажатии комбинации клавиш Ctrl+B) и применить команду Hair=>AssignPaintEffectsBrushtoHair (Волосы=>Назначить волосам кисть Paint Effects).
Рис. 3. Hair-система с Nurbs-кривыми (слева) и штрихами PaintEffects (справа)
Вид Hair-системы определяется многочисленными параметрами, регулирующими плотность волос, их толщину и количество, наличие завитков и изгибов и т.п. Поведение входящих в нее Hair-кривых также зависит от множества факторов. Во-первых, на них могут воздействовать физические силы — поля, под действием которых Hair-кривые будут вести себя иначе. К перечню таких сил относятся трение (Drag), гравитация (Gravity) и турбулентность (Turbulence) — уровень воздействия данных сил регулируется в редакторе атрибутов (секции Forces и Turbulence раздела Dynamics). Во-вторых, Hair-кривые могут сталкиваться друг с другом и другими поверхностями и отталкиваться от них, то есть выступать как объекты коллизий (Collisions). В-третьих, движение Hair-кривых можно ограничивать, создавая следующие ограничители (команда Hair=>CreateConstraint — Волосы=>Создать ограничитель):
- Rubber Band — подвешивает Hair-кривую к определенной точке сцены на резиновой нити, не мешая ей вращаться вокруг данной точки и изменять свою длину под воздействием сил или в результате столкновений с другими объектами; длина ограничителя циклически изменяется;
- Stick — привязывает Hair-кривую к определенной точке сцены, не мешая ей вращаться вокруг данной точки и изменять свою длину под воздействием сил или в результате столкновений с другими объектами; длина ограничителя фиксирована;
- Transform — жестко прикрепляет Hair-кривую к определенной точке сцены, вращение и масштабирование кривой оказывается невозможным;
- Hair to Hair — связывает множество Hair-кривых в группу (своего рода пучок) с возможностью сохранения относительной свободы движения внутри нее;
- Hair Bunch — связывает множество Hair-кривых попарно друг с другом с возможностью сохранения относительной свободы их движения.
Кроме того, у любой Hair-системы существуют три положения: стартовое (StartPosition) и текущее (CurrentPosition) положения, а также положение покоя (RestPosition). За переключение между данными положениями отвечают команды Start Position, Current Position и Rest Position соответственно из меню Hair=>Display. Под стартовым понимается положение системы в первом кадре анимации, положение покоя — это то состояние Hair-кривых, когда на них не воздействуют никакие силы (данное положение может ассоциироваться с видом волос, покрытых лаком с сильной фиксацией), а текущее положение — положение в рабочем кадре. Редактирование структуры Hair-системы может производиться только в положениях Start и Rest, определяющих поведение системы при анимации, а просмотр анимации возможен лишь в текущем положении.
Для примера создайте новую сцену с полигональным шаром (рис. 4). Выделите шар и примените команду Hair=>CreateHair — в разных частях шара (причем независимо от параметров его полигональной сетки) появятся пучки волос (рис. 5). Принцип размещения данных пучков определяется при создании Hair-объектов через параметры Ucount (Количество по оси U) и Vcount (Количество по оси V), которые затем изменить будет уже невозможно. Поэтому отмените последнюю операцию и щелкните теперь уже на квадратике у команды Hair=>CreateHair. В окне настроек установите параметры Ucount и Vcount равными 15, а параметр Length (задает длину волос) — 10 и включите флажок Equalize (нужен для того, чтобы фолликулы располагались на поверхности равномерно) — рис. 6. В итоге пучки окажутся расположенными гуще, а волосы в них будут длиннее (рис. 7). Увеличьте количество кадров анимации до 200 и запустите процесс ее проигрывания — волосы начнут опадать вниз (рис. 8).
Рис. 4. Исходная сцена
Рис. 5. Появление пучков волос
Рис. 6. Настройка Hair-параметров
Рис. 7. Первоначальный вид Hair-кривых
Рис. 8. Вид опадающих волос в одном из кадров анимации
Изменим полученную Hair-систему так, чтобы волосы оказались лишь в верхней половине шара, а в нижней отсутствовали. Для этого следует выделить ненужные волосы и удалить их, но сделать это можно лишь в стартовом положении. Переключитесь в него, применив команду Hair=>Display=>Start Position (Волосы=>Отображение=>Стартовое положение) — теперь можно выделить не все волосы разом, а только те из них, которые необходимо. Попробуйте выделить все волосы, расположенные в нижней половине шара обычным образом (то есть заключив в прямоугольный контур) — сделать это не получится, поскольку при выделении волос окажется выделенным и шар (рис. 9). Можно, конечно, исхитриться и выделить нужные объекты при нажатой клавише Shift путем последовательного выделения каждого из волос по очереди, но это крайне длительная процедура — ведь волос много. Поэтому перед выделением включите режим маскирования — в строке Status Line щелкните на кнопке Object Selection Mask (рис. 10) и установите вариант AllObjectsOff (после этого никакие объекты выделяться не будут). Затем кликните на кнопке Curves (рис. 11) — это ограничит перечень выделяемых объектов кривыми, после чего выделить волосы в нижней половине шара уже не составит труда. Выделите их (рис. 12) и удалите, нажав клавишу Del (рис. 13).
Рис. 9. Результат выделения волос при стандартном подходе
Рис. 10. Кнопка Object Selection Mask
Рис. 11. Кнопка Curves
Рис. 12. Выделение Hair-кривых в нижней половине шара
Рис. 13. Результат удаления выделенных Hair-кривых
Попробуем сделать так, чтобы сгенерированные волосы оказались распределенными по шару равномерно и были погуще. Установите положение Current Position (команда Hair=>Display=>Current Position), выделите волосы, активируйте в редакторе атрибутов вкладку hairSystemShape1 и раскройте раздел ClumpandHairShape (рис. 14). Увеличьте значение параметра ClumpWidth, регулирующего ширину пучков волос примерно до 1,2, и увеличьте количество волос в пучке (параметр Hairs Per Clump) до 40 — волосы покроют поверхность шара практически сплошным ковром (рис. 15). Теперь превратим совершенно прямые пряди волос в кудряшки. Раскройте раздел Displacements и установите в нем значения параметров Curl (регулирует величину смещения завитков) и CurlFrequency (определяет частоту завитков) равными 2 и 20 соответственно — волосы станут слегка волнистыми (рис. 16), но это окажется заметным лишь на некоторых пучках. Причина того, что столь радикальное увеличение вышеназванных параметров не позволило достичь желаемого результата, кроется в недостаточной сегментации волос (то есть в малом количестве управляющих вершин внутри каждого волоса), ведь при их создании на отвечающий за это параметр Pointsperhair мы не обратили внимания. В итоге каждая Hair-кривая имеет всего по девять сегментов, чего для получения завитков недостаточно. Исправить значение параметра Pointsperhair после создания Hair-системы невозможно, однако допускается дробление сегментов на подсегменты, чем мы и воспользуемся. Вернитесь в раздел ClumpandHairShape и увеличьте значение параметра SubSegments до 5 — волосы станут вьющимися (рис. 17).
Рис. 14. Вид волос при первоначальном варианте настроек раздела ClumpandHairShape
Рис. 15. Первая корректировка настроек раздела ClumpandHairShape
Рис. 16. Изменение настроек раздела Displacements
Рис. 17. Вторая корректировка настроек раздела ClumpandHairShape
Запустите анимацию, остановите ее, когда волосы опустятся, визуализируйте сцену и увидите примерно такой же результат, как представлен на рис. 18. Обратите внимание, что при анимации все пучки волос ведут себя идентично — это несложно исправить, подвергнув волосы воздействию турбулентной силы. Только перед этим временно уменьшите качество отображения (параметр DisplayQuality — рис. 19) до 2 — это позволит ускорить процесс перерисовки Hair-кривых. После этого поэкспериментируйте с настройками турбулентности (секция Turbulence раздела Dynamics), вновь запустите проигрывание анимации и убедитесь, что теперь пучки волос ведут себя совершенно по-разному (рис. 20). Восстановите качество отображения, указав для параметра DisplayQuality значение 100, и проведите рендеринг — результат окажется совершенно иным (рис. 21), чем ранее.
Рис. 18. Первоначальная визуализация сцены
Рис. 19. Уменьшение значения параметра DisplayQuality
Рис. 20. Изменение характера поведения волос под воздействием турбулентной силы
Рис. 21. Вид визуализированной сцены после добавления турбулентности