3D Studio MAX: первые шаги. Урок 22. Инверсная кинематика

Светлана Шляхтина

Теоретические аспекты

Понятие инверсной кинематики

Управление вращением и перемещением объектов

Настройка пределов ограничений

Назначение приоритетов

Блокирование IK-сетей

Анимация объектов при обратной кинематике

Примеры моделирования и анимации объектов с учетом инверсной кинематики

Крутящаяся булава

Свисающие бусы

Анимированная лампа

Поднимающийся кузов

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

Теоретические аспекты

Понятие инверсной кинематики

Инверсная кинематика отличается от прямой иным принципом наследования. Если при прямой кинематике трансформация потомков определяется трансформацией их предков, то при инверсной — потомки приводят в движение родительские объекты, то есть программа рассчитывает положение и ориентацию родительских объектов, исходя из положения и ориентации трансформируемого потомка. Потомок, который вызывает трансформации других объектов по законам инверсной кинематики, называется либо эффектором (Effector), если он расположен в середине отдельной иерархической ветви, либо конечным эффектором (EndEffector), если является конечным объектом данной ветви. Через эффектор осуществляется манипулирование всей иерархической цепочкой. При этом трансформация конечного эффектора обеспечивает трансформацию всех объектов иерархической ветви по законам инверсной кинематики, а трансформация просто эффектора приводит к тому, что положение объектов, стоящих по иерархии ниже его, меняется по законам прямой кинематики, а объектов с более высокой иерархией — по законам инверсной кинематики.

Чтобы убедиться в этом, создайте простую сцену со своеобразной булавой, смоделированной из примитива Hedra, десяти торусов и цилиндра со скошенными основаниями (рис. 1). Свяжите объекты инструментом SelectandLink (Выделить и связать), двигаясь в направлении от объекта Hedra01 к объекту ChamferCyl01 — в итоге цилиндр окажется Root-объектом (рис. 2). Выделите цилиндр и переместите его влево — вместе с ним переместятся и все остальные объекты, являющиеся по отношению к нему дочерними. Тогда как передвижение одного из расположенных в середине цепочки торусов приведет к перемещению лишь дочерних по отношению к нему объектов цепочки, а объекты, расположенные выше его по иерархии, останутся на месте (рис. 3). Вернитесь к исходному положению объектов и активируйте режим инверсной кинематики, открыв на панели Hierarchy закладку IK и щелкнув на кнопке InteractiveIK, которая должна подсветиться (рис. 4). Сохраните рабочую сцену в файл и повторите те же самые операции с перемещением цилиндра и торуса — перемещение первого объекта даст те же самые результаты, что и ранее, а вот изменение положения торуса приведет к соответствующим изменениям положения всех остальных (а не только дочерних по отношению к нему) элементов, включая Root-объект (рис. 5). При этом положение объектов, стоящих по иерархии ниже перемещаемого торуса (в данном случае он играет роль просто эффектора), будет меняться по законам прямой кинематики, а объектов с более высокой иерархией — по законам инверсной кинематики.

 

Рис. 1. Исходная сцена

Рис. 1. Исходная сцена

 

Рис. 2. Вид иерархической цепочки

Рис. 2. Вид иерархической цепочки

 

Рис. 3. Поведение объектов в случае прямой кинематики

Рис. 3. Поведение объектов в случае прямой кинематики

 

Рис. 4. Включение режима инверсной кинематики

Рис. 4. Включение режима инверсной кинематики

 

Рис. 5. Поведение объектов в случае обратной кинематики

Рис. 5. Поведение объектов в случае обратной кинематики

В начало В начало

Управление вращением и перемещением объектов

Вернитесь к сохраненной рабочей сцене, выделите объект Hedra01 и поперемещайте его, наблюдая за всеми объектами иерархической цепи, и вы убедитесь в полном отсутствии контроля над ними, так как положение и ориентация последних меняются самым непредсказуемым образом (рис. 6). Это связано с тем, что по умолчанию для управляемых посредством эффектора объектов допустимы любые варианты перемещения и вращения. На практике же чаще всего связанные объекты могут трансформироваться только каким-то определенным образом, а значит, все другие варианты трансформаций для них запрещены.

 

