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

Здесь мы будем создавать анимацию для персонажа, которого мы изготовили в Главе 4. На сей раз обойтись отдельными сферами и чайниками не удастся, поскольку нам нужен не подопытный объект, а иерархически-связанная система объектов.

Прямая кинематика (FK)

Прямая кинематика (FK - Forward Kinematics) представляет собой движение дочерних объектов относительно родительских. Здесь нет ничего хитрого. Создадим прямую кинематику для рук нашего персонажа. Для этого откроем файл с персонажем. Нажмём кнопку Auto Key.

Пускай персонаж помашет нам рукой.

Сместим бегунок в какой-нибудь кадр, например в 10-й, поднимем руку вверх. Делать это мы будем при помощи вращения, причём, для придания нужного положения, скорей всего повернуть придётся обе части руки.

Вернёмся в начало диапазона () и проиграем анимацию. Если Вам показалось, что персонаж поднимает руку слишком быстро, сделайте следующее: выделите обе части руки (плечо и предплечие), затем перейдите в строку отображения номеров кадров, выделите вторые ключи (у нас в одном итом же месте находятся два ключа - для плеча и для предплечия) чтобы выделились оба, натяните вокруг них прямоугольную область. Выделенные ключи станут белыми. Передвиньте их в какой-нибудь другой кадр, например 15-й. Можете вернуться назад и проиграть анимацию ещё раз.

Поставьте бегунок в следующую позицию (через несколько кадров после 15-го) и поверните плечо немного влево. Ещё несколько раз поперемещайте бегунок и поповорачивайте плечо туда-сюда. Затем создайте заключительный кадр, в котором рука будет опущена и чуть согнута в локте. Если вы запустите анимацию, то увидите, что плечо двигается так, как и должно двигаться когда человек машет рукой, а предплечье медленно наклоняется. Это происходит потому, что для предплечия мы создали только два ключа с достаточно большим расстоянием между ними.

Чтобы избавиться от этого эффекта, надо в последнем взмахе рукой создать ключ, в котором предплечие находится в правильном положении. Создать этот ключ желательно в том же кадре, в котором стоит ключ для последнего взмаха плечом (предпоследний ключ для плеча). Выделите плечо, чтобы отображались его анимационные ключи, и переместите бегунок в кадр, где находится его предпоследний ключ. Теперь выделите предплечие и поверните его в нужное положение. Проиграйте анимацию снова. Теперь персонаж машет рукой более естественно. Выключим кнопку Auto Key. Эту кнопку вообще лучше не держать зря включённой, поскольку в этом случае можно создать нежелательную анимацию во время редактирования и размещения объектов. При выключенной кнопке Auto Key анимация по-прежнему проигрывается, но теперь её нельзя создавать. Трансформация объектов приводит к тому, что сдвигается сама анимация. Если мы сейчас в нулевом кадре повернём руку персонажа так, чтобы она была вытянута вперёд и проиграем анимацию, то увидем, что рука движется в другом положении. Нажмём Undo, чтобы восстановить первоначальную анимацию.

Подводим итоги: мы создали много анимационных ключей для плеча и всего четыре ключа для предплечия. Между вторым и третим ключами предплечие неподвижно относительно своего родительского объекта - плеча.

Здесь файл с анимацией руки (формат 3ds MAX 6).

Инверсная кинематика (IK)

Инверсная кинематика (Inverse Kinematics) применяется в тех случаях, когда нам надо попасть каким-либо объектом из нашей иерархии в заданное положение. К примеру, если мы захотим анимировать ходьбу персонажа, ноги должны вставать на землю и не проскальзывать во времы движения туловища относительно земли. Добиться этого используя прямую кинематику крайне трудно, практически невозможно. К счастью, существует инверсная кинематика.

Мы рассмотрим средства инверсной кинематики, которые были введены в 3ds МAX 4 и сохранились до последних версий (3ds MAX 7). В более ранних версиях инверсная кинематика была устроена несколько иначе.

Инверсная кинематика создаётся при помощи так называемых цепей инверсной кинематики (IK Chain). Цепь создаётся между последовательно привязанными друг к другу объектами. Для того, чтобы создать такую цепь, иерархическая последовательность должна оканчиваться неким вспомогательным дочерним объектом. Мы проследим создание цепи инверсной кинематики на ногах нашего персонажа, при этом последним вспомогательным объектом цепи будет ступня.

Выделим корневой объект нашей цепи. Имейте ввиду, что корневой объект цепи - это не корневой объект всей иерархии в целом, то есть не body, а бедро (thigh). Выделим бедро и войдём в пункт главного меню Animation . Откроем в Animation пункт IK Solver (решатель инверсной кинематики). Там можно видеть:

HI Solver (History Independent Solver) - исторически-независимый решатель

