Анимация движения танковой гусеницы
Владимир Верстак
Часть первая Если вы занимаетесь моделированием и анимацией в программе 3 ds max , то вас навряд ли обошла стороной такая тема как моделирование колесной и гусеничной техники. Создавая модели такого уровня сложности, всегда хочется добавить еще какую-нибудь «изюминку» к выполненной работе. Таким дополнением может послужить анимация движения. В настоящем упражнении мы рассмотрим один из способов создания и анимации танковой гусеницы. СОВЕТ Если вы испытываете определенные трудности в работе с анимацией, я рекомендовал бы вначале обратиться к уроку "Следование камеры за объектом сцены", который описывает некоторые основы анимации движения объектов по пути. Для выполнения упражнения необходимо создать начальную сцену, с объектами, которые нам понадобятся в работе. В первую очередь это будет сплайн пути, по которому построятся звенья гусеницы, одно звено и колеса (можно все заменить условными объектами). После создания объектов, сцена должна выглядеть как на рисунке 1. ПРИМЕЧАНИЕ Урок писался специально для книги, в составе которой имеется файл урока, в связи с этим некоторые объекты и ссылки имеют конкретные имена, кторые у вас могут отличаться. рис. 1
Первым делом сохраните копию начальной сцены- она нам понадобится для выполнения анимации. Итак, у нас есть все, что необходимо для создания и анимации гусеницы. Первое, с чего необходимо начать, это построить последовательность гусеничных звеньев. Сделать это можно двумя способами:
Воспользуемся вторым способом, для создания статической геометрии, а затем выполним создание и анимацию звеньев танковой гусеницы с помощью скрипта. Но прежде всего необходимо рассчитать количество копий звена, которые нам понадобятся, а затем анимировать звено гусеницы по сплайну пути. Для этого выполните следующее:
рис. 2
ПРИМЕЧАНИЕ Если в свитке Utilities (Сервис) нет кнопки с именем Measure (Линейка), она может находиться в списке утилит, доступных по нажатию на кнопку More (Дополнительно). рис. 3
рис. 4
Начнем с анимации, и для ее построения выполните следующее:
рис. 5
рис. 6
ПРИМЕЧАНИЕ Значение поля To (До) равное 89 объясняется тем, что выполнив полный круг в замкнутой форме объект вернется в начальное положение. Полученный результат клонирования одного звена представлен на рисунке (рис. 7). рис. 7
Таким образом строятся статические последовательности цепочки объектов, которые могут быть не только танковыми гусеницами, но и чем-то другим, например элементами ограждения, столбами, кнопками и даже ресницами (урок по созданию ресниц, методом клонирования можно найти здесь). Но вернемся к анимации. Выполнить вручную анимацию такого количества объектов достаточно сложно, даже если речь идет о простом повторении нескольких операций. Все было бы значительно проще, если бы нам пришлось настроить анимацию двух, или даже десяти звеньев, но у нас их 90. Придется обратиться к макроскрипту, который позволит автоматизировать этот процесс. Звучит пугающе, но попробуем все сложности свести к минимуму. Сохраните под новым именем и закройте выполненную сцену, а затем вернитесь к начальной сцене, которую вы должны были сохранить в самом начале урока. Наверное, ни для кого не секрет, что программа 3 ds max обладает возможностью отслеживать и записывать почти все команды и действия, выполняемые в процессе работы. Делается это при помощи модуля MAXScript Listner (Интерпретатор MAXScript ), вызвать который можно из главного меню или с использованием клавиши быстрого доступа F11. Для нас эта возможность окажется основным источником списка будущих макрокоманд. Но прежде чем что-то делать, давайте обратимся к рассмотрению последовательности шагов, которые нам необходимо будет выполнить на пути создания анимированной гусеницы. В первую очередь нам понадобится при помощи контроллера Path Constraint (Ограничения по пути) анимировать имеющееся звено. Затем, используя единственный анимированный параметр этого контроллера - процент пути, пройденный звеном гусеницы в пределах анимированного участка, привяжем к нему созданные копии этого объекта, выполнив их относительное смещение. Таким образом, мы получим один родительский объект, который позволит управлять скоростью движения всей гусеницы путем изменения значения времени прохождения этого объекта полного цикла. Иными словами, изменяя время, за которое одно звено гусеницы пройдет полный круг. Давайте перейдем от теории к практике. Начнем с настройки записи макрокоманд. Вызовите окно диалога MAXScript Listner (Интерпретатор MAXScript ), для чего используйте либо одноименную команду главного меню либо клавишу быстрого доступа F11 . В меню открывшегося окна MacroRecoder (Запись макроса) щелкните на строке Enable (Включить) для включения записи всех выполняемых команд (рис. 8). рис. 8
Окно интерпретатора разделено на две части: в верхней выводятся макрокоманды, соответствующие выполняемым действиям, а в нижней отладочная информация. Одновременно нижнее окно является и полем для ввода макрокоманд. Давайте посмотрим как это все работает. Выделите в сцене звено гусеницы и выполните его копирование через буфер обмена (или любым доступным способом) с помощью клавиш быстрого доступа Ctrl+с и вставки Ctrl+v. В результате выполненных действий в верхней части окна появится запись, состоящая из трех строк. Для исполнения этого кода откройте окно редактора макрокоманд, для чего выполните из главного меню команду MAXScript>New Script ( MAXScript>Создать макрос). В окне отладчика выделите строки, созданные программой автоматически и перетащите их в окно редактора. Закомментируйте вторую строку, поставив перед ней два знака «минус» (она вызывает окно диалога клонирования объекта и нам не нужна) (рис. 9) и выполните макрос, воспользовавшись командой меню окна диалога File>Evaluate All (Файл>Оценить все), предварительно удалив уже построенную копию звена. Проверьте список объектов, вызвав его кнопкой Select By Name (Выделить по имени) и убедитесь в том, что макрос создал копию объекта track. рис. 9
Итак, вы написали свой первый макрос (если не делали этого ранее) и проверили его исполнение. Давайте дополним его необходимыми командами и создадим полный цикл создания и редактирования новых звеньев. В первую очередь нам необходимо выполнить анимацию существующего звена по пути и получить эту часть макрокоманды для записи в наш код. Для этого необходимо выполнить следующее:
рис. 10
рис. 11
После выполнения описанных выше операций, обратитесь к окну диалога MAXScript Listner (Интерпретатор MAXScript ), выделите и переместите в окно редактора макрокоманд пять последних строк, относящихся к выбору и настройке контроллера Path Constraint (Ограничения по пути) (рис. 12). рис. 12
Часть вторая Если бы мы сейчас запустили на выполнение этот код, то у нас было бы создано еще одно звено и присвоен копии звена с именем track01 контроллер Path Constraint (Ограничения по пути). Но обратите внимание на то, что когда мы выбирали сплайн пути, интерпретатор не внес соответствующую строку в список выполненных операций. В связи с этим, необходимо дописать в окно редактора следующую строку: $.pos.controller.path=$track_path . Как уже говорилось ранее, у контроллера Path Constraint (Ограничения по пути) есть один анимируемый параметр - Percent (Проценты). Это проценты пройденного объектом пути, и они автоматически установились в нулевом и последнем кадре анимации. Но нам не нужна анимация, устанавливаемая по умолчанию, мы собирается все копируемые объекты привязывать к одному звену - track . В связи с этим нам необходимо удалить сгенерированные автоматически ключи анимации. Это можно сделать, добавив в код еще одну строку - deleteKeys $. pos . controller . percent . keys . ПРИМЕЧАНИЕ Обратите внимание на то, что вначале всех строк стоит знак $ и далее идет точка. Этот знак указывает на то, что следом за ним должно идти имя объекта, но т.к. его нет, то подразумевается выделенный объект сцены. Если сейчас запустить код на исполнение, то мы получим копию объекта track, к которому будет применен контроллер движения вдоль пути track_path и все ключи анимации будут из контроллера удалены. Далее нужно построить зависимость, при которой созданная копия объекта будет следовать за основным объектом. Для этого необходимо выполнить следующие операции:
рис. 13
То, что мы сейчас сделали, позволило нам записать в окно редактора макрокоманд строку кода, меняющую контроллер, созданный по умолчанию на свой, который можно редактировать с использованием скрипта. Ниже, на рисунке 14, представлен вид редактора, со всеми полученными до настоящего момента командами. рис. 14
Пришло время добавить в редактор несколько строк, написанных самостоятельно, без помощи окна диалога MAXScript Listner (Интерпретатор MAXScript ). Начнем с самого начала.
next_track=copy $track select next_track
В первой части этого выражения мы обращаемся к скрипт-сонтроллеру, созданному в предыдущей строке и присваиваем ему строковое выражение, находящееся в правой части. Что же оно означает? А означает оно следующее: в текущий момент времени ( at time ( currenttime ) ) присвоить контроллеру выделенного объекта, управляющему процентами ( $. pos . controller . percent . controller . script ), значение процентов контроллера объекта track ( $ track . pos . controller . percent ) деленное на 100, т.к. на самом деле значение процентов считается не от нуля до ста, а от нуля до единицы (иначе говоря, *0.01 ) и прибавляем смещение на одно звено (общие проценты пути, деленные на количество звеньев: 1/90=0.011 ). Далее все значение, расположенное в правой части умножаем на порядковый номер (он же номер кадра), который в первой строке присваивается переменной i . Но, так как код записывается в виде строковой переменной, числовое значение необходимо вынести за кавычки и обозначить его как строковую переменную ( i as string ), оставив в кавычках знак умножения. Умножение на число i позволит каждому новому звену смещаться на соответствующую величину.
setBeforeORT $.pos.controller.percent.controller #cycle setAfterORT $.pos.controller.percent.controller #cycle
рис. 15
Код готов, но прежде чем запускать его, необходимо выполнить некоторую подготовительную работу. Начнем с того, что сместим правый ключ анимации объекта track до 400-го кадра анимации (а можно и дальше). Чем выше будет значение времени этого ключа, тем медленнее будет двигаться гусеница танка, притом, что ускорить ее движение можно будет за счет перемещение этого же ключа к началу временного диапазона. ВНИМАНИЕ Должен обратить ваше внимание на то, что минимальное значение скорости должно устанавливаться сразу, так как регулировка скорости в дальнейшем возможна будет только в сторону увеличения. Установите общее число кадров анимации в 400, для чего откройте окно диалога Time Configuration (Настройка временных интервалов) и в поле End Time (Время окончания) введите значение 400. После этого в одном из окон проекций выделите объект track и передвиньте ключевой кадр из 100-го, созданного по умолчанию в 400-ый. СОВЕТ Быстрым способом изменения временного диапазона шкалы может служить комбинация клавиш быстрого доступа Ctrl + Alt в сочетании нажатием и удержанием правой кнопки мыши на шкале анимации. Перемещение курсора влево или право позволит либо уменьшать, либо увеличивать временной диапазон анимации. Нажатие этих же клавиш в сочетании с левой кнопкой мыши позволяет изменять начало временного диапазона, установленное по умолчанию в ноль. И последнее, что необходимо сделать - это установить зацикливание для анимации нашего главного звена. Для этого необходимо выделить объект track и открыть окно редактора кривых. Чтобы сделать это выполните из главного меню команду Graph Editors>Track View - Curve Editor (Редакторы графов>Просмотр треков-Редактирование кривых), в результате откроется окно редактора кривых, в левой части которого необходимо выбрать анимированный трек для выделенного объекта (рис. 16). рис. 16
В окне редактора кривых щелкните на кнопке Parameter Curve Out - of - Range Types (Типы экстраполяции параметрических кривых) , в результате чего откроется окно диалога Param Curves Out - of - Range Types (Типы экстраполяции параметрических кривых). В этом окне щелкните на кнопках со стрелками под значком Cycle (Циклический) (рис. 17). рис. 17
Все готово к выполнению скрипта. Очистите сцену от созданных в процессе экспериментов с кодированием объектов и запустите скрипт на выполнение. В результате будет создано 90 копий звена гусеницы, распределенных по всей длине сплайна. Запустите воспроизведение анимации и убедитесь в том, что анимация работает и вся гусеница движется по сплайну. ПРИМЕЧАНИЕ Хочу напомнить о том, что основной объект с именем track имеет два ключа анимации соответствующих положению нуля и ста процентам пройденного пути. Если изменять на временной шкале положение ключа, имеющего значение 100 процентов, будет происходить изменение скорости движения. Например, передвинув ключ анимации с 400-го на 200-ый вы увеличите скорость движения гусеницы в два раза. Продолжим построение анимации и выполним анимацию вращательного движения колес, по которым движется гусеница. Если представить себе вращение колеса в зависимости от движения гусеницы, то можно сказать, что колесо выполнит столько оборотов за один оборот гусеницы, сколько в длине сплайна укладывается длин окружностей колеса. Давайте попробуем разобраться в этом на практике. Первым делом узнаем диаметр колеса. Для этого необходимо выделить большое колесо и во вкладке Utilities (Сервис) командной панели щелкнуть на кнопке Measure (Линейка). В группе Dimensions (Размеры), посмотрите размер колеса по осям Y и Z . Таким образом, значение диаметра колеса будет составлять в нашем случае 16.693 . ПРИМЕЧАНИЕ Как уже упоминалось выше, если в свитке Utilities (Сервис) нет кнопки с именем Measure (Линейка), она может находиться в списке утилит, доступных по нажатию на кнопку More (Дополнительно). Как все мы помним из математики, окружность составляет 2pi*R или pi*D , где число pi постоянная величина, а D наш диаметр колеса. Таким образом длина окружности большого колеса равна 3.14 * 16.69=52.4066 . Разделив длину сплайна пути track_path на полученную величину, узнаем сколько оборотов сделает колесо за один оборот гусеницы: 344.721/52.4066=6.578 . Осталось только привязать вращение колеса к скорости движения гусеницы. Сделать это можно еще раз воспользовавшись анимацией процентов пройденного пути. ПРИМЕЧАНИЕ Выполнив зависимость вращения колеса от пройденного главным звеном ( track ) пути, мы оставляем за собой возможность изменения скорости не только движения гусеницы, но и вращения колес. Для анимации колеса обратимся к вкладке Motion (Движение) панели управления.
рис. 18
рис. 19
В нижней части окна диалога щелкните на кнопке Assign to Controller (Назначить контроллеру) и в появившемся окне диалога Track View Pick (Выбрать трек) выберите объект с именем Track и, раскрыв его списки параметров, активизируйте строку Percent : Linear Float (Проценты: Линейное значение с плавающей точкой) (рис. 20) рис. 20
Давайте вернемся немного назад и разберемся в том, какое выражение было записано в окне функции. Необходимо отметить, что программа 3 ds max рассчитывает все повороты в радианах, а мы привыкли оперировать градусами. Этим вызвана первая запись - degToRad () . Выражение в скобках не что иное, как угол поворота колеса в градусах. Складывается он из количества оборотов колеса на один оборот гусеницы, рассчитанный нами ранее ( 6.578 ), умноженное на 360 градусов (не что иное как один полный оборот в градусах) и умноженное на процент пройденного пути, который мы получаем от объекта track с использованием созданной нами переменной pathPerc . Сейчас, когда одно колесо анимировано, можно связать эту анимацию с остальными колесами. Сделать это просто, если воспользоваться окном диалога Parameter Wire Dialog (Окно диалога параметров связей). Для этого выполните следующие действия:
рис. 21
Для меньших колес, расположенных в верхней части гусеницы, необходимо изменить выражение, записываемое в поле Expression for Y _ Rotation (Функция для поворота по оси Y ) на следующее: Y_Rotation+degToRad((7.379-6.578)*360) (рис. 22). Это выражение означает, что угол поворота по оси Y малого колеса будет равняться углу поворота большого колеса плюс угол, который получился из разницы количества оборотов большого и малого колеса помноженного на 360 градусов. Количество оборотов малого колеса считается по той же формуле, что и для большого, т.е. длина пути делится на длину окружности колеса. рис. 22
Выше мы рассмотрели создание и анимацию движения танковой гусеницы и ее колес. Ну и чтобы уж совсем закончить с анимацией, было бы правильно рассмотреть и то, как анимировать гусеницу, повторяющую неровности дороги. Сделать это можно за счет управления положением вершин сплайна пути track_path , привязанным к колесам. Для этого выполните следующее:
рис. 23
ВНИМАНИЕ Сбросить преобразования необходимо не только для этого, но и для последующих прямоугольников, которые будут управлять положением вершин и колес. Необходимость применения этой утилиты вызвана тем, что профиль колеса в моем случае строился в окне проекции Front (Спереди), а прямоугольник в окне проекции Left (Слева) . Следовательно, эти два объекта имеют разные локальные системы координат, что вызовет изменение положения колеса при его связывании с прямоугольником.
рис. 24
рис. 25
Далее необходимо выполнить такие же привязки для всех остальных колес. Отличие состоит лишь в том, что для выбора необходимых вершин применяется модификатор Spline Select (Выбор сплайна) или Edit Spline (Редактирование сплайна). Давайте рассмотрим пример привязки следующего колеса. рис. 26
рис. 27
Сейчас, когда всем необходимым объектам назначена анимация, можно переходить к ее тонкой настройке, включая скорость движения, положение в пространстве и т. д., а затем выполнить визуализацию. По этой ссылке можно скачать архив (980 kb) с видеороликом к данному уроку.
Страница сайта http://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=6430 |