3ds Max 2009. Секреты мастерства. Глава: "Анимация движения танковой гусеницы"
Если вы занимаетесь моделированием и анимацией в программе 3ds Max, то, скорее всего, уже хотя бы раз создавали колесную и гусеничную технику. Выполняя модели такого уровня сложности, всегда хочется добавить в них какую-нибудь «изюминку». Таким дополнением может послужить анимация движения. В данном разделе рассмотрим один из способов создания и анимации танковой гусеницы.
Для выполнения упражнения необходимо загрузить начальную сцену track_ start.max с объектами, которые нам понадобятся в работе (рис. 8.64). Она находится на прилагаемом к книге DVD в папке Examples\Глава 08\Track.
Рисунок 8.64. Окно проекции Perspective (Перспектива) после загрузки стартовой сцены
Сначала необходимо построить последовательность гусеничных звеньев. Это можно сделать двумя способами:
- создать длинную цепочку из повторяющихся элементов, а затем деформировать ее по сплайну;
- используя сплайн, анимировать одно звено, а затем создать копии этого звена со смещением: один кадр анимации — одно звено.
Воспользуемся вторым способом для создания статической геометрии, а затем создадим и анимируем звенья танковой гусеницы с помощью сценария. Сначала необходимо вычислить количество копий звена, которые нам понадобятся, а затем анимировать звено гусеницы по сплайну пути. Для этого выполните следующее.
- В окне проекции Top (Сверху) увеличьте масштаб звена гусеницы так, чтобы оно заняло максимально возможную площадь (так будет проще выполнять измерения и они будут точнее).
- Измерьте поперечную ширину звена, исключая размер выступающих шипов (реальный размер, который будут иметь звенья, составленные в цепочку). Для этого воспользуйтесь командой главного меню ToolsMeasure Distance (Инструменты Измерить расстояние). После выполнения команды щелкните на начальной и конечной точках замеряемого участка и на строке состояния. В результате в поле ввода макрокоманды появится необходимая цифра. В моем случае это 3,805 (рис. 8.65).
- Узнайте длину сплайна, который является формой пути для гусеницы. Для этого достаточно выделить сам сплайн и воспользоваться утилитой Measure (Линейка), находящейся на вкладке Utilities (Утилиты) командной панели. В области Shapes (Формы) будет указана длина сплайна (рис. 8.66).
- Разделите длину сплайна на ширину звена, и вы получите необходимое количество копий, а также кадров анимации. Я округлил значение, и в результате у меня получилось 90.
- Измените количество кадров анимации до 90. Для этого нажмите кнопку Time Configuration (Настройка временных интервалов) в правом нижнем углу окна. В открывшемся окне задайте параметру End Time (Время окончания) области Animation (Анимация) значение 90 (рис. 8.67).
Рисунок 8.65. Строка состояния с результатами замера
Рисунок 66 Настройки утилиты Measure (Линейка)
Рисунок 67 Окно Time Configuration (Настройка временных интервалов) с измененным количеством кадров анимации
Для создания анимации сделайте следующее.
- В одном из окон проекций выделите звено.
- Выполните команду AnimationConstraintsPath Constraint (Анимация Ограни-чения Ограничение по пути) и укажите на сплайн track_path. В результате он будет использован в качестве формы пути.
- В свитке Path Parameters (Параметры пути) настроек контроллера установите флажок Follow (Следовать), чтобы объект поворачивался вместе с поворотом кривой. Установите также флажок Allow Upside Down (Разрешить переворачиваться) (по умолчанию контроллер придерживается одной локальной оси, а у нас замкнутая кривая), выберите ось Y и установите флажок Flip (Обратить) (рис. 8.68).
- Выделите звено и создайте его копию. Для этого воспользуйтесь командой главного меню ToolsSnapshot (Инструменты Снимок). В открывшемся одноименном окне установите переключатель в положение Range (Диапазон) и задайте следующие значения параметрам: From (От) — 0, To (До) — 89 и Copies (Копий) — 90. В качестве метода клонирования выберите Instance (Образец) (рис. 8.69).
Рисунок 68 Свиток Path Parameters (Параметры пути) настроек контроллера
Рисунок 69 Настройки создаваемых копий в окне Snapshot (Снимок)
ПРИМЕЧАНИЕ
Значение параметра To (До) равно 89, потому что, выполнив полный круг по замкнутой форме, объект вернется в начальное положение.
Результат клонирования одного звена представлен на рис. 8.70.
Рисунок 70 Копии звеньев, созданные с помощью инструмента Snapshot (Снимок)
Таким же образом строятся и другие статические последовательности объектов, например элементы ограждения, столбы, кнопки и даже ресницы.
Итак, приступим к анимации. Выполнить вручную анимацию такого количества объектов достаточно сложно, даже если речь идет о простом повторении нескольких операций. Все было бы просто, если бы нам пришлось настроить анимацию двух или даже десяти звеньев, но у нас их девяносто. Придется обратиться к макросценарию, который позволит автоматизировать этот процесс. Звучит пугающе, но попробуем все сложности свести к минимуму.
Сохраните и закройте выполненную сцену. Затем загрузите с прилагаемого DVD начальный файл данного упражнения track_start.max из папки Examples\Глава 08\Track.
Программа 3ds Max обладает возможностью отслеживать и записывать почти все команды и действия, выполняемые в процессе работы. Делается это с помощью модуля MAXScript Listener (Интерпретатор MAXScript). Его окно можно открыть, выполнив команду главного меню MAXScriptMAXScript Listener (MAXScriptИн-терпретатор MAXScript) или нажав клавишу F11. Мы используем его в качестве основного источника списка будущих макрокоманд. Но сначала рассмотрим кратко, что нужно сделать для создания анимированной гусеницы.
В первую очередь нам понадобится анимировать имеющееся звено с помощью контроллера Path Constraint (Ограничение по пути). Затем, используя единственный анимированный параметр этого контроллера (процент пути, пройденный звеном гусеницы в пределах анимированного участка), привяжем к нему созданные копии этого объекта, выполнив их относительное смещение. Таким образом, мы получим один родительский объект, который позволит управлять скоростью движения всей гусеницы путем изменения времени прохождения этим объектом полного цикла, иными словами, изменяя время, за которое одно звено гусеницы пройдет полный круг.
Начнем с настройки записи макрокоманд. Откройте окно MAXScript Listener (Интер-претатор MAXScript), для чего используйте либо одноименную команду главного меню MAXScript, либо клавишу F11. В появившемся окне выполните команду меню MacroRecorderEnable (Запись макроса Включить) для включения записи всех производимых команд (рис. 8.71).
Рисунок 8.71 Настройки меню MacroRecorder (Запись макроса)
В результате окно интерпретатора разделится на две части: в верхней будут выводиться макрокоманды, соответствующие выполняемым действиям, а в нижней — отладочная информация. Одновременно нижнее окно является и полем для ввода макрокоманд. Посмотрим, как это все работает. Выделите в окне проекции Top (Сверху) звено гусеницы и копируйте его через буфер обмена (или любым доступным способом) с помощью сочетаний клавиш копирования Ctrl+C и вставки Ctrl+V. В результате в верхней части окна появится запись, состоящая из четырех строк. Для исполнения этого кода откройте окно редактора макрокоманд, выполнив команду главного меню MAXScriptNew Script (MAXScript Создать макрос). В окне отладчика выделите строки, созданные программой автоматически, и перетащите их в окно редактора. Закомментируйте вторую строку, поставив перед ней два минуса, так как она вызывает окно диалога клонирования объекта и нам не нужна (рис. 8.72). Выполните макрос, воспользовавшись командой меню данного окна ToolsEvaluate All (Инструменты Оценить все) и предварительно удалив построенную ранее копию звена. Проверьте список объектов, вызвав его кнопкой Select by Name (Выделить по имени), и убедитесь в том, что макрос создал копию объекта track. Итак, вы написали свой первый макрос (если, конечно, не делали этого ранее) и проверили его исполнение. Дополним его необходимыми командами и напишем полный цикл создания и редактирования новых звеньев.
Рисунок 8.72 Окно редактора макрокоманд
В первую очередь нужно анимировать движение звена по пути и получить эту часть макрокоманды для записи в код. Для этого выполните следующее.
- В одном из окон проекций выделите звено (объект track).
- Перейдите на вкладку Motion (Движение) командной панели и в свитке Assign Controller (Назначить контроллер) выберите строку Position: Position XYZ (Положение: положение по XYZ) (рис. 8.73).
- В этом же свитке щелкните на кнопке Assign Controller (Назначить контроллер) и в появившемся окне Assign Position Controller (Назначить контроллер положения) выберите строку Path Constraint (Ограничение пути) (рис. 8.74)
- В свитке Path Parameters (Параметры пути) щелкните на кнопке Add Path (Добавить путь) и в одном из окон проекции укажите на сплайн пути track_path.
- В этом же свитке в области Path Options (Параметры пути) установите флажки Follow (Следовать) и Allow Upside Down (Разрешить переворачиваться). В области Axis (Оси) выберите ось Y и установите флажок Flip (Обратить). Как вы видите, настройки такие же, как и для построения статических копий звена (см. рис. 8.68).
Рисунок 8.73 Свиток Assign Controller (Назначить контроллер) настроек объекта track
Рисунок 8.73 Окно Assign Position Controller (Назначить контроллер положения)
После выполнения описанных операций откройте окно MAXScript Listener (Интерпретатор MAXScript). Выделите и переместите в окно редактора макрокоманд пять последних строк, относящихся к выбору и настройке контроллера Path Constraint (Ограничение по пути) (рис. 8.75).
Рисунок 8.75 Окно редактора макрокоманд после добавления кода
Если бы мы сейчас запустили на выполнение этот код, то у нас было бы создано еще одно звено, а копии звена с именем track01 был бы присвоен контроллер Path Constraint (Ограничение по пути). Но обратите внимание на то, что когда мы выбирали сплайн пути, интерпретатор не внес соответствующую строку в список выполненных операций. В связи с этим в конец кода необходимо дописать в окне редактора следующую строку: $.pos.controller.path=$track_path.
У контроллера Path Constraint (Ограничения по пути) есть один анимируемый параметр — Percent (Проценты), который определяет проценты пройденного объектом пути. Этому параметру автоматически было задано значение нулевого и последнего кадров анимации. Но нам не нужна анимация, устанавливаемая по умолчанию, мы собираемся привязывать все копируемые объекты к одному звену — track. В связи с этим необходимо удалить сгенерированные автоматически ключи анимации. Это можно сделать, добавив в код еще одну строку — deleteKeys $.pos.control-ler.percent.keys.
ПРИМЕЧАНИЕ
Знак $ указывает на то, что следом за ним должно идти имя объекта, но так как его нет, то подразумевается выделенный объект сцены.
Если сейчас запустить код на исполнение, то мы получим копию объекта track, к которому будет применен контроллер движения вдоль пути track_path, и все ключи анимации будут удалены из контроллера. Далее нужно построить зависимость, при которой созданная копия объекта будет следовать за основным объектом. Для этого необходимо выполнить следующее.
- Выделите в одном из окон проекций или выберите из списка скопированный объект track01.
- Перейдите к свитку Assign Controller (Назначить контроллер) и щелкните на плюсике, расположенном рядом со строкой Position: Path Constraint (Положение: ограничения по пути), после чего щелкните в открывшемся списке на строке Percent: Linear Float (Проценты: линейное значение с плавающей точкой) (рис. 8.76).
- Щелкните на кнопке Assign Controller (Назначить контроллер) и в появившемся окне Assign Float Controller (Назначить контроллер с плавающей точкой) выберите строку Float Script (Сценарий, использующий значения с плавающей точкой).
- Щелкните на кнопке OK — откроется окно для ввода сценария. Закройте это окно.
- Обратитесь к окну MAXScript Listener (Интерпретатор MAXScript), выделите и переместите в окно редактора макрокоманд последнюю строку кода.
Рисунок 8.76 Свиток Assign Controller (Назначить контроллер) настроек объекта track01
То, что мы сейчас сделали, позволило нам записать в окно редактора макрокоманд строку кода, меняющую контроллер, созданный по умолчанию на свой, который можно редактировать с использованием сценария. На рис. 8.77 представлен вид редактора со всеми полученными до настоящего момента командами.
Рисунок 8.77 Окно редактора макрокоманд на данном этапе
Теперь нужно добавить в окно редактора несколько строк, написанных самостоятельно, без помощи окна MAXScript Listener (Интерпретатор MAXScript).
- Добавьте первой строкой for i = 1 to 90 do(. Таким образом мы создаем цикл, выполняющий выражение, которое находится внутри круглых скобок, начиная от 1 до 90. Число 90 — это количество копий звена танковой гусеницы (если помните, мы рассчитали их ранее).
- Удалите закомментированную вторую строку.
- В конце кода допишите следующее выражение: $.pos.controller.per-cent.controller.script =”at time (currenttime) $track.pos.controller.percent*0.01+0.011*”+i as string.
В первой части этого выражения мы обращаемся к контроллеру управления по коду, созданному в предыдущей строке, и присваиваем ему строковое выражение, находящееся в правой части. Это означает следующее. В текущий момент времени (at time (currenttime)) контроллеру выделенного объекта, управляющему процентами ($.pos.controller.percent.control-ler.script), присваиваем значение процентов контроллера объекта track ($track.pos.controller.percent), деленное на 100 (так как на самом деле значение процентов считается не от 0 до 100, а от 0 до 1, то есть используем выражение *0.01), и задаем смещение на одно звено (общие проценты пути, деленные на количество звеньев: 1/90=0.011). Затем это выражение умножаем на порядковый номер (он же номер кадра), который в первой строке присваивается переменной i. Но так как код записывается в виде строковой переменной, числовое значение необходимо вынести за кавычки и обозначить как строковую переменную (i as string), оставив в кавычках знак умножения. Умножение на число i позволит каждому новому звену смещаться на соответствующую величину. - И наконец, две последние строки кода будут указывать на то, что вся анимация до первого ключевого кадра и после последнего будет повторяться, то есть станет непрерывной, вне зависимости от положения ключевых кадров на шкале анимации. Добавьте эти строки:
- setBeforeORT $.pos.controller.percent.controller #cycle
- setAfterORT $.pos.controller.percent.controller #cycle
- Завершает код закрывающая круглая скобка (рис. 8.78).
Рисунок 8.78 Окончательный код в окне редактора макрокоманд
ПРИМЕЧАНИЕ
На DVD в папке Examples\Глава 08\Track находится файл trackScript.ms. Это созданный нами сценарий. Его можно загрузить в окно редактора макрокоманд и выполнить.