HD Solver (History Dependent Solver) - исторически-зависимый решатель (лучший решатель для коротких анимационных последовательностей, но даёт плохие результаты при длительной анимации)

IK Limb Solver - решатель для анимации конечностей, расчитан на два объекта иерархической цепи

Spline IK Solver - сплайновый решатель

Мы будем использовать HI Solver. IK Limb Solver хотя и разработан для анимации конечностей человека, работает он плохо, при его использовании у персонажа всегда одно колено выгибается назад, а один локоть - вперёд.

Если бедро у нас по-прежнему выделено, выберем HI Solver и кликнем мышью на ступню той же самой ноги, бедро которой выделено. У нас должна появиться петля, связывающая обе части ноги, и синий крест в опорной точке ступни. Цепь инверсной кинематики является вспомогательным объектом, который имеет цвет и имя. Можете для удобства переназвать созданную цепь. Создадим точно такую же цепь для второй ноги.

Синий крестик - так называемый целевой объект (IK Goal ). Если мы сейчас попробуем его подвигать, то увидем, что нога сгибается и поворачивается таким образом, чтобы опорная точка ступни всегда находилась в центре крестика (при том, что сама ступня не перемещается относительно голени). Настройки для наследования вращения, которые мы сделали для ступни, теперь не работают, поскольку они осуществлялись для прямой кинематики.

Теперь стало понятно, зачем нужен вспомогательный дочерний объект: его опорная точка является ориентиром для цепи обратной кинематики. Чтобы ступня двигалась естественно, надо к ней привязать ещё какой-нибудь вспомогательный объект, и сделать ещё одну цепь инверсной кинематики, но мы сейчас этим заниматься не будем, а попробуем создать анимацию ходьбы.

Если не нажата кнопка Auto Key, нажмём её. Переместим бегунок в какой-нибудь кадр, например 10. Начнём ходьбу с правой ноги. Поднимем её (при помощи IK Goal) и немного занесём. Туловище тоже немного подвинем вперёд, так, как оно подвинется на полушаге. Переместим бегунок снова. Поставим ступню на землю, а туловище ещё немного пододвинем. Заметим, что мы создавали анимационные ключи не для вращения бедра и голени, а для перемещения IK Goal.

Теперь надо создать анимационный ключ для IK Goal в том же кадре, в котором правая ступня вновь коснулась земли. Вообще, ключ создастся по малейшему перемещению нашего IK Goal для левой ноги, но чтобы создать ключ не перемещая ногу, надо нажать на большую кнопку с изображением ключа (Set Key - поставить ключ). Либо, можно войти во вкладку Motion и создать анимационный ключ при помощи кнопки Position в группе Create Key.

Теперь проделаем анимацию левой ноги точно так же, как мы это делали для правой, не забывая при этом перемещать туловище. Отмотаем анимацию назад и проиграем. Если мы всё сделали правильно, персонаж делает два шага, при чём пока одна нога шагает, вторая не проскальзывает. На странное движение ступней пока не будем обращать внимание, в данном случае они у нас играют роль впомогательных объектов.

Здесь готовая сцена , где персонаж делает два шага и машет рукой.

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

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

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

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

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

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

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

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

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

  • HI Solver (History Independent Solver ) - исторически независимый контроллер (считается самым универсальным для персонажной анимации);
  • HD Solver (History Dependent Solver ) - исторически зависимый контроллер;
  • IK Limb Solver - контроллер для анимации конечностей (рассчитан только на два объекта иерархической цепи);
  • Spline IK Solver - сплайновый контроллер.

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

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

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

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

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

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

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

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

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

Root Motion - как оно работает

Инверсная кинематика (только для Pro версий)

В основном, анимация создается изменением углов в соединениях в скелете на заранее определенные величины. Позиция дочернего соединения изменяется согласно повороту родителя, поэтому конечная точка цепочки соединений может быть определена углами и относительными позициями каждого конкретного узла в цепи. Этот метод изменения позы скелета известен как прямая кинематика(forward kinematics) .

Однако, часто полезным является взгляд на задачу позиционирования соединений с другой стороны - со стороны выбранной позиции в пространстве. Работая в обратном направлении, найдите допустимый способ расположения соединений такой, чтобы конечная точка совпала с заданной ранее позицией Это может быть полезно, когда вы хотите, чтобы персонаж коснулся объекта в точке, заданной пользователем, или корректно позиционировал свои ступни на неровной поверхности. Этот подход называется инверсной кинематикой(Inverse Kinematics ) (IK) и поддерживается Mecanim для любого персонажа гуманоида с правильно настроенным аватаром