Рис. 6. Перемещение конечного эффектора

Рис. 6. Перемещение конечного эффектора

 

Данный аспект при обратной кинематике регулируется в первую очередь посредством Joint-параметров, позволяющих определить, относительно каких осей и в каких пределах может вращаться (RotationalJoint s) и/или перемещаться (SlidingJoint s) тот или иной дочерний объект относительно родительского. Иными словами, Joint-параметры задают характер трансформации связи (или, как часто говорят, сочленения либо сустава) между дочерним и родительским объектами. Настраиваются данные параметры на закладке IK панели Hierarchy, однако по умолчанию там доступны лишь параметры, отвечающие за ограничение вращения объектов иерархической цепочки (RotationalJoint s). Возможность управления объектами посредством параметров SlidingJoint s появится только после назначения им специализированного IK-контроллера. Последнее осуществляется через меню Animation=>IKSolvers (Анимация=>IK-решения), предусматривающее присваивание объектам одного из следующих IK-контроллеров:

  • HISolver (HistoryIndependentSolver) — исторически независимый контроллер (считается самым универсальным для персонажной анимации);
  • HDSolver (HistoryDependentSolver) — исторически зависимый контроллер;
  • IKLimbSolver — контроллер для анимации конечностей (рассчитан только на два объекта иерархической цепи);
  • SplineIKSolver — сплайновый контроллер.

Данные контроллеры не только открывают доступ к параметрам SlidingJoint s, но и обеспечивают еще массу возможностей благодаря тому, что преобразуют обычные иерархические последовательности в так называемые цепи инверсной кинематики (IKChain), которые представляют собой невизуализируемые объекты управления, упрощающие управление элементами иерархии по законам инверсной кинематики. Внешне в окнах проекций IK-цепи выглядят как ряд перекрестий и линий, соединяющих начало и окончание конкретной IK-цепи. Выбираются данные элементы обычным образом (щелчком по перекрестию или инструментом Select by Name), а вот редактируются не через панель Modify (как прочие объекты), а через панель Motion. Независимо от типа контроллера IK-цепи создаются одинаково: выбирается первый элемент предполагаемой цепи, затем ему назначается IK-контроллер и указывается последний элемент цепочки. Различие между IK-контроллерами заключается в использовании при расчетах IK-решений разных методов преобразования IK-цепочек.

Чтобы убедиться в том, что IK-цепи упрощают управление элементами иерархии, создайте упрощенную модель ноги (бедро и голень со стопой) — рис. 7. Свяжите их в иерархическую цепочку, начиная данный процесс снизу, чтобы в итоге в роли Root-объекта оказался верхний цилиндр (то есть бедро). Включите режим инверсной кинематики и попробуйте переместить ступню влево — результат окажется совсем не таким, какой можно наблюдать при ходьбе, поскольку даже при небольшом перемещении повороты cуставов будут слишком велики (рис. 8). А теперь создайте дополнительный фиктивный объект в верхней части бедра и включите его в иерархию в качестве Root-объекта. Выделите Dummy-объект и назначьте цепи контроллер HISolver, применив команду Animation=>IKSolvers=>HISolver и указав в качестве конечного эффектора ступню, — при выполнении данного действия за курсором мыши будет тянуться пунктирная линия (рис. 9). Это приведет к созданию цепи инверсной кинематики с IK-контроллером, о чем будет свидетельствовать появление линии, простирающейся от вершины бедра к ступне, и перекрестия (это так называемый целевой объект IKGoal) в опорной точке эффектора (рис. 10). Если вы подвигаете перекрестие, то увидите, что нога перемещается, сгибается и поворачивается таким образом, что опорная точка ступни всегда находится в центре крестика, но сама ступня не перемещается относительно голени (рис. 11). Попробуйте анимировать подобное движение, щелкнув на кнопке Auto Key, активировав 50-й кадр, перетащив перекрестие немного назад, а затем, в 100-м кадре, вернув его в исходное положение и выключив режим автоматического создания ключей. Проиграйте анимацию, и вы увидите предельно упрощенную имитацию ходьбы (рис. 12). Конечно, до настоящей ходьбы еще далеко, но мы пока ограничимся этим и вернемся к данному вопросу в одном из ближайших уроков, когда будем говорить о построении иерархии с применением Bones.

 

