Первые шаги в Maya. Урок 20. Динамика твердых тел
Примеры сцен с динамическим воздействием
Одной из серьезных проблем при моделировании и анимации является необходимость учитывать обычные законы физики: трение, притяжение и т.д., без соблюдения которых реалистичности не добиться. На практике это совсем непросто: например, если требуется смоделировать свободно свисающую под собственной тяжестью ткань, то придется долго и кропотливо работать на уровне вершин, распределяя их так, чтобы складки выглядели действительно реально. Еще сложнее в случае анимации — так, любое упругое тело (например, обычный резиновый мяч) при падении подпрыгивает, причем многократно и на разную высоту. Это означает, что получение анимации подобного падения методом ключевых кадров потребует создания нескольких ключей анимации, что придется сделать вручную, на глазок оценив временные интервалы между ключевыми кадрами и расстояние, на которое должен подниматься объект при подпрыгивании. Очевидно, что подобных движущихся объектов в любой сцене множество, да и движение их гораздо сложнее. Более того, помимо них имеется немало второстепенных объектов — создающих фон и на первый взгляд статичных, которые, тем не менее, для реалистичности тоже должны изменяться во времени, например провода на ветру чуть колышутся, свисающая с чердака веревочная лестница слегка колеблется, по водной поверхности бежит слабая рябь и т.п. Анимировать все их вручную — задача непосильная, тем более что нужно не просто анимировать, а анимировать с учетом реальных физических свойств данных объектов.
Для решения названной проблемы в Maya включены специальные модули, позволяющие работать с разными типами динамических объектов: частицами (Particles), телами (Bodies), волосами (Hair) и жидкостями (Fluids). Системы частиц представляют собой малоразмерные объекты, обладающие динамическими свойствами и позволяющие имитировать такие явления, как дым, огонь, пыль, брызги и т.д. Тела создаются из геометрических поверхностей путем назначения им динамических свойств и используются в основном при моделировании столкновений. Волосы представляют собой кривые, обладающие динамическими свойствами, и своим поведением напоминают веревки. А для имитации жидкостей применяются объемные частицы, умеющие проявлять свойства поверхностей и позволяющие моделировать такие природные явления, как волнистые облака или струйки дыма. С системами частиц мы уже познакомились в одном из предыдущих уроков, а этот урок будет посвящен динамике твердых тел.
Теоретические аспекты
В Maya предусмотрены два типа динамических тел: твердые и мягкие. И те и другие могут создаваться на базе NURBS-моделей либо полигональных поверхностей. Твердые тела (Rigid Body) имеют некоторую массу и трение, подвержены воздействию разнообразных сил (гравитации, ветра и т.д.) и при столкновении могут разрушаться, но не деформируются. Примером твердых тел служат костяшки домино и игральные кости, при падении рассыпающиеся по столу некоторым образом и не изменяющие при этом своей формы. Подобный эффект достигается за счет превращения соответствующих геометрических объектов в динамические тела. Мягкие тела (Soft Body), к которым можно отнести, например, резиновый мячик или кусок ткани, также обладают массой и трением, подвергаются силовым воздействиям и при столкновениях и иных внешних воздействиях деформируются. Для достижения подобного эффекта динамические свойства назначаются не всему геометрическому объекту (как у твердых тел), а лишь его управляющим точкам (в случае NURBS-поверхности) или вершинам (при использовании полигональной сетки). При столкновениях или под действием полей эти точки смещаются, что и приводит к деформации поверхности.
При просчете динамики учитываются такие физические свойства объектов, как масса, гибкость, вязкость, коэффициент трения, а также атмосферные явления (гравитация, ветер и другие назначенные силы), а моделирование движений объектов происходит в режиме реального времени, что позволяет контролировать ситуацию и сразу же корректировать настройки динамических параметров. Подобный просчет производится при минимальных усилиях со стороны пользователя, так как отпадает необходимость вручную оживлять отдельные взаимодействующие между собой объекты сцены, а все ключевые кадры анимации создаются автоматически, но требует немалых системных ресурсов.
За работу с телами отвечает меню Soft/RigidBodies (Мягкие/Твердые тела — рис. 1), которое доступно лишь в режиме Dynamics (Динамика), активируемом при нажатии клавиши F4. В данном меню находятся команды, используемые для создания тел, а также для выполнения в их отношении некоторых операций.
Рис. 1. Меню Soft/RigidBodies
Динамические тела приводятся в движение действием внешних сил, называемых полями (Fields). За работу с полями отвечает меню Fields (рис. 2), также доступное лишь в режиме Dynamics. Поля позволяют имитировать самые разные силы — от силы ветра до силы тяжести:
- Air (Ветер) — имитирует воздействие ветра, отклоняющего тела;
- Drag (Трение) — замедляет движение тел вследствие трения;
- Gravity (Гравитация) — используется для имитации воздействия на тела силы тяжести;
- Newton (сила Ньютона) — обеспечивает орбитальное вращение тел;
- Radial (Радиальность) — приводит к разбрасыванию тел в разные стороны или, наоборот, притягиванию их к некоторой зоне;
- Turbulence (Турбулентность) — приводит к перемешиванию тел во время движения;
- Uniform (Однородность) — заставляет тела двигаться в определенном направлении с постоянной скоростью;
- Vortex (Вихрь) — создает эффект закручивания тел по спирали;
- VolumeAxis (Объемность) — позволяет создавать эффект внутри некоторого объема, который может иметь форму куба, сферы, цилиндра, конуса или тора.
Рис. 2. Меню Fields
Тела можно не только приводить в движение, назначая динамические силы, но и ограничивать у них движение, создавая следующие ограничители:
- Nail (Гвоздь) — привязывает объект к определенной точке сцены, не мешая ему вращаться вокруг данной точки под воздействием сил или в результате столкновений с другими объектами; длина ограничителя фиксирована;
- Pin (Булавка) — связывает два объекта вместе, создавая для них общую опорную точку;
- Hinge (Шарнир) — позволяет объекту, который связывается с точкой в пространстве, с другим активным объектом или с пассивным объектом, свободно вращаться вокруг единственной оси;
- Spring (Пружина) — привязывает объект к определенной точке сцены, при этом длина ограничителя может циклически изменяться; возможно связывание объекта с точкой в пространстве, с другим активным объектом или с пассивным объектом;
- Barrier (Барьер) — запрещает объектам перемещение за пределы определенной плоскости (столкнувшиеся с барьером объекты могут менять направление своего движения, но никогда не отскакивают от него).
В Maya предусмотрено два типа твердых тел: активные и пассивные. Активные тела (Active Rigid Body) действуют в соответствии с назначенными им динамическими силами и реагируют на столкновения с другими объектами. Пассивные тела (Passive Rigid Body) лишь являются объектами для столкновений с активными телами и никак не реагируют на воздействие полей или удары о них других тел, но зато могут влиять на активные твердые тела. Примером пассивного тела может служить поверхность, с которой сталкиваются активные тела, — то есть упавшая на стол игральная кость будет активным твердым телом, а сам стол — пассивным. Активными телами нельзя управлять через ключевые кадры, пассивными — можно.
Для превращения NURBS-моделей или полигональных поверхностей в пассивные твердые тела достаточно выделить их и воспользоваться командой Soft/RigidBodies=>CreatePassiveRigidBody (Мягкие/Твердые тела=>Создать пассивное твердое тело). Создавать активные твердые тела можно двумя способами: либо применить к исходным геометрическим объектам команду Soft/RigidBodies=>CreateActiveRigidBody (Мягкие/Твердые тела=>Создать активное твердое тело), либо сразу назначить данным объектам требуемые силы и/или ограничители, что приведет к преобразованию каждого из объектов в активное твердое тело и одновременно свяжет их с динамическими силами либо ограничителями. Для того чтобы прекратить существование объектов как твердых тел (например, тогда, когда это уже не требуется), необходимо выделить их и применить команду Edit=>DeletebyType=>RigidBodies (Редактирование=>Удалить в зависимости от типа=>Твердые тела).
Для примера создайте простую сцену из обычной плоскости с шаром (рис. 3). Предположим, что шар очень легкий (пусть это будет теннисный мяч) и потому должен не просто упасть на плоскость (например, на пол), но и несколько раз подпрыгнуть — это означает, что плоскость представляет собой пассивное твердое тело, а шар — активное. Для того чтобы Maya точно воспроизводила симуляцию падения шара под воздействием силы, установите режим воспроизведения каждого кадра, щелкнув на кнопке AnimationPreferences и выбрав в раскрывающемся списке PlaybackSpeed (Скорость воспроизведения) в категории Timeline (Временная шкала) вариант Playeveryframe (Воспроизводить каждый кадр) — рис. 4. Одновременно увеличьте общее число кадров анимации до 300. Превратите шар в активное твердое тело, на которое воздействует сила тяжести, выделив его и назначив ему гравитационную силу при помощи команды Fields=>Gravity (Поля=>Гравитация). На первый взгляд ничего не изменится, но в действительности у шара появится набор динамических атрибутов (рис. 5), управляющих его поведением. Более того, шар окажется уже анимированным, и при проигрывании анимации вы увидите, что он падает и проваливается сквозь плоскость. Теперь превратите плоскость в пассивное твердое тело, выделив ее и применив команду Soft/RigidBodies=>CreatePassiveRigidBody, — после этого плоскость окажется преградой на пути шара, который при падении уже не будет проходить сквозь нее, а отскочит, причем несколько раз с естественным замедлением скорости. Для интереса дополните сцену высоким кубом, чтобы было удобнее наблюдать за перемещениями шара (рис. 6).
Рис. 3. Исходный вид сцены
Рис. 4 Смена режима воспроизведения кадров
Рис. 5. Появление у шара дополнительных атрибутов (данные атрибуты выделены красной рамкой)
Рис. 6. Вид шара в нескольких кадрах анимации
Несколько усложним задачу и попробуем подвесить обладающий гравитационной силой шар в некоторую точку пространства. Для этого выделите шар и назначьте ему ограничитель Nail, воспользовавшись командой Soft/RigidBodies=>CreateNailConstraint (рис. 7). Немного оттяните шар в сторону для того, чтобы он мог начать под воздействием силы тяжести колебаться, и перетащите ограничитель в верхнюю часть куба (как бы подвесив шар на куб) — рис. 8. Увеличьте число кадров анимации до 500 и воспроизведите анимацию — сфера станет раскачиваться на гвозде вперед-назад в одной плоскости наподобие маятника (рис. 9). Увеличьте для шара значения параметра InitialVelocity (Начальная Скорость) по осям X и Z примерно до 5 — и шар будет раскачиваться уже не на плоскости, а в пространстве.
Рис. 7. Появление ограничителя Nail
Рис. 8. Перемещение Nail-ограничителя
Рис. 9. Вид раскачивающейся сферы в некоторых кадрах анимации
Удалите ненужный более Nail-ограничитель и создайте в сцене еще один шар меньшего размера и другого цвета (в нашем случае старый шар имеет зеленый цвет, а новый — красный). Выделите оба шара и свяжите их между собой ограничителем Pin (команда Soft/RigidBodies=>CreatePinConstraint) — рис. 10. Переместите немного Pin-ограничитель вверх и в сторону (рис. 11) — это добавит динамическому движению дополнительный поворот. Запустите анимацию — зеленый шар, падающий под воздействием силы тяжести и имеющий вдобавок начальную скорость, будет стремительно увлекать за собой красный шар, на который ни одно из силовых полей не действует (рис. 12).
Рис. 10. Появление ограничителя Pin
Рис. 11. Перемещение Pin-ограничителя
Рис. 12. Вид падающих шаров в некоторых кадрах анимации
Стоит заметить, что при желании динамические воздействия можно использовать не только для управления перемещением объектов, но и для изменения их формы, правда, не напрямую, а через введение вспомогательных (исключаемых при визуализации) объектов. Рассмотрим простой пример деформации масштабированной NURBS-сферы (рис. 13). Перейдите в режим работы с вершинами (клавиша F9), выделите указанные на рис. 14 вершины и создайте кластер, применив команду Animation=>Deform=>CreateCluster (Анимация=>Деформировать=>Создать кластер). Аналогичную операцию проведите в отношении таких же вершин в нижней части сферы (рис. 15). По замыслу мы хотим сделать так, чтобы кластеры перемещались под воздействием силы Ньютона и соответственно деформировали сферу, однако назначить данную силу непосредственно кластерам нельзя. Поэтому создайте две вспомогательные полигональные сферы и разместите их прямо на кластерах (рис. 16). Сделайте первую сферу родительской для первого кластера, а вторую — для второго (рис. 17). Для этого в окне Outliner нужно при нажатой средней кнопке мыши вначале перетащить первый кластер на первую сферу, а затем второй кластер — на вторую сферу. Либо выделить первый кластер, затем, удерживая нажатой клавишу Shift, выделить первую сферу и выбрать из меню Edit (Правка) команду Parent (Сделать родителем), аналогичную операцию провести для второго кластера и второй сферы. Выделите обе сферы и назначьте им силу Ньютона (команда Fields=>Newton). Скройте сферы (команда Display=> Hide=> Hide Selection), увеличьте число кадров анимацию до 150 и запустите ее проигрывание — сфера немного опадет и начнет колыхаться (рис. 18).
Рис. 13. Исходная сфера
Рис. 14. Выделение вершин
Рис. 15. Появление кластеров
Рис. 16. Появление дополнительных сфер
Рис. 17. Окно Outliner после настройки родительских связей
Рис. 18. Вид колышущейся сферы в нескольких кадрах анимации