Для того, чтобы настроить IK для персонажа, вы, как правило, имеете объекты, расположенные на сцене, с которыми взаимодействует персонаж, и затем вы настраиваете IK с помощью скрипта, в частности, с помощью функций Animator, таких как SetIKPositionWeight , SetIKRotationWeight , SetIKPosition , SetIKRotation , SetLookAtPosition , bodyPosition , bodyRotation

На иллюстрации выше мы показываем персонажа, поднимающего цилиндрический объект. Как мы сделали это?

We start out with a character that has a valid Avatar.

Next create an Animator Controller with containing at least one animation for the character. Then in the Layers pane of the Animator window, click the cog settings icon of the Layer and and check the IK Pass checkbox in the menu which pops up.


Make sure the Animator Controller is assigned to the character’s Animator Component:

Next, attach to it a script that actually takes care of the IK, let’s call it IKControl . This script sets the IK target for the character’s right hand, and its look position to make it look at the object it is holding:

Using UnityEngine; using System; using System.Collections; public class IKControl: MonoBehaviour { protected Animator animator; public bool ikActive = false; public Transform rightHandObj = null; public Transform lookObj = null; void Start () { animator = GetComponent(); } //a callback for calculating IK void OnAnimatorIK() { if(animator) { //if the IK is active, set the position and rotation directly to the goal. if(ikActive) { // Set the look target position, if one has been assigned if(lookObj != null) { animator.SetLookAtWeight(1); animator.SetLookAtPosition(lookObj.position); } // Set the right hand target position and rotation, if one has been assigned if(rightHandObj != null) { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1); animator.SetIKPosition(AvatarIKGoal.RightHand,rightHandObj.position); animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation); } } //if the IK is not active, set the position and rotation of the hand and head back to the original position else { animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0); animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0); animator.SetLookAtWeight(0); } } } }

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

Урок адаптирован под версию 3ds max 2009.

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

В качестве примера откройте файл Table_ lamp3-1. max . Иерархическая цепь объектов здесь уже создана. Чтобы ее увидеть, выполните команду Select by Name и в окне Select from Scene разверните структуру объекта. В данном случае конечным эффектором иерархической цепочки является самый нижний в иерархии объект Reflector.

Установите режим инверсной кинематики. Для этого на панели Hierarchy (Иерархия) откройте закладку IK (Инверсная кинематика) и щелкните кнопкой Interactive IK (Интерактивная инверсная кинематика). Выделите объект Support и переместите его в сторону. Вместе с ним точно так же переместятся и все остальные объекты. Теперь выделите, например, объект Lever02 и переместите его в любую сторону. Его перемещение вызовет изменение положения всех остальных объектов, включая объект Support, являющийся самым высшим в иерархии. При этом положение объектов, стоящих по иерархии ниже перемещаемого объекта (в данном случае это объекты Hinge03, Lever03, Reflector), будет меняться по законам прямой кинематики, а объектов с более высокой иерархией (Hinge02, Lever01, Hinge01, Support) - по законам инверсной кинематики.

Обратите внимание, что при перемещении рычага Lever02 положение и ориентация всех объектов меняются непредсказуемым образом. Это связано с тем, что по умолчанию для объектов, управляемых посредством эффектора, допустимы любые варианты перемещения и вращения, хотя на практике они могут трансформироваться только каким-либо определенным образом. При инверсной кинематике эти проблемы регулируются на закладке IK панели Hierarchy с помощью параметров, задаваемых в свитках Sliding Joints (Скользящие соединения) и Rotational Joints (Вращательные соединения).

Кроме того, можно определить в системе объект, который будет играть роль ограничителя. Terminator (Ограничитель) - это последний объект системы инверсной кинематики, начиная с верхнего уровня, который не подвергается влиянию при движении дочернего объекта. Для определения ограничителя достаточно выделить объект и в свитке Object Parameters (Параметры объекта) установить для него флажок Terminator .

Выделите объект Hinge01, перейдите на вкладку Hierarchy (Иерархия) | IK (Инверсная кинематика) и включите команду Interactive IK (Интерактивная инверсная кинематика). В свитке Object Parameters (Параметры объекта) установите флажок для Terminator . Передвиньте объект Lever02 в любую сторону. При этом объект Hinge01 и его родительский объект Support останутся неподвижными (рис. 1.1).

Рис. 1.1. Шарнир Hinge01 определен в качестве ограничителя

Продолжение урока вы можете найти в книге Горелика А.Г. « «.

Инверсная кинематика (инверсная кинематическая анимация , англ. inverse kinematics , IK) - процесс определения параметров связанных гибких объектов (например, кинематическая пара или кинематическая цепь) для достижения необходимой позиции, ориентации и расположения этих объектов. Инверсная кинематика является типом планирования движения (англ. ) . Инверсная кинематика активно используется в робототехнике , трёхмерной компьютерной анимации и в разработке компьютерных игр . Она используется в основном в тех ситуациях, когда необходимо точное позиционирование гибких сочленений одного объекта относительно других объектов окружающей среды. Алгоритм инверсной кинематики противоположен алгоритму прямой кинематики .

Энциклопедичный YouTube

    1 / 3

    Прямая и инверсная кинематика в 3DS Max

    Anime Studio Pro 10, 11(Moho Pro) - Как подключить инверсную кинематику на костяного персонажа

    Полная костная инверсная кинематика в Anime Studio Pro (Moho Pro) / Full Inverse Kinematics

    Субтитры

Описание

Инверсная кинематика, как и прямая , применяются к моделям каких-либо персонажей или объектов, которые созданы с использованием скелетной анимации . Суть скелетной анимации состоит в том, что объект состоит из набора твёрдых сегментов (компонентов), соединённых сочленениями (англ. joint ). При этом сегменты могут объединяться в кинематические пары , которые в свою очередь объединяются в кинематические цепи . Данные сегменты образуют иерархические цепочки, которые имеют «верхний» и «нижний» уровень. Сегменты (компоненты) верхних уровней называются компонентами-предками (или родительскими сегментами), а компоненты нижних - компонентами-потомками (или дочерними сегментами). Например, если рассмотреть руку человека, то плечевой сустав будет самым верхним уровнем, а кончик пальца - самым нижним, т. е. компонентом-потомком к плечевому суставу. Локтевой сустав находится внутри цепочки, он будет иметь как родительские (плечо), так и дочерние (запястье, пальцы) сегменты.

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

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

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

Использование и примеры

Инверсная кинематика является инструментом, который часто используют художники трёхмерной графики . Для художника проще выразить желаемое пространственное действие, чем непосредственно манипулировать углами сочленений. Например, инверсная кинематика позволяет художнику двигать рукой модели трёхмерного гуманоидного персонажа к желаемой позиции и ориентации. При этом сам алгоритм, а не художник, выбирает правильные углы запястья, локтя и плечевого сустава.

Например, если человек хочет схватить дверную ручку рукой, то его мозг должен сделать необходимые вычисления для правильного позиционирования руки и туловища человека. Основная цель состоит в том, чтобы двигать рукой, но нужно задействовать много сложных суставов с несколькими сочленениями, чтобы добраться рукой к желаемому объекту. Подобным образом происходит процесс в технологических приложениях - чтобы достичь желаемой цели, должны быть выполнены математические вычисления инверсной кинематики для расположения конечностей правильным образом. Примером, когда вычисления инверсной кинематики часто необходимы, является робототехника. Например, оператор робота хочет поместить какой-либо объект с помощью манипулятора , однако, естественно, он не хочет управлять каждым сочленением манипулятора отдельно.

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

Инверсная кинематика часто используется в компьютерных играх для создания анимации гуманоидных персонажей. В основном инверсная кинематика используется для создания анимации ног моделей человекоподобного существа или человека. Например, довольно просто создать анимацию передвижения (ходьба, бег) человека или наземного животного, если он движется по ровной плоскости. Однако если ландшафт неровный (бугристый, ухабистый, пересечённая или горная местность), то создание точной анимации ходьбы является фактически невозможной задачей. Анимация ног не будет соответствовать рельефу поверхности, что проявится в таких эффектах, как проскальзывание ног по поверхности и неточном позиционировании ног относительно её (ступня будет «утопать» в поверхность или «не доставать» до неё). Именно для качественного и эффективного решения этих проблем используется инверсная кинематика.

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

Примечания

Внешние ссылки

Англоязычные источники

  • Hugo Elias. Inverse Kinematics Архивировано 13 августа 2011 года.
  • Hugo Elias. Inverse Kinematics - Improved Methods (англ.) . freespace.virgin.net. Проверено 5 июня 2009. Архивировано 13 августа 2011 года.
  • Robot Inverse Kinematics (англ.) . www.learnaboutrobots.com. Проверено 5 июня 2009. Архивировано 13 августа 2011 года.
  • How do the characters in video games move so fluidly? (англ.) . Проверено 5 июня 2009. Архивировано 13 августа 2011 года.
  • Martin John Baker. 3D Theory - Kinematics - Joints  Inverse Kinematics (англ.) . www.euclideanspace.com. Проверено 5 июня 2009. Архивировано 13 августа 2011 года.
  • Lydia E. Kavraki. Protein Inverse Kinematics and the Loop Closure Problem (англ.) . cnx.org. Проверено 5 июня 2009. Архивировано 13 августа 2011 года.
  • Diego Park. Computer Graphics (англ.) . diegopark.googlepages.com. Проверено 5 июня 2009. Архивировано 13 августа 2011 года.
  • Bill Baxter.