Первые шаги в Maya. Урок 23. Имитация тканей

Светлана Шляхтина

Теоретические аспекты

Примеры сцен с Cloth-объектами

Стол с наброшенной скатертью

Развевающаяся на ветру штора

Пингвин в лосинах

 

Ткани представляют собой одну из групп динамических объектов и обладают свойствами эластичности, плотности и растяжения. Моделировать в Maya их можно двумя способами: как мягкие тела (Soft Body) либо как Cloth-объекты, то есть объекты из ткани. Мягкие тела более подходят для получения образцов ткани, не имеющих швов (развевающихся на ветру флагов, наброшенных на кровать покрывал и т.п.). Возможности Cloth-объектов гораздо шире — они моделируются по настоящим выкройкам и потому применяются не только для получения бесшовных объектов из ткани, но и создания одежды персонажей. Такая одежда может состоять из различных по своим характеристикам тканей: хлопка, шелка, шерсти и т.д. С вариантом моделирования тканей в виде мягких тел мы уже ознакомились на одном из предыдущих уроков, а этот урок посвятим динамике Cloth-объектов.
Работа с Cloth-телами реализуется через специальный модуль Maya Cloth, позволяющий создавать образец ткани (бесшовный либо со швами), обертывать ткань вокруг модели с естественной деформацией и формированием складок. В случае динамического персонажа полученная таким образом одежда будет дополнительно деформироваться при его движении, то есть также окажется динамической. Задача данного модуля — натянуть либо набросить ткань на указанную модель, для этого программа определяет характер взаимодействия ткани с моделью, учитывая геометрию, с которой ткань приходит в соприкосновение, и характеристики самой ткани. Проводимые для этого расчеты достаточно длительны, существенны и затраты системных ресурсов.

Теоретические аспекты

Технически создавать Cloth-ткань можно двумя способами: превращая в ткань существующие полигональные объекты или NURBS-поверхности либо получая ткань на основе предварительно подготовленных выкроек. Первый вариант проще, ведь для этого достаточно выделить исходный объект и запустить процесс превращения его в ткань, выбрав ответственную за это команду.

Технология создания ткани на базе выкроек достаточно сложна и включает прохождение нескольких этапов. Вначале формируется контурная выкройка — если провести аналогию с реальным моделированием одежды, то данный процесс может ассоциироваться с рисованием обычной швейной выкройки на листе бумаги. Если предполагается, что Cloth-объект будет представлять собой единственный кусок ткани, то в роли основы для такой выкройки может выступать замкнутая кривая либо набор кривых, образующих замкнутый контур. Если же Cloth-тело должно быть сформировано из нескольких сшитых между собой кусков ткани, то ровно столько же следует создать и замкнутых контуров (по контуру на каждый лоскут ткани). Количество контуров в контурной выкройке может быть любым, но они должны быть абсолютно плоскими, а значит, рисовать их можно только в окнах планарных проекций: Top, Front и т.д. Любым также может быть число задействованных при создании отдельного контура кривых, но координаты конечной точки одной кривой должны точно совпадать с координатами начальной точки другой кривой (иначе при последующих действиях программа выдаст ошибку). Кроме того, есть еще один важный нюанс: поскольку в дальнейшем на базе контуров будут создаваться лоскуты ткани, которые обычно требуется сшивать между собой, то следует заранее четко представлять себе расположение швов, предназначая для каждого шва отдельную кривую. Когда все контуры оказываются сформированными, то переходят к следующему этапу — для каждого контура создается плоскость-выкройка (ее принято называть панелью — panel), то есть, если продолжить аналогию, выкройка вырезается из бумаги. После этого из полученных выкроек формируются лоскуты ткани. Созданные лоскуты сшиваются между собой по соответствующим кривым. Затем модель, на которую должно быть наброшено либо одето изделие из ткани, превращается в объект коллизий с тканью (без данной операции ткань провалится сквозь модель и исчезнет вследствие тяготения) и производится настройка параметров коллизии, отвечающих за поведение ткани. И наконец, на последнем этапе запускается процесс симуляции ткани, по окончании которого в зависимости от разнообразных параметров одежда садится на персонаж точно по фигуре либо ткань просто набрасывается на модель.

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

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

