Дмитрий Синявин                                                Цепи обратной кинематики


Введение

Обратная кинематика (IK, inverse kinematics) – метод анимации моделей, реализованный на данный момент в большинстве популярных пакетов 3D-моделирования. Он используется при создании движения как в простейших, так и в сложных иерархических моделях, в том числе в биподах. В чем же заключается метод обратной кинематики? Обратимся к глоссарию 3D Studio MAX:

«Обратная кинематика – метод позиционирования и анимации, построенный на основе иерархической линковки. Чтобы понять, как работает IK, нужно понимать принципы иерархического соединения и прямой кинематики. Создание цепи обратной кинематики начинается с линковки и размещения опорных точек (pivot), а затем вводятся следующие принципы:

В связи с этими ограничениями, IK требует тщательного планирования структуры иерархии и размещения опорных точек. Там, где при создании цепи прямой кинематики может быть множество различных решений, имеется лишь несколько хороших решений для IK. Выбор лучшего из этих решений зависит от структуры иерархии и от того, как эта иерархия будет анимирована. Однако на этапе создания движения обратная кинематика намного проще в обращении, чем прямая, и вы можете быстро создавать сложные движения; но в этом случае вы передаете часть управления движением автоматизированным функциям IK.»

Основные понятия

Итак, цепь обратной кинематики – это иерархия, где взаимодействие между объектами осуществляется «снизу вверх», от дочернего объекта к родительскому. Для примера возьмем классический бипод – модель человека. Если перемещать в пространстве туловище (родительский объект), вместе с ним будут перемещаться руки, ноги и голова (дочерние объекты) – это цепь прямой кинематики, где воздействие на родительский объект влияет на его дочерние объекты. Однако, если в этом биподе реализована цепь обратной кинематики – перемещение в пространстве кисти руки «потянет» за собой руку, предплечье и туловище – здесь видна иерархическая структура, в которой дочерний объект может влиять на своего родителя. Для понимания структуры и объектной модели обратной кинематики необходимо ввести еще несколько понятий:

Итак, уяснив основные понятия, связанные с обратной кинематикой и поняв схему ее работы, мы можем приступить к созданию простейшей цепи обратной кинематики.

Инструментарий

Для создание цепи IK нам понадобятся:

Определение несущих и расстановка опорных точек

Первое, что мы должны сделать для того, чтобы наша IK-цепь функционировала правильно – определить несущие, т.е. те объекты, которые будут «тянуть» за собой «навесные» конструкции. Руководствуясь элементарной логикой, в качестве несущих обычно выбирают осевые конструкции, и исключений из этого правила практически нет.

Развернем левый вид робота на весь экран (клавиша «W») и увеличим ногу – это основная часть конструкции, которая будет управляться обратной кинематикой:


На этом скриншоте выделены те конструкции левой ноги, которые будут использованы нами как несущие (LeftUpperLegCarrier – верхняя осевая и LeftLowerLegCarrier – нижняя осевая). Стопа и пальцы робота монолитны, не имеют навесных конструкций, и, следовательно, сами по себе являются несущими.

Теперь мы можем прикрепить навесные конструкции к несущим при помощи команды Link (кнопка ). Прикрепим LeftLegOuterShield и LeftLegInnerShield к LeftLowerLegCarrier, а LeftLegUpperShield – к LeftUpperLegCarrier. Повторим все прикрепления для правой ноги робота. Проверить правильность сделанных соединений мы можем при помощи традиционного TrackView, а можем воспользоваться новой возможностью, появившейся в MAX R3 – Schematic View:


Теперь мы должны расставить опорные точки несущих конструкций. Начнем с корня иерархии – с LeftUpperLegCarrier. На панели Hierarchy во вкладке Pivot включим опцию
Affects Pivot Only:


Это дает нам возможность управлять опорной точкой, не затрагивая сам объект. Используя левый вид, переместим опорную точку выбранного нами объекта в точку, вокруг которой будет происходить вращение ноги:


Так же поступим с LeftLowerLegCarrier, переместив его опорную точку в центр коленного сустава робота. Сейчас мы проектируем цепь обратной кинематики, которая будет работать в одной плоскости, поэтому положение опорной точки в других видах (верхнем и фронтальном) особого значения не имеет. Определим, как будут вращаться стопа относительно ноги и пальцы относительно стопы и расставим опорные точки объектов LeftFoot, LeftFinger1, LeftFinger2 и LeftFinger3. Затем проделаем те же операции для правой ноги.

Теперь все готово для создания костной структуры, определяющей работу цепи IK.

 

Создание и настройка костной структуры

В 3D Studio MAX предусмотрена специальная система, позволяющая создавать цепи IK – система «костей» (Bones). Кнопка, позволяющая создать ее, находится на вкладке Create в разделе Systems. Нажмем кнопку Bones:


В параметрах настройки системы снимем флажок «Create End Effector» (создать конечный эффектор) – для наглядности и лучшего понимания механики IK мы позже создадим конечные эффекторы вручную. Установим флажок «Assign To Root» (присвоить IK-контроллер корневой кости) – наша цепь IK не будет замыкаться на корневой кости, как это часто бывает, поэтому корневой кости тоже нужно присвоить IK-контроллер. Оставим включенным флажок «Assign To Children» (присвоить IK-контроллер дочерним костям) – дочерние кости всегда должны иметь IK-контроллер.

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

 

После создания костной структуры приступим к установке ее параметров.

Снова раскроем левый вид на весь экран. Затем выберем любое из сочленений и на панели Motion (движение) установим флажок Show Initial State – показывать исходную позицию. Таким образом мы сможем контролировать пределы угла вращения визуально.

Выберем корневую кость (Bone01) и перейдем к панели Hierarchy, вкладка IK. На свитке Rotational Joints (вращательные сочленения) мы видим установленный флажок X Axis. Это означает, что данное сочленение можно приводить во вращение в плоскости X. Снятые флажки Y Axis и Z Axis запрещают вращение в соответствующих плоскостях.

Займемся пунктом X Axis. Пока не установлен флажок Limited (ограничение), сочленение можно вращать на все 360 градусов. Однако нога робота не должна обладать такой возможностью, поэтому мы устанавливаем флажок Limited и выставляем значение пределов вращения в полях From и To («от» и «до»). Легче всего делать это увеличивая и уменьшая значения при помощи мыши и стрелочек вверх и вниз, расположенных справа от поля ввода – тогда текущее состояние сочленения будет сразу отображаться в активном виде, и пределы можно контролировать визуально. У меня получились пределы от 34 до –71, у вас могут быть другие – главное, чтобы это были величины, ограничивающие движения, которые невозможны механически (например, установив нижний предел в –140, мы получим именно такую ситуацию – нога войдет в тело робота). Остальные параметры соединения – простор для фантазии. Соединение можно сделать плавным (флажок Ease, обычно применяется для анимации «мягких» моделей), можно задать обратную тягу (флажок Spring Back и поле редактирования рядом – сила обратной тяги, а также поле «Spring Tension» - насколько быстро соединение возвращается в исходную позицию), а можно поставить сопротивление (Damping), если создается соединение с большой нагрузкой или силой трения. Поэкспериментировав с этими значениями после завершения создания цепи, можно получить интересные результаты.

Далее произведем расстановку пределов для остальных сочленений. В конечном итоге получается что-то вроде этого:


Можно приступать к созданию элементов управления цепью IK.

 

Создание конечных эффекторов и управляющих объектов-пустышек

Теперь мы должны создать несколько объектов-пустышек, которые помогут нам управлять цепью IK.

Во-первых, это корневая кость, Root Bone. Обычно корневую кость помещают в тело. Создадим пустышку (Dummy) внутри тела робота – размеры пустышки не имеют никакого значения. Еще одна пустышка нужна нам как родительский объект конечного эффектора. Создадим пустышку в области левой стопы робота и при помощи Non-uniform Scaling зададим ей такой размер, чтобы она вмещала в себя всю стопу:


Прикрепим самое верхнее сочленение иерархии (Bone01) к корневой кости (большому объекту-пустышке) при помощи обычной линковки. Так же поступим с телом робота (объект «Body»), присоединив его к объекту-пустышке.

Стопа будет соединена со своим объектом-пустышкой иным путем.

Для начала создадим конечные эффекторы. Для этого нужно решить, какие сочленения будут непосредственно реагировать на движение пустышки. Мы выберем для этого все сочленения, составляющие стопу (в том числе и «голеностопный сустав»). Для каждого из этих сочленений проделаем следующую последовательность действий:

Вот что получится в конце:


Проделаем то же для оставшихся сочленений. Теперь мы создали для каждого из них конечные эффекторы и прикрепили их все к объекту-пустышке.

Пришло время проверить, как работает наша цепь IK.

Проверка цепи IK и линковка несущих объектов

Выбрав любое сочленение, на панели Motion снимем ранее установленный флажок Show Initial State. Если этого не сделать, костная структура всегда будет оставаться в своем первоначальном состоянии, и движения не получится. Затем нажмем кнопку IK (). При нажатой кнопке IK сочленения двигаются по законам обратной кинематики, поэтому, если нужно просто переместить сочленение без пересчета позиции остальных сочленений, кнопку нужно отжать.

Теперь попробуем переместить объект-пустышку стопы в плоскости левого вида вправо и влево, вверх и вниз. Да, именно так работает цепь обратной кинематики! Безо всяких усилий, простым перемещением объекта-пустышки мы получаем сложное движение, в котором участвуют 9 сочленений! Остался лишь последний шаг – это линковка сочленений к несущим, однако сначала нужно сделать еще кое-что.

В верхнем виде выделим всю костную систему и объект-пустышку для стопы. Нажмем кнопку Mirror (отразить). В разделе Clone Selection поставим Copy, чтобы отразилась не сама уже существующая цепь IK, а ее копия. Также установим флажок «Mirror IK Limits», чтобы корректно отразить пределы IK-сочленений. Затем, не забыв отжать кнопку IK, переместим отраженную цепь на другую ногу робота:


Можно снова включить кнопку IK. Теперь у нас есть IK-цепи для обеих ног, и мы можем приступать к линковке несущих.

Цель этой процедуры – при помощи обычного Link’а соединить несущие с соответствующими суставами. Начнем с верха иерархии и соединим LeftUpperLegCarrier с верхней костью системы – Bone01. Присоединим к соответствующим суставам LeftLowerLegCarrier, LeftFoot, LeftFinger1, LeftFinger2, LeftFinger3. Повторим эти процедуры для правой ноги робота.

Попробуем подвигать объектами-пустышками. Теперь вместе с костной структурой двигаются и конструкции ног робота – можно приступать к анимации.

Анимация IK-цепей и блочные контроллеры

Подготовим робота к его первому шагу: одна нога выставлена вперед, туловище посередине:


Итак, пришла пора нажать кнопку Animate.

Переведем скроллер на 15 кадр. Нога, выставленная вперед на нулевом кадре, остается на месте. Вторую ногу робота переместим так, чтобы она по оси Y сравнялась с первой, но была немного выше по Z. Туловище выровняем над ними:


30-й кадр будет похож на нулевой, но вперед будет выставлена уже другая нога:


Сделаем еще половину шага с ключом на 45-м кадре: 30-й кадр будет похож на нулевой, но вперед будет выставлена уже другая нога:


И, наконец, завершим шаг ключом на 60-м кадре:


Итак, мы получили полный шаг робота. Что можно сделать, чтобы не копировать ключи, как это делалось до MAX R3?

Помимо других новых возможностей, в MAX R3 появились блочные контроллеры. Сейчас мы создадим блочный контроллер шага робота. Для этого откроем TrackView, перейдем в World->GlobalTracks->Block Control, выберем Available, ажмем кнопку Assign Controller (), и присвоим контроллер Master Block – единственно возможный вариант для блочного контроллера.


Правой кнопкой мыши щелкнем на широком белом поле в правой части TrackView напротив контроллера MasterBlock. В появившемся меню выберем Properties. Появится окно редактирования блочных контроллеров. Нажмем Add и добавим в блочный контроллер все перемещения робота с 0 по 60 кадры:


Нажмем ОК и дадим имя новому контроллеру, например, RobotStep, и зададим временной промежуток:


Теперь у нас есть контроллер RobotStep, содержащий сведения о движении робота в течение одного шага. Чтобы воспользоваться им, снова щелкнем правой кнопкой мыши в TrackView на треке напротив MasterBlock и в появившемся меню выберем RobotStep. Переместим появившийся контроллер на 60-й кадр:


Нажмем кнопку воспроизведения () и посмотрим, что получилось

Заключение

Анимирование механических моделей – не единственная задача обратной кинематики. IK применяется также при анимировании мягких моделей и в трехмерной мультипликации. Возможности IK практически безграничны, и, к сожалению, о них трудно рассказать в одной небольшой статье, однако поняв принцип функционирования IK, разобраться в остальных возможностях ее применения не составит большого труда.

24 октября 2000 г.

 

Hosted by uCoz