Толкаем вверх, тянем вниз
Как анимировать два связанных между собой объекта, один из которых должен двигаться вверх, а другой при этом падать?
Тема:
Динамика.
Используемые техники и инструменты:
Dynamic Constraints (Динамические Ограничения), Gravity (Гравитация), Fire (Огонь), Particle Cloud (Облако Частиц), Expressions if...Else (Условные Выражения).
Мы чувствуем себя легче в воде не из-за уменьшения силы тяготения, а потому, что существует противоположная сила, которая выталкивает нас вверх. Эта плавучесть в действительности обусловливается массой тела и плотностью и объемом вытесненной нашим телом жидкости. Все это может быть симулировано в трехмерной анимации, просто путем использования поля гравитации, работающего в противоположном направлении. Механически соединив два объекта с конфликтующими силовыми полями (одно толкает вверх, другое тянет вниз), мы получим в результате движение настолько сложное, что эту сложность невозможно получить с помощью обычной анимации по ключевым кадрам. В этом уроке мы создадим такую ситуацию и немного насладимся нашей работой, глядя на конфликт полей. Затем подожжем оба объекта, заставим первый объект гореть голубым пламенем, а второй погаснуть, когда он опустится ниже линии горизонта в воду. Создайте два объекта: тор и конус. Расположите их рядом друг с другом. Выделите оба объекта и откройте окно настроек. Нажмите F4, выберите Soft/Rigid Bodies / Create Constraint Option box (Мягкие/Твердые Тела / Создать принудительное согласование Окно Настроек) (рис. 20.1). В выпадающем меню выберите Pin (Булавка) в качестве Constraint Type (Тип принудительного согласования) и выполните команду.
Рис. 20.1. Принудительное согласование объединит тор и конус
-
Переместите немного Pin Constraint (Принудительное согласование Булавка) вверх и в сторону (рис.
20.2). Это добавит движению дополнительный поворот, когда начнется симуляция.
Рис. 20.2. Перед началом симуляции переместите Pin Constraint (Принудительное согласование Булавка) немного вверх и в сторону
Принудительное согласование типа Nail (Гвоздь), кстати, не является альтернативой для Pin Constraint (Принудительное согласование Булавка). Nail (Гвоздь) работает только с одним объектом, как гвоздь в рамке для картины, мы же скрепляем два объекта [Имеется в виду, что Nail Constraint позволяет прикрепить объект к какой-то точке в пространстве, «прибить гвоздем», Pin Constraint позволяет скрепить два объекта друг с другом - Примеч. ред. ]. При воспроизведении анимации на этом этапе вы ничего не увидите, поскольку ни на тор, ни на конус не воздействуют никакие силы.
Выделите тор и добавьте к нему гравитацию. Для этого выберите Fields / Gravity (Поля / Гравитация).При воспроизведении анимации вы увидите, как тор стремительно уносится вниз, увлекая за собой конус, на который не действует ни одно силовое поле (рис. 20.3).
-
Выделите конус и тоже добавьте к нему гравитацию.
Рис. 20.3. Тор падает под влиянием гравитации и тянет за собой в бесконечность конус, на который не действуют никакие поля
-
В окне Channel Box (Окно Каналов) измените значение атрибута Magnitude (Величина) нового поля тяготения с 9,8 на-9,8 (см.
рис. 20.4).
Рис. 20.4. Второе, развернутое в противоположном направлении поле тяготения поднимает конус вверх
Теперь тор продолжает тянуть оба объекта вниз, а конус старается поднять их вверх - в результате мы получаем сложное движение пары (рис. 20.5). Если вы хоть немного усилите одно из полей тяготения, движение потеряет равновесие, и объекты моментально исчезнут из вида, увлекаемые большим силовым полем.
Рис. 20.5. Конус летит вверх, тор вниз. Объединенные с помощью Pin Constraint (Принудительное согласование Булавка), они вынуждены держаться на одном уровне, создавая, таким образом, сложное, но сбалансированное движение
Выделите тор и зажгите его. Для этого выберите Effects /.Create Fire (Эффекты / Создать Огонь). Выделите конус и тоже зажгите его. В окне Channel Box (Окно Каналов) измените значение атрибута Fire Direction Y (Направление Огня по оси Y) для конуса с 1 на -1.Анимация остается прежней, однако мы придали ей особенный шарм (рис. 20.6). Пламя на конусе и торе - в окнах modeling view (окно Моделирования) оно представлено в виде широко разбрасываемых зеленых сфер - горит сверху и снизу объектов, легко следуя их движению, как хвост кометы.
Рис. 20.6. Мы подожгли объекты. При движении огонь создает пылающий хвост
-
В окне Hypershader найдите материал пламени конуса. Его имя particleCloud3.
Номер 3 в имени рarticleCloud3, кстати, обусловлен тем, что в каждой новой сцене Мауа создается шейдер Облака Частиц и он, по умолчанию, имеет имя particleCloudl. В действительности же это второе созданное нами облако частиц [Когда мы применяем эффект огонь, мы, помимо всего прочего, создаем систему частиц типа particle cloud и создаем для нее новый экземпляр шейдера. Поскольку один шейдер (с номером 1) создается автоматически при создании новой сцены, то новые шейдеры (а мы дважды применили эффект огонь и, следовательно, создали два шейдера) будут иметь порядковые номера 2 и 3. - Примеч. ред. ].
-
В окне Attribute Editor (Редактор Атрибутов) для particleCloud 3 найдите атрибуты Color (Цвет) и Incandescence (Самосветимость). К обоим атрибутам присоединены ramp-текстуры. Измените красные цвета текстуры на голубые (рис.
20.7).
Рис. 20.7. Изменяем цвет пылающего хвоста конуса с оранжевого на голубой
Теперь конус сопровождается красивым хвостом из голубого огня (см. рис. 20.8).
Наконец, введя три строки программного кода, мы добавим еще один штрих, погашая пламя тора, когда он опускается ниже линии горизонта. Для того чтобы адекватно записать уравнение, вам нужно знать точное имя объекта. Его вы увидите, щелкнув по объекту мышкой, а также в окне Channel Box (Окно Каналов): nurbsTorml.
Выделите огонь тора и откройте для него Attribute Editor (Редактор Атрибутов) (см. рис. 20.9). Щелкните мышкой по вкладке emitterl и найдите поле Rate (Particle/Sec).Этот атрибут определяет, сколько частиц пламени вылетит из конуса в единицу времени. Значение атрибута по умолчанию запрограммировано в эффекте огня.
Рис. 20.8. Отрендеренное изображение в кадре 100
Рис. 20.9. Emission Rate (Интенсивность Испускания) огня - это атрибут источника частиц
-
Щелкните правой кнопкой мыши по атрибуту Emission Rate (Интенсивность Испускания), для того чтобы открыть Expression Editor (Редактор Выражений).
Здесь вы увидите несколько строк программы, которые определяют динамику выброса огня. Мы не будем менять эти сложные выражения, а просто кое-что добавим в самом их начале. Наше добавление изменит интенсивность испускания огня до нуля, когда тор погрузится ниже линии горизонта (когда значение его атрибута Translate Y (Значение перемещения по оси Y) будет меньше нуля).
Для записи новых строчек вам нужно знать полные имена для значений перемещения по оси Y и интенсивности испускания. Значение перемещения по оси Y объекта nurbsTorusl - nurbsTorusl.translateY. Полное имя для интенсивности испускания вы можете найти в первой строке уже существующего выражения; это emitter!.rate.
-
Добавьте следующие три строки перед уже существующими выражениями (рис.
20.10). Не забудьте о точке с запятой:
if (nurbsTorusl.translateY < 0)
emitterl.rate = 0;
else.
Рис. 20.10. Три новые строки программного кода в окне Expression Editor (Редактор Выражений) погасят пламя тора, когда тот опустится ниже линии горизонта. Когда он снова поднимется, введенные строки уже не будут к нему применяться, и пламя зажжется снова
-
С этого места выражение продолжится исходным кодом. Введите изменения, нажав кнопку Edit (Редактирование).
В примерном переводе эти строки означают для MAYA следующее: «Если значение атрибута Translate Y (значение перемещения по оси Y) меньше нуля, убавьте интенсивность испускания до нуля; в противном случае делайте то, что вы обычно делаете».
Теперь, при воспроизведении анимации, хвост пламени оторвется от тора, как только тор опускается слишком низко, и появится снова, как только тор поднимается над горизонтом (рис. 20.11).
Рис. 20.11. Пылающий хвост отрывается от тора, как только тор опускается слишком низко. Слева - изображение, полученное в результате рендеринга с помощью полупрозрачной Checkerboard (Шахматная доска), служащей поверхностью горизонта
А теперь кое-что новенькое. Приходилось ли вам выделять камеру, используя меню View (Вид)?