В Maya 8.0 работа с Cloth-объектами производится в режиме Cloth (в предыдущих версиях — в режиме Dynamics через меню Cloth). Основные команды, требуемые для моделирования тканей, сосредоточены в одноименном меню Cloth (рис. 1). Это команды CreatePanel (Создать панель), CreateGarment (Создать предмет одежды), CreateSeam (Создать шов), CreateCollisionObject (Создать объект коллизий) и CreateClothObject (Создать Cloth-объект).

 

Рис. 1. Меню Cloth

Рис. 1. Меню Cloth

 

Для примера создайте простую сцену из шара размером 1x1x1 и расположенной над ним замкнутой NURBS-кривой в виде прямоугольника (рис. 2). Прямоугольник нужно формировать не вручную, а инструментом Create a Nurbs square (иначе могут возникнуть проблемы, решение которых мы рассмотрим немного ниже), причем в окне проекции Top — рис. 3. Попробуем получить на основе данного прямоугольника кусок ткани и добиться того, чтобы эта ткань реалистично облегала шар. Выделите прямоугольник и создайте на базе кривой панель, воспользовавшись командой Cloth=>CreatePanel (Ткани=>Создать панель) — рис. 4. Затем сформируйте по панели (она должна быть выделена) кусок ткани, применив команду Cloth=>CreateGarment (Ткани=>Создать предмет одежды). Пока ткань выглядит как обычная плоскость (рис. 5) и имеет очень низкое разрешение полигональной сетки, при котором ни о каких складках не может быть и речи — для получения более сглаженной поверхности увеличьте в окне каналов базовое разрешение (параметр BaseResolution в области cpStitcher) с 25 до 300 (рис. 6). Увеличьте число кадров анимации до 40. Если после этого сразу воспроизвести анимацию, то вы увидите, что под воздействием гравитации кусок ткани упадет на шар, пройдет сквозь него и исчезнет.

 

Рис. 2. Исходный вид сцены

Рис. 2. Исходный вид сцены

 

Рис. 3. Выбор инструмента CreateaNurbssquare

Рис. 3. Выбор инструмента CreateaNurbssquare

 

Рис. 4. Появление панели

Рис. 4. Появление панели

 

Рис. 5. Первоначальный вид куска ткани

Рис. 5. Первоначальный вид куска ткани

 

Рис. 6. Увеличение базового разрешения полигональной сетки

Рис. 6. Увеличение базового разрешения полигональной сетки

 

Чтобы этого не происходило, превратите шар в объект коллизий с тканью, выбрав из меню Cloth команду CreateCollisionObject (Создать объект коллизий). Прежде чем запускать анимацию, при выделенной ткани удалите кэш симуляции (команда Simulation=>DeleteCache — Симуляция=>Удалить кэш), поскольку в противном случае при воспроизведении анимации отображаться будет ранее записанный в кэш результат. После превращения шара в объект коллизий Cloth-тело ляжет на шар, правда в действительности ткань оно будет напоминать весьма слабо и в большей степени окажется похожим на жесткую пергаментную бумагу (рис. 7). Причин жесткости ткани две: неверное понимание программой реальных размеров шара и куска ткани и некорректные значения параметров, регулирующих расстояние, на котором ткань должна держаться от объекта, чтобы не проникнуть в него. И дело не в том, что в Maya значения управляющих данными аспектами параметров по умолчанию установлены неудачно, а в том, что значения соответствующих параметров тесно связаны с размером модели, а он в каждом конкретном случае свой.

 

Рис. 7. Вид ткани сразу после превращения шара в объект коллизий

Рис. 7. Вид ткани сразу после превращения шара в объект коллизий

 