Рис. 7. Исходная сцена

Рис. 7. Исходная сцена

 

Рис. 8. Перемещение ступни при инверсной кинематике без IK -контроллера

Рис. 8. Перемещение ступни при инверсной кинематике без IK -контроллера

 

Рис. 9. Связывание объектов в IK -цепь

Рис. 9. Связывание объектов в IK -цепь

 

Рис. 10. Вид сцены с IK -цепью

Рис. 10. Вид сцены с IK -цепью

 

Рис. 11. Результат перемещения целевого объекта

Рис. 11. Результат перемещения целевого объекта

 

Рис. 12. Вид сцены в некоторых кадрах анимации

Рис. 12. Вид сцены в некоторых кадрах анимации

 

Вернемся к сохраненной на диске рабочей сцене с булавой и попробуем немного поэкспериментировать с настройкой Joint-параметров. Выделите Root-объект, из меню Animation=>IKSolvers (Анимация=>IK-решения) выберите команду HDSolver и укажите мышью конечный эффектор (то есть объект Hedra01). Выделите объект Hedra01, вновь переместите его в одно из направлений и убедитесь, что результат окажется гораздо более реалистичным (рис. 13). Выделите объект ChamferCyl01 и откройте закладку IK панели Hierarchy. По умолчанию для него у параметров SlidingJoint s отключены флажки Active в отношении всех трех осей и включены для параметров RotationalJoint s (рис. 14). Это означает, что данный объект может вращаться произвольным образом, но для него запрещены перемещения относительно любой из осей. Для примера отмените ограничение на скольжение относительно оси Z, включив флажок Active в разделе Z Axis, — после этого положение и ориентация объекта ChamferCyl01 при перемещениях конечного эффектора станут совсем иными (рис. 15 и 16); верните ограничение. Обратите внимание, что даже при установленном ограничении на скольжение некоторое смещение объекта ChamferCyl01 все же имеет место, так как ограничения устанавливаются не непосредственно на объекты, а на их сочленения друг с другом (Joint), то есть на суставы (если провести аналогию с конечностью человека). Попробуйте также установить ограничения на вращение объекта ChamferCyl01 в отношении всех трех осей, что позволит добиться жесткой фиксации положения и ориентации данного объекта, в то время как все прочие элементы IK-цепи по-прежнему будут полностью свободны от каких-либо ограничений на вращение и скольжение (рис. 17).

 

Рис. 13. Перемещение конечного эффектора после назначения цепи IK -контроллера

Рис. 13. Перемещение конечного эффектора после назначения цепи IK -контроллера

 

Рис. 14. Первоначальный вид свитков SlidingJoints и RotationalJoints для объекта ChamferCyl01

Рис. 14. Первоначальный вид свитков SlidingJoints и RotationalJoints для объекта ChamferCyl01

 

Рис. 15. Перемещение конечного эффектора до снятия ограничения на скольжение

Рис. 15. Перемещение конечного эффектора до снятия ограничения на скольжение

 

Рис. 16. Перемещение конечного эффектора после снятия ограничения на скольжение

Рис. 16. Перемещение конечного эффектора после снятия ограничения на скольжение

 

Рис. 17. Перемещение конечного эффектора после установки ограничений на вращение

Рис. 17. Перемещение конечного эффектора после установки ограничений на вращение

В начало В начало

Настройка пределов ограничений

