3D Studio MAX: первые шаги. Урок 22. Инверсная кинематика
Управление вращением и перемещением объектов
Настройка пределов ограничений
Анимация объектов при обратной кинематике
Примеры моделирования и анимации объектов с учетом инверсной кинематики
Назначение приоритетов
Управлять связями можно не только через Joint-параметры, но и путем назначения им приоритетов (параметр Precedence). Данный параметр управляет процессом распространения совокупного движения между связями: на связи с большим приоритетом приходится большая доля общего движения, на связи с меньшим приоритетом — меньшая. При этом абсолютное значение приоритета связи роли не играет — важно лишь превышение одного приоритета над другим. По умолчанию приоритет у всех связей одинаков и равен нулю. Это приводит к тому, что связи, находящиеся ближе к конечному эффектору, перемещаются больше, нежели удаленные от него связи. Устанавливаются приоритеты в свитке ObjectParameters (панель Hierarchy, закладка IK) — либо вручную в поле Precedence, либо автоматически с помощью кнопок Child->Parent и Parent->Child (рис. 24).
Рис. 24. Опции регулирования приоритетов
При ручном вводе приоритет задается для каждого из объектов по отдельности, а в случае автоматического ввода приоритеты чаще всего устанавливаются сразу для всей иерархической цепочки. Вариант Child->Parent обеспечивает присваивание связям приоритетов, уменьшающихся от дочернего объекта к родительскому. В итоге объекты, находящиеся ближе к конечному эффектору, передвигаются больше, нежели удаленные от него. Вариант Parent->Child приводит к противоположным результатам, так как назначает связям приоритеты, увеличивающиеся от дочернего объекта к родительскому. Чтобы убедиться в этом, откройте сохраненный ранее на диске файл с булавой, выделите все элементы сцены и клонируйте их, а затем переместите скопированную булаву вправо (рис. 25). Выделите все объекты первой булавы и установите для них приоритеты, щелкнув на кнопке Child->Parent. А затем выделите все элементы второй булавы и установите для них приоритеты, щелкнув на кнопке Parent->Child. Перетащите влево конечный эффектор (объект Hedra01) у первой булавы, а затем проведите аналогичную операцию в отношении конечного эффектора второй булавы — результат будет различным, так как у правой булавы цепь окажется жесткой (рис. 26).
Рис. 25. Появление второй булавы
Рис. 26. Вид сцены после одинакового перемещения конечных эффекторов при разных параметрах приоритетов
Блокирование IK-сетей
В любом месте IK-сети можно блокировать вычисления по закону инверсной кинематики, что нередко используется в сложных иерархиях из нескольких IK-цепей (то есть когда требуется, чтобы инверсная кинематика работала лишь для отдельных ее фрагментов). Реализуется это путем назначения определенных объектов так называемыми терминаторами (Terminator) — после этого все связи, расположенные по иерархии выше терминатора, будут рассчитываться по законам прямой (а не инверсной) кинематики. Для примера в рабочей сцене с двумя булавами назначьте обеим булавам приоритеты Child->Parent, а после этого во второй булаве одно из звеньев в середине цепи сделайте терминатором, выделив его и включив в свитке ObjectParameters флажок Terminator (рис. 27). Перетащите конечные эффекторы в обеих булавах. В первой, где нет терминатора, по IK-закону будет рассчитана ориентация и положение всех объектов, а во второй объекты выше терминатора даже не будут перемещены (рис. 28), так как на этом участке цепи IK-вычисления были заблокированы.
Рис. 27. Назначение элемента терминатором
Рис. 28. Вид сцены после одинакового перемещения конечных эффекторов иерархий (без терминатора — слева и с терминатором — справа)
Анимация объектов при обратной кинематике
Существует два метода, которые можно использовать для анимирования объектов IK-кинематики, — Interactive IK и Applied IK. Первый предполагает ручное выделение и трансформацию конечного эффектора в указанных ключевых кадрах и используется в ситуациях, когда требуется большая свобода управления движением. Это самый легкий метод, но не самый точный. Более точен метод Applied IK, при котором программа сама вычисляет IK-решение для каждого кадра. Он применяется в случаях, когда иерархическая цепочка должна имитировать движение другого объекта сцены (follow-объекта), и более гибок в использовании, поскольку можно быстро изменить анимацию IK-цепочки за счет изменения анимации follow-объекта или выбора другого объекта для следования.
К методу Interactive IK мы уже прибегали (например, при анимировании цилиндров). Попробуем теперь применить метод Applied IK в ранее сохраненной рабочей сцене с цилиндрами. Удалите ранее созданные ключи анимации. Создайте на уровне нижнего цилиндра объект типа Dummy (команда Create=>Helpers=> Dummy) — рис. 29. Обратите внимание, что фиктивный объект не должен быть выровнен по нижнему цилиндру (у данных объектов совпадают лишь значения координаты Z, но не X и Y). Выделите верхний цилиндр, откройте на закладке IK панели Hierarchy свиток Object Parameters, щелкните на кнопке Bind и свяжите данный цилиндр с объектом-пустышкой. В итоге цилиндры сложатся, а в свитке Object Parameters появится информация об установке связи иерархической цепочки с Dummy-объектом (рис. 30). Анимируйте фиктивный объект обычным образом: щелкните на кнопке Auto Key, перетащите ползунок на последний кадр, переместите объект-пустышку по оси Z так, чтобы верхний цилиндр занял свою изначальную позицию, и отключите режим автоматической генерации ключей. Теперь нужно вычислить IK-решения для каждого кадра. Для этого выделите все три цилиндра и в свитке InverseKinematics включите флажок ClearKeys (Очистить ключи) — это приведет к тому, что только что созданные при ручном перемещении фиктивного объекта ключи анимации будут удалены до начала вычислений. После этого удостоверьтесь, что для спиннеров Start и End , определяющих время начала и завершения IK-решения, установлены значения 0 и 100 соответственно, и щелкните на кнопке ApplyIK. В итоге программа вычислит IK-решение (то есть значения позиционных и вращательных ключей) для всех трех объектов. Проиграйте анимацию — движение цилиндров станет более точным, что проще всего заметить при просматривании анимации посредством медленного перетаскивания ползунка на слайдере времени. В анимации по методу Interactive IK средний цилиндр при отключенном флажке Ease начинает свое движение еще до того, как верхний цилиндр достигнет своего нижнего ограничения (что неправильно), а в анимации AppliedIK ничего подобного не происходит — цилиндры строго соблюдают последовательность перемещения.
Рис. 29. Появление фиктивного объекта
Рис. 30. Вид сцены после связывания иерархической цепочки с Dummy-объектом
Примеры моделирования и анимации объектов с учетом инверсной кинематики
Крутящаяся булава
Вернитесь к сохраненной рабочей сцене с булавой. В проекции Top создайте произвольный криволинейный замкнутый сплайн (рис. 31). Выделите ручку булавы, назначьте ей контроллер HDSolver (команда Animation=>IKSolvers=>HDSolver) и укажите мышью на объект Hedra01. Свяжите ручку булавы со сплайном, который в итоге станет в иерархии Root-объектом (рис. 32). Выделите сплайн и в свитке RotationalJoints (панель Hierarchy, закладка IK) запретите для него вращение относительно всех трех осей (рис. 33). Назначьте созданный сплайн в качестве траектории движения для объекта Hedra01, выделив последний, открыв в меню Animation=>Constraints (Анимация=>Ограничения) команду PathConstraint (Ограничения пути) и указав сплайн в одном из окон проекций. Понаблюдайте созданную анимацию и для лучшего ее вида отрегулируйте форму сплайна и положение булавы относительно него (рис. 34). Возможный вид сцены в некоторых кадрах в полученном ролике представлен на рис. 35.
Рис. 31. Исходная сцена с булавой и сплайном
Рис. 32. Вид иерархической цепочки
Рис. 33. Параметры настройки свитка RotationalJoints для сплайна
Рис. 34. Вид сцены в одном из кадров анимации
Рис. 35. Крутящаяся булава
Свисающие бусы
Попробуем воспользоваться сплайновой инверсной кинематикой для моделирования эффектно свисающих с некоторой поверхности бус. Для начала создайте примитив Hedra — он сыграет роль одной бусины (рис. 36). Затем на его основе получите массив бусинок, воспользовавшись командой Array и настроив ее параметры примерно как на рис. 37. Получится полоска бусинок, вытянутых вдоль одной прямой, — обратите внимание, что бусинки должны располагаться вплотную друг к другу (рис. 38). Свяжите все бусинки в иерархическую структуру, начав с первой бусины и закончив последней (рис. 39).
Рис. 36. Исходная сцена
Рис. 37. Параметры настройки операции Array
Рис. 38. Полоска бусинок
Рис. 39. Вид иерархической цепочки
Теперь нужно придать цепочке бусинок соответствующую бусам форму. Для этого вначале создайте произвольный криволинейный замкнутый сплайн. После этого объедините бусины в сплайновую IK-цепь, выделив первую бусину, открыв из меню Animation=> IK Solvers команду SplineIK Solver и указав на последнюю бусину — создастся объект IK Chain01, о чем внешне будет свидетельствовать появление линии, проходящей через всю длину цепи (рис. 40). Инструментом Select by Name выделите созданную IK-цепь, откройте на панели Motion вкладку SplineIKSolver, щелкните на кнопке None под надписью PickShape и укажите сплайн — вместо слова None появится имя сплайна (рис. 41). Данное действие приведет к тому, что имеющаяся цепочка бусин выстроится по форме сплайна, при этом совсем не исключено, что бусин для полного заполнения сплайновой кривой может не хватить, как и произошло в нашем случае (рис. 42). Тогда откажитесь от последней операции, дополнительно сформируйте группу недостающих бусин, свяжите их вместе с созданными ранее и вновь укажите сплайн в качестве формы для IK-цепи (рис. 43). Обратите внимание, что для ускорения процесса связывания можно клонировать весь набор бусин со связями, выбрав в окне клонирования вариант Reference (Подчинение), что позволит получить второй массив бусин уже сразу со связями, и тогда останется лишь связать данные наборы между собой.
Рис. 40. Результат создания сплайновой IK-цепи
Рис. 41. Вид вкладки SplineIKSolver после указания сплайна
Рис. 42. Неудачный результат распределения бусин по сплайну
Рис. 43. Окончательный вид распределенных по сплайну бусин
Попробуем расположить полученную нитку бус на некоторой поверхности так, чтобы они с нее свисали. Создайте соответствующую поверхность, например в виде некой шкатулки (рис. 44). Активируйте сплайн, переключитесь в режим его редактирования и начните перемещать отдельные вершины сплайна относительно оси Z, наблюдая за ниткой бус и добиваясь естественности ее положения (рис. 45). По окончании текстурируйте сцену, возможный вид которой при визуализации представлен на рис. 46.
Рис. 44. Появление шкатулки
Рис. 45. Редактирование сплайна
Рис. 46. Свисающие бусы