Первая проблема устраняется путем увеличения значения параметра SolverScale (Масштаб решателя). Данный параметр позволяет указать модулю Maya Cloth то, насколько модель большая, от чего кардинально зависит поведение надеваемой (набрасываемой) на нее ткани. Установленное по умолчанию для параметра SolverScale значение 1 подходит только для маленьких моделей (носовой платок, платье для куклы и т.д.). Если модель большая (полотнище флага, платье для реального живого персонажа и т.п.), то значение данного параметра должно увеличиваться — чем модель значительнее, тем оно больше. Поэтому выделите ткань и установите названный параметр равным 10 (рис. 8). Стоит заметить, что подобный подход справедлив лишь в том случае, если у созданной модели не реальные, а уменьшенные размеры (как в нашем случае, когда у шара указан размер 1x1x1). Если размеры модели реальные, то увеличение параметра SolverScale не требуется.

Для решения второй проблемы придется изменить сразу два параметра: CollisionOffset (Расстояние до объекта коллизии) и CollisionDepth (Глубина проникновения в объект коллизии). По умолчанию каждый из них равен 1, а в нашем случае шар имеет точно такой же радиус, поэтому значения данных параметров оказываются слишком большими. Выделите шар и уменьшите значения параметров CollisionOffset и CollisionDepth примерно до 0,2 (рис. 9). Удалите кэш симуляции (команда Simulation=>DeleteCache) и вновь запустите анимацию — теперь Cloth-тело уже будет походить на ткань, но оно слишком сильно проникнет в шар (рис. 10). Правда, связано это уже не с тем, что настройки проникновения подобраны неверно, а с геометрией самого шара — по умолчанию число разбиений в нем по всем осям невелико, что сказывается на характере облегания шара тканью. Увеличьте число разбиений до 20 — ткань станет ложиться на шар уже вполне естественно (рис. 11). Сохраните сцену.

 

Рис. 8. Корректировка параметра SolverScale

Рис. 8. Корректировка параметра SolverScale

 

Рис. 9. Изменение параметров CollisionOffset и CollisionDepth

Рис. 9. Изменение параметров CollisionOffset и CollisionDepth

 

Рис. 10. Результат уменьшения жесткости Cloth-объекта

Рис. 10. Результат уменьшения жесткости Cloth-объекта

 

Рис. 11. Ткань на шаре (ткань создана на базе выкройки)

Рис. 11. Ткань на шаре (ткань создана на базе выкройки)

 

А теперь попробуем добиться того же эффекта набрасывания ткани на шар, но получим ткань из NURBS-поверхности. Скройте Cloth-объект (Display=> Hide=> Hide Selection), создайте NURBS-плоскость того же размера, что и замкнутый контур для только что скрытого Cloth-объекта, и расположите ее над шаром (рис. 12). Выделите плоскость и превратите ее в ткань при помощи команды Cloth=>CreateClothObject (Ткани=>Создать Cloth-объект) — на самом деле это по-прежнему плоскость (то есть объект nurbsPlane, а не Cloth-объект, в чем можно удостовериться, например, в окне Outliner), но с несколько иной структурой рис. 13. Если сразу запустить процесс симуляции, то результат окажется неутешительным (рис. 14), что и понятно, ведь разрешение плоскости минимально. Увеличим разрешение, установив в полях UNumber и VNumber (узел nurbsTessellate) значение 20 (рис. 15), — поведение плоскости станет напоминать поведение ткани (рис. 16), хотя складки будут не столь естественными, как у ткани, созданной на базе выкройки.

 

Рис. 12. Исходный вид сцены

Рис. 12. Исходный вид сцены

 

Рис. 13. Преобразованная в ткань плоскость до симуляции

Рис. 13. Преобразованная в ткань плоскость до симуляции

 

Рис. 14. Вид преобразованной в ткань плоскости по окончании симуляции

Рис. 14. Вид преобразованной в ткань плоскости по окончании симуляции

 

Рис. 15. Настройка разрешения плоскости

Рис. 15. Настройка разрешения плоскости

 

Рис. 16. Ткань на шаре (получена превращением NURBS-поверхности)