Помимо включения/выключения ограничений на скольжение и вращение в свитках SlidingJoint s и RotationalJoints можно регулировать то, насколько допустимо перемещение или вращение относительно той или иной оси, то есть устанавливать пределы ограничений. Реализуется это посредством установки флажка Limited (Ограничение) и определения значений пределов вращения в полях From и To («От» и «До»). Наша рабочая сцена не очень подходит для экспериментов с ограничениями пределов скольжения и вращения, поэтому создайте новую сцену из трех цилиндров разного диаметра, размещенных друг на друге так, чтобы вверху был цилиндр самого большого радиуса (он должен оказаться в начале координат), а внизу — самого малого (рис. 18). Высота всех цилиндров одинакова и равна 30. Свяжите их в иерархическую цепочку, начиная данный процесс сверху так, чтобы в итоге в роли Root-объекта оказался нижний цилиндр (рис. 19).

 

Рис. 18. Исходная сцена

Рис. 18. Исходная сцена

 

Рис. 19. Вид иерархической цепочки

Рис. 19. Вид иерархической цепочки

 

Выделите нижний цилиндр и назначьте цепи контроллер HISolver, применив команду Animation=>IKSolvers=>HISolver и указав в качестве конечного эффектора верхний цилиндр. Выделите верхний цилиндр и на закладке IK панели Hierarchy в свитке RotationalJoints удалите флажки Active для всех трех осей, а в свитке SlidingJoint s включите флажок Active для оси Z. Аналогичную операцию проведите в отношении среднего цилиндра, а для нижнего цилиндра запретите вообще все виды Joint s-трансформаций. После этого попробуйте подвигать верхний цилиндр вверх и вниз — после установленных для него разрешений он будет перемещаться относительно оси Z (рис. 20) и без каких-либо ограничений может двигаться вверх и вниз бесконечно далеко. Теперь настроим для цилиндров пределы ограничений для их перемещения вдоль оси Z, чтобы верхний цилиндр вначале полностью погружался в средний, а затем средний — в нижний. То есть в итоге должна получиться некая имитация складной трубы (например, подзорной). Легче всего подобрать соответствующие ограничения с визуальным контролем пределов, что возможно при увеличении и уменьшении мышью при нажатой клавише Ctrl соответствующих значений в полях, расположенных справа от полей ввода (пока без включения флажка Limited). В этом случае текущее состояние цилиндров будет сразу же отображаться в активном окне проекций. Выделите верхний цилиндр и таким способом (то есть изменяя параметры при нажатой клавише Ctrl) убедитесь, что его исходное положение (то есть когда он занимает свое первоначальное положение) соответствует значению From, равному 30, а конечное (когда данный цилиндр полностью погрузился в нижний цилиндр) — значению To, равному 0. Аналогичным образом подберите значения ограничений для среднего цилиндра, которые для поставленной задачи окажутся точно такими же. Включите соответствующие флажки Limited (рис. 21), и вы увидите, что при перемещении верхнего цилиндра наша «подзорная труба» действительно будет складываться задуманным образом (рис. 22). Сохраните рабочую сцену в файл. Анимируйте перемещение цилиндров: активируйте режим автоматической генерации ключей, перетащите ползунок на последний кадр, переместите верхний цилиндр так, чтобы он полностью погрузился в нижний, и отключите режим автоматической генерации ключей. Сохраните сцену в файл (позже он нам потребуется).

 

Рис. 20. Перемещение верхнего цилиндра до установки пределов ограничений

Рис. 20. Перемещение верхнего цилиндра до установки пределов ограничений

 

Рис. 21. Окончательный вид свитка SlidingJoints для верхнего и среднего цилиндров

Рис. 21. Окончательный вид свитка SlidingJoints для верхнего и среднего цилиндров

 

Рис. 22. Вид сцены на разных этапах перемещения верхнего цилиндра

Рис. 22. Вид сцены на разных этапах перемещения верхнего цилиндра

 

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

 

Рис. 23. Свиток SlidingJoints с включенным флажком Ease

Рис. 23. Свиток SlidingJoints с включенным флажком Ease

 

Для соединений можно даже назначить сопротивление, имитировав силу трения, — для этого достаточно установить для Joints-ограничений значение параметра Damping большим нуля, а также определить, насколько быстро соединение будет возвращаться в исходную позицию (параметр SpringTension), либо задать обратную тягу (параметр SpringBack).

В начало В начало

КомпьютерПресс 12'2007


Наш канал на Youtube

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует