Скелетная анимация - это тот самый случай, когда совсем общую теорию объяснить очень просто, а вот добиться реальных результатов, тем более, результатов серьёзных оказывается очень сложно.
Никто, однако, не считает зазорным изучать анимацию годами, натыкаясь на каждом углу на справедливость поговорки «Век живи - век учись».
Если в общем, то скелетная анимация - это анимирование 3D-фигуры посредством относительно небольшого количества управляющих элементов, и внешне и по принципу работы, напоминающие скелет - или строение марионетки.
Как он «изготавливается», мы рассматривали в статье «Риггинг» . От того, насколько разумно и правильно риггинг был выполнен, зависит и результаты первых попыток анимировать что-либо. Если иерархия костей сделана как надо, то и поведение цепочки, равно как и привязанных к ней вершин, будет «жизнеподобным». Ошибки же могут привести к совершенно нелепым последствиям: ноги могут «уехать» за голову, например.
При умелом использовании скелетная анимация позволяет значительнейшим образом экономить на усилиях - естественно, гораздо проще двигать несколько «костей», нежели тягать с места на место группы вершин и полигонов.
Существуют два основных типа планирования движения «скелета» - это прямая кинематика (Forward Kinematics - FK) и инверсная, или обратная кинематика (Inverse Kinematics - IK). Их также выбирают на этапе риггинга, - впрочем, этот процесс от скелетной анимации вообще неотделим.
Итак: создадим отдельно взятую цепочку «костей» - без добавления мяса пока что. Все операции осуществляются в пакете Blender3D, скриншоты, стало быть, тоже оттуда.
Видим четыре кости, где первая - «родительская», все последующие - находятся в последовательной иерархической зависимости от предыдущих.
В случае если мы используем прямую кинематику, то при попытке сдвинуть какие-либо звенья (кости) ниже уровнем, чем родительская, приведут к тому, что двигаться будут только нижестоящие:
Повернули кость 2 , вместе с ней повернулись (но остались на одной прямой) кости 3 и 4 .
Это прямая кинематика: перемещение старших по иерархии костей приводят к тому, что перемещаются и младшие.
При использовании обратной кинематики алгоритм получается ровно противоположный:
Задав режим автоматического выбора инверсной кинематики (Blender делает вид, что подбирает оптимальный вариант, и иногда вполне успешно), сдвигаем самую младшую в иерархии кость 4 ; вся цепочка послушно изогнулась.
Звено цепочки, изменение положения которого приводит к изменению положения других звеньев, называется effector (существует диковинный перевод «влиятель», но как на самом деле это слово переводить?..).
Подвигали кость 3 . Звенья 1-2 поменяли своё положение, а 4 - осталось на одной прямой со звеном 3 . Кость 3 теперь является effector"ом, и всё, что находится ниже его по иерархии подчиняется алгоритмам прямой кинематики.
Инверсная кинематика применяется главным образом там, где требуется точное расположение конечного звена в нужной точке (например, чтобы при ходьбе ноги персонажа не «проскальзывали» по поверхности или не утопали в полигонах, изображающих твердь земную).
Самое же важное - это грамотная расстановка ограничителей (constraints) для подвижных элементов на этапе риггинга. Конечности модели персонажа должны вести себя «в разумных антропоморфических пределах», например, чтобы колени не прогибались не в ту сторону или пальцы рук не заворачивались за запястье.
Далее начинается процесс автоматизации движений - тут всё делается так же, как и при обычной анимации. Задаются ключевые кадры для отдельных управляющих элементов, и они тащат за собой все остальные. При этом анимационные пакеты вполне могут регистрировать ключевые положения только для индивидуальных костей, для всех звеньев разом или для отдельных их групп. При этом генерируются кривые движения/вращения/масштаба для каждого элемента, участвующего в анимации. Современные пакеты, разумеется, предоставляют в избытке средства, позволяющие экономить на усилиях - например, «глобализовать» управление сразу множеством элементов, группируя их более-менее удобным способом. На скриншоте ниже представлено всё рабочее окно Blender с активированными Action Editor и Timeline Editor.
Тем не менее, сделать качественную анимацию - чудовищно кропотливый процесс, требующий учитывать огромное количество факторов влияния отдельных элементов друг на друга. Как уже сказано в статье про риггинг, при анимации антропо- или зооморфных персонажей следует иметь в виду анатомические особенности их прообразов в реальном мире и соответствующую взаимосвязь элементов.
Ну, и напоследок, добавим, что если целью стоит сделать не «реалистичную» анимацию, а стилизацию под анимацию рисованную, то необходимо иметь в виду пресловутые 12 принципов, заложенные
Что такое «Инверсная кинематика»?
Задачей инверсной кинематики является поиск такого набора конфигураций сочленений, который обеспечил бы максимально мягкое, быстрое и точное движение к заданным точкам. Однако, множество существующих ныне методов страдают от таких недостатков как высокая вычислительная сложность и неестественность результирующих поз. В этой статье описан новый (вероятно, на момент написания статьи - 2010 г.
) эвристический метод под названием «Метод прямого и обратного следования» (Forward and Backward Reaching Inverse Kinematics
, далее просто FABRIK),
FABRIK избегает использования вращений и матриц в пользу непосредственного получения точки на прямой. Благораря этому, дело обходится всего несколькими итерациями, имеет низкую стоимость вычислений и визуально естественную позу в результате. FABRIK так-же без проблем справляется с наложением ограничений а так-же использованием нескольких цепей и/или конечных точек. Именно об этом методе этот пост.
Прошу отнестись с пониманием к этой выжимке, потому-что оригинал довольно большой, имеет много воды, уместных и неуместных повторений и отстранений от темы, а так-же сравнений с другими алгоритмами. Этим я решил все-таки пренебречь, поэтому, тут содержится лишь малая часть текста, которая, однако, отражает суть - прим. перев.
Алгоритм полного цикла алгоритма FABRIK (псевдокод, первый элемент массива под индексом 1)
Исходные данные: массив позиций узлов p[i] с i = 1...n, целевая позиция t и значения дистанций между сопряжёнными узлами.
d[i] = | p - p[i] | for i = 1, ... , n-1
Выходные данные: Новые позиции p[i],
i = 1...n
//Дистанция между корнем и целью
dist = | p - t |
//Проверяем достижимость цели
if dist > d + d + ... + d
{
//цель недостижима
for i = 1, ..., n-1 do
{
//Найдем дистанцию r[i] между целью t и узлом p[i]
r[i] = | t - p[i] |
lambda[i] = d[i] / r[i]
//Находим новую позицию узла p[i]
p = (1 - lambda[i]) * p[i] + lambda[i] * t
}
}
else
{
//Дель достижима; т.о. b будет новой позицией узла p
b = p
//Проверяем, не выше ли дистанция между конечным узлом p[n] и
//целевой позицией t значения терпимости (tolerance)
DIFa = | p[n] - t |
while DIFa > tol do
{
//Этап 1: прямое следование
//Устанавливаем конечный узел p[n] в качестве цели (вероятно, имелось ввиду "ставим на позицию цели" - прим. перев.)
p[n] = t
for i=n -1 , ..., 1 do
{
//Получаем расстояние r[i] между узлом p[i] и новой позицией p
r[i] = | p - p[i] |
lambda[i] = d[i] / r[i]
//Вычисляем новую позицию узла p[i]
p[i] = (1 - lambda[i]) * p + lambda[i] * p[i]
}
//Этап 2: обратное следование
//Устанавливаем корневому элементу p начальную позицию
p[i] = b
for i=1 ,..., n - 1 do
{
//Получаем дистанцию r[i] между узлом p и позицией p[i]
r[i] = | p - p[i] |
lambda[i] = d[i] / r[i]
//Получаем новую позицию p[i]
p = (1-lambda[i]) * p[i] + lambda[i] * p
}
DIFa = | p[n] - t |
}
}
Более подробно:
Сначала считаются позиции между узлами (массив d
), после чего идёт проверка, достижима ли целевая точка; считается расстояние между корневым узлом и целью (dist
), и если эта дистанция меньше общей суммы дистанций между узлами, то цель достижима, иначе нет. Если цель достижима, полный цикл ограничивается двумя этапами. На первом этапе, алгоритм оценивает начальную позицию каждого узла, начиная с конечного элемента p[n]
двигаясь к базе манипулятора p
. Таким образом, позволим целевой позиции быть позицией конечного узла, p"[n]
= t
. Получим прямую l
, лежащую на точках p
и p"[n]
. Новая позиция узла с индексом n-1
, p"
, лежит на этой линии на дистанции d
от p"[n]
. Аналогично, новая позиция узла с индексом n-2
, p"
, может быть вычислена используя прямую l
, лежащую на точках p
и p"
на дистанции d
от p"
. Алгоритм повторяется до тех пор, пока все не будут посчитаны новые позиции для всех узлов, включая конечный. В случаях, когда корневой элемент перемещается на необходимую позицию, FABRIK срабатывает как было описано, с тем лишь отличием, что новая позиция p""
корневого узла будет желаемой позицией, а не начальной.
После одной полной итерации, почти во всех случаях (по наблюдениям) конечный узел приблизится к цели. Процедура повторется необходимое количество раз, до тех пор, пока конечный узел не ляжет на позицию цели или не приблизится к ней на допустимую дистанцию. Реализация метода FABRIK без введения ограничителей сойдётся на любой целевой точке/цепи, если цель достижима. Однако, если цель находится дальше достанции, на которую может вытянуться цепь, необходимо прерывающее условие, которое сравнит прошлую и текущую позицию конечного узла, и которое прекратит выполнение алгоритма если смещение конечного узла будет меньше некоторого значения (эпсилона). Так-же, в особых случаях, алгоритм прерывается по истечению некоторого числа итераций (впрочем, пока-что такая ситуация не была встречена).
Для более быстрого результата и решения в несколько итераций, возможна оптимизация с применением Конформной Геометрической Алгебры (Conformal Geometric Algebra, далее CGA); CGA имеет преимущество на базовых фигурах, такие как сферы, прямые, плоскости и окружности, достаточно просто отображаемые алгебраическими обьектами. Поэтому, поиск позиции узла, находящегося между двумя известными узлами, может быть выражен пересечением двух сфер с центрами на соответствующих этим узлам позициям, и радиусом, равным расстоянию между позициям искомого узла и имеющимися; новая позиция узла будет лежать на ближайшей точке окружности, сформированной пересечением двух сфер. Другая простая оптимизация заключается в прямом построении прямой в направлении цели, когда последняя недоступна.
Здесь мы будем создавать анимацию для персонажа, которого мы изготовили в Главе 4. На сей раз обойтись отдельными сферами и чайниками не удастся, поскольку нам нужен не подопытный объект, а иерархически-связанная система объектов.
Прямая кинематика (FK - Forward Kinematics) представляет собой движение дочерних объектов относительно родительских. Здесь нет ничего хитрого. Создадим прямую кинематику для рук нашего персонажа. Для этого откроем файл с персонажем. Нажмём кнопку Auto Key.
Пускай персонаж помашет нам рукой.
Сместим бегунок в какой-нибудь кадр, например в 10-й, поднимем руку вверх. Делать это мы будем при помощи вращения, причём, для придания нужного положения, скорей всего повернуть придётся обе части руки.
Вернёмся в начало диапазона () и проиграем анимацию. Если Вам показалось, что персонаж поднимает руку слишком быстро, сделайте следующее: выделите обе части руки (плечо и предплечие), затем перейдите в строку отображения номеров кадров, выделите вторые ключи (у нас в одном итом же месте находятся два ключа - для плеча и для предплечия) чтобы выделились оба, натяните вокруг них прямоугольную область. Выделенные ключи станут белыми. Передвиньте их в какой-нибудь другой кадр, например 15-й. Можете вернуться назад и проиграть анимацию ещё раз.
Поставьте бегунок в следующую позицию (через несколько кадров после 15-го) и поверните плечо немного влево. Ещё несколько раз поперемещайте бегунок и поповорачивайте плечо туда-сюда. Затем создайте заключительный кадр, в котором рука будет опущена и чуть согнута в локте. Если вы запустите анимацию, то увидите, что плечо двигается так, как и должно двигаться когда человек машет рукой, а предплечье медленно наклоняется. Это происходит потому, что для предплечия мы создали только два ключа с достаточно большим расстоянием между ними.
Чтобы избавиться от этого эффекта, надо в последнем взмахе рукой создать ключ, в котором предплечие находится в правильном положении. Создать этот ключ желательно в том же кадре, в котором стоит ключ для последнего взмаха плечом (предпоследний ключ для плеча). Выделите плечо, чтобы отображались его анимационные ключи, и переместите бегунок в кадр, где находится его предпоследний ключ. Теперь выделите предплечие и поверните его в нужное положение. Проиграйте анимацию снова. Теперь персонаж машет рукой более естественно. Выключим кнопку Auto Key. Эту кнопку вообще лучше не держать зря включённой, поскольку в этом случае можно создать нежелательную анимацию во время редактирования и размещения объектов. При выключенной кнопке Auto Key анимация по-прежнему проигрывается, но теперь её нельзя создавать. Трансформация объектов приводит к тому, что сдвигается сама анимация. Если мы сейчас в нулевом кадре повернём руку персонажа так, чтобы она была вытянута вперёд и проиграем анимацию, то увидем, что рука движется в другом положении. Нажмём Undo, чтобы восстановить первоначальную анимацию.
Подводим итоги: мы создали много анимационных ключей для плеча и всего четыре ключа для предплечия. Между вторым и третим ключами предплечие неподвижно относительно своего родительского объекта - плеча.
Здесь файл с анимацией руки (формат 3ds MAX 6).
Инверсная кинематика (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 , IK) - процесс определения параметров связанных гибких объектов (например, кинематическая пара или кинематическая цепь) для достижения необходимой позиции, ориентации и расположения этих объектов. Инверсная кинематика является типом планирования движения (англ. ) . Инверсная кинематика активно используется в робототехнике , трёхмерной компьютерной анимации и в разработке компьютерных игр . Она используется в основном в тех ситуациях, когда необходимо точное позиционирование гибких сочленений одного объекта относительно других объектов окружающей среды. Алгоритм инверсной кинематики противоположен алгоритму прямой кинематики .
1 / 3
Прямая и инверсная кинематика в 3DS Max
Anime Studio Pro 10, 11(Moho Pro) - Как подключить инверсную кинематику на костяного персонажа
Полная костная инверсная кинематика в Anime Studio Pro (Moho Pro) / Full Inverse Kinematics
Инверсная кинематика, как и прямая , применяются к моделям каких-либо персонажей или объектов, которые созданы с использованием скелетной анимации . Суть скелетной анимации состоит в том, что объект состоит из набора твёрдых сегментов (компонентов), соединённых сочленениями (англ. joint ). При этом сегменты могут объединяться в кинематические пары , которые в свою очередь объединяются в кинематические цепи . Данные сегменты образуют иерархические цепочки, которые имеют «верхний» и «нижний» уровень. Сегменты (компоненты) верхних уровней называются компонентами-предками (или родительскими сегментами), а компоненты нижних - компонентами-потомками (или дочерними сегментами). Например, если рассмотреть руку человека, то плечевой сустав будет самым верхним уровнем, а кончик пальца - самым нижним, т. е. компонентом-потомком к плечевому суставу. Локтевой сустав находится внутри цепочки, он будет иметь как родительские (плечо), так и дочерние (запястье, пальцы) сегменты.
Основным отличием прямой кинематики от инверсной кинематики является то, что при прямой любое воздействие передается по иерархической цепочке сверху вниз. Например, при движении тазобедренного сустава двигаются все потомки, т. е. коленный сустав и все остальные. Инверсная кинематика использует принцип, диаметрально противоположный принципу прямой - перемещение компонентов-потомков приводит к изменению положения компонентов-предков, то есть алгоритм рассчитывает положение и ориентацию компонентов-предков, исходя из положения и ориентации компонентов-потомков.
В инверсной кинематике дочерний сегмент (компонент-потомок), который вызывает изменение положения и ориентацию других объектов и расположен в середине отдельной иерархической цепочке сегментов, называется эффектором (англ. effector ) . Если эффектор является конечным объектом данной иерархической цепочки, то он называется конечным эффектором (англ. end effector ). Именно через эффектор осуществляется манипулирование всей иерархической цепочкой. Изменение положения и/или ориентации конечного эффектора приводит к изменению положения и/или ориентации всех сегментов иерархической цепочки по законам инверсной кинематики. Изменение положения и/или ориентации простого (не конечного) эффектора приводит к тому, что положение объектов, стоящих по иерархии ниже его, меняется по законам прямой кинематики, а объектов с более высокой иерархией - по законам инверсной кинематики.
Ключом к успешной реализации инверсной кинематики является анимация в пределах ограничений (англ. constraints ): конечности модели персонажа должны вести себя в разумных антропоморфических пределах. Точно такая же ситуация и с робототехническими устройствами, которые имеют физические ограничения, такие как среда, в которой они работают, ограничения движения их суставов и ограниченные физические нагрузки и скорости, с которыми они в состоянии работать.
Инверсная кинематика является инструментом, который часто используют художники трёхмерной графики . Для художника проще выразить желаемое пространственное действие, чем непосредственно манипулировать углами сочленений. Например, инверсная кинематика позволяет художнику двигать рукой модели трёхмерного гуманоидного персонажа к желаемой позиции и ориентации. При этом сам алгоритм, а не художник, выбирает правильные углы запястья, локтя и плечевого сустава.
Например, если человек хочет схватить дверную ручку рукой, то его мозг должен сделать необходимые вычисления для правильного позиционирования руки и туловища человека. Основная цель состоит в том, чтобы двигать рукой, но нужно задействовать много сложных суставов с несколькими сочленениями, чтобы добраться рукой к желаемому объекту. Подобным образом происходит процесс в технологических приложениях - чтобы достичь желаемой цели, должны быть выполнены математические вычисления инверсной кинематики для расположения конечностей правильным образом. Примером, когда вычисления инверсной кинематики часто необходимы, является робототехника. Например, оператор робота хочет поместить какой-либо объект с помощью манипулятора , однако, естественно, он не хочет управлять каждым сочленением манипулятора отдельно.
Другими приложениями, где используется инверсная кинематика, являются приложения компьютерной графики и анимации . Например, аниматоры хотят управлять моделью гуманоидного персонажа, анимация которого генерируется компьютером, однако очень трудно анимировать индивидуальные сочленения. Решение состоит в том, чтобы смоделировать виртуальные сочленения «марионеточной куклы» и позволить аниматору двигать руками, ногами и туловищем куклы, а компьютер с использованием инверсной кинематики автоматически сгенерирует необходимые позиции конечностей для достижения результата.
Инверсная кинематика часто используется в компьютерных играх для создания анимации гуманоидных персонажей. В основном инверсная кинематика используется для создания анимации ног моделей человекоподобного существа или человека. Например, довольно просто создать анимацию передвижения (ходьба, бег) человека или наземного животного, если он движется по ровной плоскости. Однако если ландшафт неровный (бугристый, ухабистый, пересечённая или горная местность), то создание точной анимации ходьбы является фактически невозможной задачей. Анимация ног не будет соответствовать рельефу поверхности, что проявится в таких эффектах, как проскальзывание ног по поверхности и неточном позиционировании ног относительно её (ступня будет «утопать» в поверхность или «не доставать» до неё). Именно для качественного и эффективного решения этих проблем используется инверсная кинематика.
К другим приложениям, которые используют инверсную кинематику, относятся интерактивная манипуляция, управление анимацией и избежание столкновений .
Англоязычные источники
Она используется в основном в тех ситуациях, когда необходимо точное позиционирование гибких сочленений одного объекта относительно других объектов окружающей среды. Алгоритм инверсной кинематики противоположен алгоритму прямой кинематики .
Инверсная кинематика, как и прямая , применяются к моделям каких-либо персонажей или объектов, которые созданы с использованием скелетной анимации . Суть скелетной анимации состоит в том, что объект состоит из набора твёрдых сегментов (компонентов), соединённых сочленениями (англ. joint ). При этом сегменты могут объединяться в кинематические пары , которые в свою очередь объединяются в кинематические цепи . Данные сегменты образуют иерархические цепочки, которые имеют «верхний» и «нижний» уровень. Сегменты (компоненты) верхних уровней называются компонентами-предками (или родительскими сегментами), а компоненты нижних - компонентами-потомками (или дочерними сегментами). Например, если рассмотреть руку человека, то плечевой сустав будет самым верхним уровнем, а кончик пальца - самым нижним, т. е. компонентом-потомком к плечевому суставу. Локтевой сустав находится внутри цепочки, он будет иметь как родительские (плечо), так и дочерние (запястье, пальцы) сегменты.
Основным отличием прямой кинематики от инверсной кинематики является то, что при прямой любое воздействие передается по иерархической цепочке сверху вниз. Например, при движении тазобедренного сустава двигаются все потомки, т. е. коленный сустав и все остальные. Инверсная кинематика использует принцип, диаметрально противоположный принципу прямой - перемещение компонентов-потомков приводит к изменению положения компонентов-предков, то есть алгоритм рассчитывает положение и ориентацию компонентов-предков, исходя из положения и ориентации компонентов-потомков.
В инверсной кинематике дочерний сегмент (компонент-потомок), который вызывает изменение положения и ориентацию других объектов и расположен в середине отдельной иерархической цепочке сегментов, называется эффектором (англ. effector ) . Если эффектор является конечным объектом данной иерархической цепочки, то он называется конечным эффектором (англ. end effector ). Именно через эффектор осуществляется манипулирование всей иерархической цепочкой. Изменение положения и/или ориентации конечного эффектора приводит к изменению положения и/или ориентации всех сегментов иерархической цепочки по законам инверсной кинематики. Изменение положения и/или ориентации простого (не конечного) эффектора приводит к тому, что положение объектов, стоящих по иерархии ниже его, меняется по законам прямой кинематики, а объектов с более высокой иерархией - по законам инверсной кинематики.
Ключом к успешной реализации инверсной кинематики является анимация в пределах ограничений (англ. constraints ): конечности модели персонажа должны вести себя в разумных антропоморфических пределах. Точно такая же ситуация и с робототехническими устройствами, которые имеют физические ограничения, такие как среда, в которой они работают, ограничения движения их суставов и ограниченные физические нагрузки и скорости, с которыми они в состоянии работать.
Инверсная кинематика является инструментом, который часто используют художники трёхмерной графики . Для художника проще выразить желаемое пространственное действие, чем непосредственно манипулировать углами сочленений. Например, инверсная кинематика позволяет художнику двигать рукой модели трёхмерного гуманоидного персонажа к желаемой позиции и ориентации. При этом сам алгоритм, а не художник, выбирает правильные углы запястья, локтя и плечевого сустава.
Например, если человек хочет схватить дверную ручку рукой, то его мозг должен сделать необходимые вычисления для правильного позиционирования руки и туловища человека. Основная цель состоит в том, чтобы двигать рукой, но нужно задействовать много сложных суставов с несколькими сочленениями, чтобы добраться рукой к желаемому объекту. Подобным образом происходит процесс в технологических приложениях - чтобы достичь желаемой цели, должны быть выполнены математические вычисления инверсной кинематики для расположения конечностей правильным образом. Примером, когда вычисления инверсной кинематики часто необходимы, является робототехника. Например, оператор робота хочет поместить какой-либо объект с помощью манипулятора , однако, естественно, он не хочет управлять каждым сочленением манипулятора отдельно.
Другими приложениями, где используется инверсная кинематика, являются приложения компьютерной графики и анимации . Например, аниматоры хотят управлять моделью гуманоидного персонажа, анимация которого генерируется компьютером, однако очень трудно анимировать индивидуальные сочленения. Решение состоит в том, чтобы смоделировать виртуальные сочленения «марионеточной куклы» и позволить аниматору двигать руками, ногами и туловищем куклы, а компьютер с использованием инверсной кинематики автоматически сгенерирует необходимые позиции конечностей для достижения результата.
Инверсная кинематика часто используется в компьютерных играх для создания анимации гуманоидных персонажей. В основном инверсная кинематика используется для создания анимации ног моделей человекоподобного существа или человека. Например, довольно просто создать анимацию передвижения (ходьба, бег) человека или наземного животного, если он движется по ровной плоскости. Однако если ландшафт неровный (бугристый, ухабистый, пересечённая или горная местность), то создание точной анимации ходьбы является фактически невозможной задачей. Анимация ног не будет соответствовать рельефу поверхности, что проявится в таких эффектах, как проскальзывание ног по поверхности и неточном позиционировании ног относительно её (ступня будет «утопать» в поверхность или «не доставать» до неё). Именно для качественного и эффективного решения этих проблем используется инверсная кинематика.
К другим приложениям, которые используют инверсную кинематику, относятся интерактивная манипуляция, управление анимацией и избежание столкновений .
С конца 1811 го года началось усиленное вооружение и сосредоточение сил Западной Европы, и в 1812 году силы эти – миллионы людей (считая тех, которые перевозили и кормили армию) двинулись с Запада на Восток, к границам России, к которым точно так же с 1811 го года стягивались силы России. 12 июня силы Западной Европы перешли границы России, и началась война, то есть совершилось противное человеческому разуму и всей человеческой природе событие. Миллионы людей совершали друг, против друга такое бесчисленное количество злодеяний, обманов, измен, воровства, подделок и выпуска фальшивых ассигнаций, грабежей, поджогов и убийств, которого в целые века не соберет летопись всех судов мира и на которые, в этот период времени, люди, совершавшие их, не смотрели как на преступления.
Что произвело это необычайное событие? Какие были причины его? Историки с наивной уверенностью говорят, что причинами этого события были обида, нанесенная герцогу Ольденбургскому, несоблюдение континентальной системы, властолюбие Наполеона, твердость Александра, ошибки дипломатов и т. п.
Следовательно, стоило только Меттерниху, Румянцеву или Талейрану, между выходом и раутом, хорошенько постараться и написать поискуснее бумажку или Наполеону написать к Александру: Monsieur mon frere, je consens a rendre le duche au duc d"Oldenbourg, [Государь брат мой, я соглашаюсь возвратить герцогство Ольденбургскому герцогу.] – и войны бы не было.
Понятно, что таким представлялось дело современникам. Понятно, что Наполеону казалось, что причиной войны были интриги Англии (как он и говорил это на острове Св. Елены); понятно, что членам английской палаты казалось, что причиной войны было властолюбие Наполеона; что принцу Ольденбургскому казалось, что причиной войны было совершенное против него насилие; что купцам казалось, что причиной войны была континентальная система, разорявшая Европу, что старым солдатам и генералам казалось, что главной причиной была необходимость употребить их в дело; легитимистам того времени то, что необходимо было восстановить les bons principes [хорошие принципы], а дипломатам того времени то, что все произошло оттого, что союз России с Австрией в 1809 году не был достаточно искусно скрыт от Наполеона и что неловко был написан memorandum за № 178. Понятно, что эти и еще бесчисленное, бесконечное количество причин, количество которых зависит от бесчисленного различия точек зрения, представлялось современникам; но для нас – потомков, созерцающих во всем его объеме громадность совершившегося события и вникающих в его простой и страшный смысл, причины эти представляются недостаточными. Для нас непонятно, чтобы миллионы людей христиан убивали и мучили друг друга, потому что Наполеон был властолюбив, Александр тверд, политика Англии хитра и герцог Ольденбургский обижен. Нельзя понять, какую связь имеют эти обстоятельства с самым фактом убийства и насилия; почему вследствие того, что герцог обижен, тысячи людей с другого края Европы убивали и разоряли людей Смоленской и Московской губерний и были убиваемы ими.
Для нас, потомков, – не историков, не увлеченных процессом изыскания и потому с незатемненным здравым смыслом созерцающих событие, причины его представляются в неисчислимом количестве. Чем больше мы углубляемся в изыскание причин, тем больше нам их открывается, и всякая отдельно взятая причина или целый ряд причин представляются нам одинаково справедливыми сами по себе, и одинаково ложными по своей ничтожности в сравнении с громадностью события, и одинаково ложными по недействительности своей (без участия всех других совпавших причин) произвести совершившееся событие. Такой же причиной, как отказ Наполеона отвести свои войска за Вислу и отдать назад герцогство Ольденбургское, представляется нам и желание или нежелание первого французского капрала поступить на вторичную службу: ибо, ежели бы он не захотел идти на службу и не захотел бы другой, и третий, и тысячный капрал и солдат, настолько менее людей было бы в войске Наполеона, и войны не могло бы быть.
Ежели бы Наполеон не оскорбился требованием отступить за Вислу и не велел наступать войскам, не было бы войны; но ежели бы все сержанты не пожелали поступить на вторичную службу, тоже войны не могло бы быть. Тоже не могло бы быть войны, ежели бы не было интриг Англии, и не было бы принца Ольденбургского и чувства оскорбления в Александре, и не было бы самодержавной власти в России, и не было бы французской революции и последовавших диктаторства и империи, и всего того, что произвело французскую революцию, и так далее. Без одной из этих причин ничего не могло бы быть. Стало быть, причины эти все – миллиарды причин – совпали для того, чтобы произвести то, что было. И, следовательно, ничто не было исключительной причиной события, а событие должно было совершиться только потому, что оно должно было совершиться. Должны были миллионы людей, отрекшись от своих человеческих чувств и своего разума, идти на Восток с Запада и убивать себе подобных, точно так же, как несколько веков тому назад с Востока на Запад шли толпы людей, убивая себе подобных.
Действия Наполеона и Александра, от слова которых зависело, казалось, чтобы событие совершилось или не совершилось, – были так же мало произвольны, как и действие каждого солдата, шедшего в поход по жребию или по набору. Это не могло быть иначе потому, что для того, чтобы воля Наполеона и Александра (тех людей, от которых, казалось, зависело событие) была исполнена, необходимо было совпадение бесчисленных обстоятельств, без одного из которых событие не могло бы совершиться. Необходимо было, чтобы миллионы людей, в руках которых была действительная сила, солдаты, которые стреляли, везли провиант и пушки, надо было, чтобы они согласились исполнить эту волю единичных и слабых людей и были приведены к этому бесчисленным количеством сложных, разнообразных причин.