Рис. 16. Ткань на шаре (получена превращением NURBS-поверхности)

 

Проводить симуляцию ткани можно не только через проигрывание анимации, но и путем локальной симуляции (команда Simulation=>Start/Stop LocalSimulation —Симуляция=>Начать/Закончить локальную симуляцию). Отличие данного способа в том, что при его применении новые кадры анимации не создаются и данные в кэш не записываются. Правда, при использовании данного способа проблематично остановить процесс симуляции в нужный момент, поскольку не удается быстро добраться до команды Stop LocalSimulation. Однако эта проблема легко разрешается, если временно перетащить соответствующее подменю на рабочую зону, щелкнув на двойной полосе под именем меню (рис. 17).

 

Рис. 17. Перетаскивание подменю на рабочую зону

Рис. 17. Перетаскивание подменю на рабочую зону

 

Для отдельных вершин Cloth-объектов либо panel-кривых (то есть кривых, входящих в замкнутый контур, по которому создавалась панель) можно устанавливать ограничители, привязывая их к определенным областям. Таким образом можно, например, прикрепить некоторые фрагменты одежды (кнопки, карманы и т.п.), зафиксировать у персонажа платье на плечах либо штаны на талии и др. Допускается создание следующих ограничителей:

  • Transform constraints — привязывает указанные вершины либо исходные кривые ткани к определенной точке сцены;
  • Mesh constraints — обеспечивает привязку указанных вершин либо исходных кривых ткани к персонажу;
  • Cloth constraints — привязывает одну ткань к конкретным вершинам другой ткани;
  • Collision constraints — позволяет регулировать возникновение складок при симуляции ткани (то есть используется для управления процессом столкновения вершин ткани друг с другом);
  • Field constraints — обеспечивает управление ограничением реакции ткани на воздействие динамических сил;
  • Button constraints — позволяет привязывать к ткани полигональные объекты и NURBS-поверхности, например кнопки и пуговицы.

Попробуем в сцене с ранее смоделированным Cloth-объектом (она была сохранена) установить Transform-ограничитель. Создайте локатор, применив команду Create=> Create Locator (Создать=>Создать локатор), и разместите его желаемым образом (рис. 18) — локатор нужен нам для того, чтобы привязать к нему ткань. Не снимая выделения с локатора, нажмите правую кнопку мыши на ткани и установите режим работы с вершинами (команда Vertex), а затем при нажатой клавише Shift выделите вершину в одном из углов ткани (рис. 19). Примените команду Constraints=>Transform (Ограничители=>Трансформация). Очистите кэш симуляции и запустите анимацию — ткань опадет на шар, но один из ее концов останется на месте, то есть окажется как бы привязанным к той точке пространства, где он располагался до начала симуляции (рис. 20). Характер привязки регулируется в свойствах ограничителя (объект transformConstraint) — рис. 21. Например, изменив значение целевого веса (параметр Goal Weight) с 0 на 1, мы добьемся того, что конец ткани будет прикреплен не к исходной точке, а непосредственно к локатору (рис. 22).

 

Рис. 18. Появление локатора

Рис. 18. Появление локатора

 

Рис. 19. Выделение вершины

Рис. 19. Выделение вершины

 

Рис. 20. Вид наброшенной ткани с зафиксированным концом

Рис. 20. Вид наброшенной ткани с зафиксированным концом

 

Рис. 21. Панель настройки параметров ограничителя

Рис. 21. Панель настройки параметров ограничителя

 

Рис. 22. Результат изменения значения целевого веса

Рис. 22. Результат изменения значения целевого веса

 

С таким же успехом можно прикрепить к локатору и panel-кривую — попробуем это сделать. Удалите созданный ограничитель, выделив его в окне Outliner и нажав клавишу Del. Выделите локатор и при нажатой клавише Shift одну из кривых, на базе которых была построена панель, и примените команду Constraints=>Transform. Очистите кэш симуляции и запустите анимацию — теперь привязанной к точке пространства окажется уже одна из сторон ткани (рис. 23).

 

Рис. 23. Вид наброшенной ткани с зафиксированной стороной

Рис. 23. Вид наброшенной ткани с зафиксированной стороной

 

Усложним ситуацию — попробуем набросить на объект не кусок ткани, а простое сшитое изделие. Создайте сцену с плоскостью и вытянутым на ней по оси Z сглаженным Subdiv-кубом — для его сглаживания примените команду Display=>SubdivSmoothness=>Fine (Отображение=>Subdiv-сглаживание=>Высокий уровень детализации) — рис. 24. Пусть это будет, например, имитация кровати. Попробуем создать для нее покрывало с оборками по бокам. Получается, что покрывало должно состоять из трех сшитых прямоугольных кусков ткани. Исходя из этого, создайте в проекции Top три прямоугольника, тщательно отрегулировав их положение в отношении куба (рис. 25). Последовательно для каждой из замкнутых кривых сформируйте панели, по очереди выделяя нужную кривую в окне Outliner и применяя к ней команду Cloth=>CreatePanel (рис. 26). Получите на базе панелей соответствующие лоскуты ткани, также по очереди выделяя определенную панель и применяя к ней команду Cloth=>CreateGarment (рис. 27). Теперь требуется сшить лоскуты. Выделите указанные на рис. 28 отрезки кривых и сшейте соответствующие лоскуты между собой при помощи команды Cloth=>CreateSeam (Ткани=>Создать шов) — между лоскутами появится шов (рис. 29). Аналогичным образом пришейте второй лоскут — результатом станет получение единого Cloth-объекта (рис. 30).

 

Рис. 24. Исходный вид сцены

Рис. 24. Исходный вид сцены

 

Рис. 25. Создание прямоугольных заготовок

Рис. 25. Создание прямоугольных заготовок

 

Рис. 26. Появление панелей

Рис. 26. Появление панелей

 

Рис. 27. Появление лоскутов ткани

Рис. 27. Появление лоскутов ткани

 

Рис. 28. Выделение кривых для сшивания первого лоскута

Рис. 28. Выделение кривых для сшивания первого лоскута

 

Рис. 29. Появление шва между двумя соседними лоскутами

Рис. 29. Появление шва между двумя соседними лоскутами

 

Рис. 30. Вид сшитых лоскутов в проекции Top

Рис. 30. Вид сшитых лоскутов в проекции Top

 

Для сшитых лоскутов (это будет уже один объект cloth1) увеличьте базовое разрешение (BaseResolution в области cpStitcher) до 300, а значение параметра SolverScale до 10 и обнулите параметр RelaxFrameLength (он определяет число кадров, предшествующих моменту начала воздействия на ткань гравитации) — рис. 31. Превратите Subdiv-куб в объект коллизий с тканью (Cloth=>CreateCollisionObject) и уменьшите для него значения параметров CollisionOffset и CollisionDepth до 0,18 и 0,2 соответственно. Выделите в окне Outliner все три прямоугольных контура и переместите их над кубом (рис. 32) — лоскуты ткани также переместятся. Запустите симуляцию и оцените вид полученного покрывала. После этого при необходимости подрегулируйте размеры отдельных лоскутов путем масштабирования соответствующих прямоугольных контуров (обычно чрезмерно усердствовать при таком редактировании не рекомендуется, поскольку в более сложных конструкциях нарушаются связи с тканью и ее приходится создавать заново), а затем увеличьте базовое разрешение до 500. Это позволит добиться достаточно реалистичного собирания оборок у импровизированного покрывала (рис. 33).

 

Рис. 31. Настройка параметров Cloth-объекта

Рис. 31. Настройка параметров Cloth-объекта

 

Рис. 32. Перемещение прямоугольных контуров

Рис. 32. Перемещение прямоугольных контуров

 

Рис. 33. Импровизированное покрывало

Рис. 33. Импровизированное покрывало

В начало В начало

next

КомпьютерПресс 7'2008