Знакомство с инверсной кинематикой. Инверсная кинематика. В чём разница между градиентом и производной

Для Андроид 19.04.2019
Для Андроид

Что такое «Инверсная кинематика»?

Задачей инверсной кинематики является поиск такого набора конфигураций сочленений, который обеспечил бы максимально мягкое, быстрое и точное движение к заданным точкам. Однако, множество существующих ныне методов страдают от таких недостатков как высокая вычислительная сложность и неестественность результирующих поз. В этой статье описан новый (вероятно, на момент написания статьи - 2010 г. ) эвристический метод под названием «Метод прямого и обратного следования» (Forward and Backward Reaching Inverse Kinematics , далее просто FABRIK),
FABRIK избегает использования вращений и матриц в пользу непосредственного получения точки на прямой. Благораря этому, дело обходится всего несколькими итерациями, имеет низкую стоимость вычислений и визуально естественную позу в результате. FABRIK так-же без проблем справляется с наложением ограничений а так-же использованием нескольких цепей и/или конечных точек. Именно об этом методе этот пост.

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

1. Искусственная модель тела

Система из множества твёрдых тел состоит из набора твёрдых тел, называемых узлами, соединёнными вместе рёбрами. Все рёбра являются компонентами concerned с движением: они ограничивают перемещения в пределах некоторого угла относительно соседних рёбер. Моделирование виртуального тела важно для вычисления позы человека. Модель с правильно расставленными ограничениями позволит получить набор правильных поз, что даст возможность получить более реалистичное движение. Большинство моделей подразумевают твёрдость частей тела, хотя это просто примерное приближение к реальности.
Скелет обычно смоделирован в виде иерархии твёрдых сегментов соединённых рёбрами, каждое из которых задано такими свойствами как длинна, форма, обьём и масса. Манипулятор, на манер робо-руки или анимированного персонажа, смоделиован как цепь, собранная из твёрдых узлов, сопряженных друг с другом рёбрами. Каждое перемещение и/или вращение кости с индексом i влияет на все последующие элементы цепи. Цепь можно формализовать следующим образом: всякий узел без дочерних элементов следует величать конечной точкой; для каждой конечной точки цепь может быть сформирована движением обратно по скелету, от родителя к родителю до тех пор, пока не будет встречен корневой узел цепи (начало цепи). По определению, в задаче IK предполагается статичность корневого узла. Однако, методы обычно справляются с перемещением корня.

Алгоритм полного цикла алгоритма FABRIK (псевдокод, первый элемент массива под индексом 1)

Исходные данные: массив позиций узлов p[i] с i = 1...n, целевая позиция t и значения дистанций между сопряжёнными узлами. d[i] = | p -t | 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 | } }

2.FABRIK - новое эвристическое решение задачи IK

В этой части предоставляется суть метода FABRIK. Он использует позиции, уже рассчитанные в режимах прямого и обратного следования. FABRIK достигает минимизации ошибки путём единоразовой подстройки угла каждого узла. Т.е. происходит обход всей цепи, начиная с последнего узла, с подстройкой угла каждого обойдённого узла, после чего, происходит обход цепи уже в обратном направлении. Этот метод, в отличие от преобразования вращений, обращает задачу поиска позиции узла в задачу поиска точки на прямой; следовательно, можно сэкономить время и уменьшить количество вычислений. Предположим что множество p,…, p[n] является множеством позиций узлов манипулятора. Также, предположим что p является корневым узлом и p[n] является конечным узлом, т.о. для простоты оставим один конечный узел. Цель представлена позицией t и начальной базовой позицией b . Метод FABRIK представлен в листинге выше и графической интерпретации полного цикла на рисунке слева, с одной целевой точкой и четырьмя узлами в цепи. Рассмотрим полный цикл алгоритма на рисунке:

  • a - Начальные позиции манипулятора и цели.
  • b - Двигаем конечный узел p к цели.
  • c - Обнаруживаем позицию p" p" и p , на дистанции d от точки p" .
  • d - Повторяем для всех узлов.
  • e - Вторая стадия алгоритма: передвигаем крневой элемент с позиции p" на его начальную позицию.
  • f - Повторяем для всех узлов, но на этот раз начинаем с базы и двигаемся к конечному узлу. Алгоритм повторяется до тех пор, пока позиция конечного элемента не приблизится к цели на достаточное расстояние.

Более подробно:
Сначала считаются позиции между узлами (массив 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 имеет преимущество на базовых фигурах, такие как сферы, прямые, плоскости и окружности, достаточно просто отображаемые алгебраическими обьектами. Поэтому, поиск позиции узла, находящегося между двумя известными узлами, может быть выражен пересечением двух сфер с центрами на соответствующих этим узлам позициям, и радиусом, равным расстоянию между позициям искомого узла и имеющимися; новая позиция узла будет лежать на ближайшей точке окружности, сформированной пересечением двух сфер. Другая простая оптимизация заключается в прямом построении прямой в направлении цели, когда последняя недоступна.

3. Модель с множеством конечных узлов


Как и в случае с одним конечным узлом, алгоритм разбивается на два этапа:

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

4. Ограничители

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

  • a - Начальные конфигурации манипулятора и цели.
  • b - Двигаем конечный узел p к цели и ориентируем его на неё.
  • c - Обнаруживаем позицию p" , лежащую на линии между позициями p" и p , на дистанции d от точки p" .
  • d - Переориентируем узел на позиции p" таким образом, чтобы он смотрел вдоль ребра, соединяющего p" и p" .
  • e - Вычисление ограничивающего эллипса: разрешённые позиции находятся в затенённом участке. Ни одна из вершин на этом этапе никуда не двигается.
  • f - Узел p перемещается на позицию p^ , который является ближайшей позицией на затенённом эллипсе, удостоверяясь таким образом в том, что новая позиция p^ будет лежать в допустимых пределах.
  • g - Двигаем узел p^ на точку p" , чтобы сохранить длинну ребра.
  • h - Переориентируем p" , чтобы удовлетворить ограниение ориентации.

Эта процедура повторяется для всех узлов, в прямом и обратном порядке, аналогично тому, как в варианте без ограничений осуществлялись перемещения. При этом, ограничение «эллипс», вероятно, является характеристикой ребра, а не узла, т.о. на второй фазе перемещаться на эллипс должен узел p - прим. перев.

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

Описание

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

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

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

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

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

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

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

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

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

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

Напишите отзыв о статье "Инверсная кинематика"

Примечания

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

Англоязычные источники
  • Hugo Elias. (англ.) . freespace.virgin.net. Проверено 5 июня 2009. .
  • Hugo Elias. (англ.) . freespace.virgin.net. Проверено 5 июня 2009. .
  • (англ.) . www.learnaboutrobots.com. Проверено 5 июня 2009. .
  • (англ.) . Проверено 5 июня 2009. .
  • Martin John Baker. (англ.) . www.euclideanspace.com. Проверено 5 июня 2009. .
  • Lydia E. Kavraki. (англ.) . cnx.org. Проверено 5 июня 2009. .
  • Diego Park. (англ.) . diegopark.googlepages.com. Проверено 5 июня 2009. .
  • Bill Baxter. (англ.) . billbaxter.com (21 февраля 2000 года). Проверено 5 июня 2009. .
  • (англ.) . www.virtualitoy.com. - Флэш-скрипт на сайте, который позволяет "одеть" человеческую модель. Для анимации одевания используется инверсная кинематика. Проверено 5 июня 2009. .
Русскоязычные источники
  • Hugo Elias (перевод на русский - Pavel A. Chuvanov). . GameDev.ru (8 июня 2002 года). Проверено 5 июня 2009. .
  • . . Проверено 5 июня 2009. .
  • Светлана Шляхтина. . журнал . Проверено 7 июня 2009. .
  • . Проверено 5 июня 2009. .
  • . . Проверено 7 июня 2009. .
  • . . Проверено 7 июня 2009. .
  • Алексеев В. (недоступная ссылка - история ) . (10 января 2008 года). Проверено 5 июня 2009. .
  • Майкл Комет. . Mir3D.ru . - Урок по созданию инверсной кинематике в 3ds Max . Проверено 7 декабря 2009.

Отрывок, характеризующий Инверсная кинематика

– Он теперь здесь, скажите ему… чтобы он прост… простил меня. – Она остановилась и еще чаще стала дышать, но не плакала.
– Да… я скажу ему, – говорил Пьер, но… – Он не знал, что сказать.
Наташа видимо испугалась той мысли, которая могла притти Пьеру.
– Нет, я знаю, что всё кончено, – сказала она поспешно. – Нет, это не может быть никогда. Меня мучает только зло, которое я ему сделала. Скажите только ему, что я прошу его простить, простить, простить меня за всё… – Она затряслась всем телом и села на стул.
Еще никогда не испытанное чувство жалости переполнило душу Пьера.
– Я скажу ему, я всё еще раз скажу ему, – сказал Пьер; – но… я бы желал знать одно…
«Что знать?» спросил взгляд Наташи.
– Я бы желал знать, любили ли вы… – Пьер не знал как назвать Анатоля и покраснел при мысли о нем, – любили ли вы этого дурного человека?
– Не называйте его дурным, – сказала Наташа. – Но я ничего – ничего не знаю… – Она опять заплакала.
И еще больше чувство жалости, нежности и любви охватило Пьера. Он слышал как под очками его текли слезы и надеялся, что их не заметят.
– Не будем больше говорить, мой друг, – сказал Пьер.
Так странно вдруг для Наташи показался этот его кроткий, нежный, задушевный голос.
– Не будем говорить, мой друг, я всё скажу ему; но об одном прошу вас – считайте меня своим другом, и ежели вам нужна помощь, совет, просто нужно будет излить свою душу кому нибудь – не теперь, а когда у вас ясно будет в душе – вспомните обо мне. – Он взял и поцеловал ее руку. – Я счастлив буду, ежели в состоянии буду… – Пьер смутился.
– Не говорите со мной так: я не стою этого! – вскрикнула Наташа и хотела уйти из комнаты, но Пьер удержал ее за руку. Он знал, что ему нужно что то еще сказать ей. Но когда он сказал это, он удивился сам своим словам.
– Перестаньте, перестаньте, вся жизнь впереди для вас, – сказал он ей.
– Для меня? Нет! Для меня всё пропало, – сказала она со стыдом и самоунижением.
– Все пропало? – повторил он. – Ежели бы я был не я, а красивейший, умнейший и лучший человек в мире, и был бы свободен, я бы сию минуту на коленях просил руки и любви вашей.
Наташа в первый раз после многих дней заплакала слезами благодарности и умиления и взглянув на Пьера вышла из комнаты.
Пьер тоже вслед за нею почти выбежал в переднюю, удерживая слезы умиления и счастья, давившие его горло, не попадая в рукава надел шубу и сел в сани.
– Теперь куда прикажете? – спросил кучер.
«Куда? спросил себя Пьер. Куда же можно ехать теперь? Неужели в клуб или гости?» Все люди казались так жалки, так бедны в сравнении с тем чувством умиления и любви, которое он испытывал; в сравнении с тем размягченным, благодарным взглядом, которым она последний раз из за слез взглянула на него.
– Домой, – сказал Пьер, несмотря на десять градусов мороза распахивая медвежью шубу на своей широкой, радостно дышавшей груди.
Было морозно и ясно. Над грязными, полутемными улицами, над черными крышами стояло темное, звездное небо. Пьер, только глядя на небо, не чувствовал оскорбительной низости всего земного в сравнении с высотою, на которой находилась его душа. При въезде на Арбатскую площадь, огромное пространство звездного темного неба открылось глазам Пьера. Почти в середине этого неба над Пречистенским бульваром, окруженная, обсыпанная со всех сторон звездами, но отличаясь от всех близостью к земле, белым светом, и длинным, поднятым кверху хвостом, стояла огромная яркая комета 1812 го года, та самая комета, которая предвещала, как говорили, всякие ужасы и конец света. Но в Пьере светлая звезда эта с длинным лучистым хвостом не возбуждала никакого страшного чувства. Напротив Пьер радостно, мокрыми от слез глазами, смотрел на эту светлую звезду, которая, как будто, с невыразимой быстротой пролетев неизмеримые пространства по параболической линии, вдруг, как вонзившаяся стрела в землю, влепилась тут в одно избранное ею место, на черном небе, и остановилась, энергично подняв кверху хвост, светясь и играя своим белым светом между бесчисленными другими, мерцающими звездами. Пьеру казалось, что эта звезда вполне отвечала тому, что было в его расцветшей к новой жизни, размягченной и ободренной душе.

С конца 1811 го года началось усиленное вооружение и сосредоточение сил Западной Европы, и в 1812 году силы эти – миллионы людей (считая тех, которые перевозили и кормили армию) двинулись с Запада на Восток, к границам России, к которым точно так же с 1811 го года стягивались силы России. 12 июня силы Западной Европы перешли границы России, и началась война, то есть совершилось противное человеческому разуму и всей человеческой природе событие. Миллионы людей совершали друг, против друга такое бесчисленное количество злодеяний, обманов, измен, воровства, подделок и выпуска фальшивых ассигнаций, грабежей, поджогов и убийств, которого в целые века не соберет летопись всех судов мира и на которые, в этот период времени, люди, совершавшие их, не смотрели как на преступления.
Что произвело это необычайное событие? Какие были причины его? Историки с наивной уверенностью говорят, что причинами этого события были обида, нанесенная герцогу Ольденбургскому, несоблюдение континентальной системы, властолюбие Наполеона, твердость Александра, ошибки дипломатов и т. п.
Следовательно, стоило только Меттерниху, Румянцеву или Талейрану, между выходом и раутом, хорошенько постараться и написать поискуснее бумажку или Наполеону написать к Александру: Monsieur mon frere, je consens a rendre le duche au duc d"Oldenbourg, [Государь брат мой, я соглашаюсь возвратить герцогство Ольденбургскому герцогу.] – и войны бы не было.
Понятно, что таким представлялось дело современникам. Понятно, что Наполеону казалось, что причиной войны были интриги Англии (как он и говорил это на острове Св. Елены); понятно, что членам английской палаты казалось, что причиной войны было властолюбие Наполеона; что принцу Ольденбургскому казалось, что причиной войны было совершенное против него насилие; что купцам казалось, что причиной войны была континентальная система, разорявшая Европу, что старым солдатам и генералам казалось, что главной причиной была необходимость употребить их в дело; легитимистам того времени то, что необходимо было восстановить les bons principes [хорошие принципы], а дипломатам того времени то, что все произошло оттого, что союз России с Австрией в 1809 году не был достаточно искусно скрыт от Наполеона и что неловко был написан memorandum за № 178. Понятно, что эти и еще бесчисленное, бесконечное количество причин, количество которых зависит от бесчисленного различия точек зрения, представлялось современникам; но для нас – потомков, созерцающих во всем его объеме громадность совершившегося события и вникающих в его простой и страшный смысл, причины эти представляются недостаточными. Для нас непонятно, чтобы миллионы людей христиан убивали и мучили друг друга, потому что Наполеон был властолюбив, Александр тверд, политика Англии хитра и герцог Ольденбургский обижен. Нельзя понять, какую связь имеют эти обстоятельства с самым фактом убийства и насилия; почему вследствие того, что герцог обижен, тысячи людей с другого края Европы убивали и разоряли людей Смоленской и Московской губерний и были убиваемы ими.
Для нас, потомков, – не историков, не увлеченных процессом изыскания и потому с незатемненным здравым смыслом созерцающих событие, причины его представляются в неисчислимом количестве. Чем больше мы углубляемся в изыскание причин, тем больше нам их открывается, и всякая отдельно взятая причина или целый ряд причин представляются нам одинаково справедливыми сами по себе, и одинаково ложными по своей ничтожности в сравнении с громадностью события, и одинаково ложными по недействительности своей (без участия всех других совпавших причин) произвести совершившееся событие. Такой же причиной, как отказ Наполеона отвести свои войска за Вислу и отдать назад герцогство Ольденбургское, представляется нам и желание или нежелание первого французского капрала поступить на вторичную службу: ибо, ежели бы он не захотел идти на службу и не захотел бы другой, и третий, и тысячный капрал и солдат, настолько менее людей было бы в войске Наполеона, и войны не могло бы быть.
Ежели бы Наполеон не оскорбился требованием отступить за Вислу и не велел наступать войскам, не было бы войны; но ежели бы все сержанты не пожелали поступить на вторичную службу, тоже войны не могло бы быть. Тоже не могло бы быть войны, ежели бы не было интриг Англии, и не было бы принца Ольденбургского и чувства оскорбления в Александре, и не было бы самодержавной власти в России, и не было бы французской революции и последовавших диктаторства и империи, и всего того, что произвело французскую революцию, и так далее. Без одной из этих причин ничего не могло бы быть. Стало быть, причины эти все – миллиарды причин – совпали для того, чтобы произвести то, что было. И, следовательно, ничто не было исключительной причиной события, а событие должно было совершиться только потому, что оно должно было совершиться. Должны были миллионы людей, отрекшись от своих человеческих чувств и своего разума, идти на Восток с Запада и убивать себе подобных, точно так же, как несколько веков тому назад с Востока на Запад шли толпы людей, убивая себе подобных.
Действия Наполеона и Александра, от слова которых зависело, казалось, чтобы событие совершилось или не совершилось, – были так же мало произвольны, как и действие каждого солдата, шедшего в поход по жребию или по набору. Это не могло быть иначе потому, что для того, чтобы воля Наполеона и Александра (тех людей, от которых, казалось, зависело событие) была исполнена, необходимо было совпадение бесчисленных обстоятельств, без одного из которых событие не могло бы совершиться. Необходимо было, чтобы миллионы людей, в руках которых была действительная сила, солдаты, которые стреляли, везли провиант и пушки, надо было, чтобы они согласились исполнить эту волю единичных и слабых людей и были приведены к этому бесчисленным количеством сложных, разнообразных причин.

Мы поработали с инструментом Joint и разобрались, как он работает. Теперь давайте посмотрим, как можно управлять суставами более простым способом. В этой главе я расскажу про некоторые из таких средств, и затем мы сможем использовать их далее для риггинга нашего персонажа. И первым инструментом, с которым я вас познакомлю, это один из самых важных инструментов, о которых вы должны узнать – это инструмент IK Handle. Я просто расскажу, что такое инверсная кинематика (Inverse Kinematics), как она работает и основы того как ее настроить.

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

Инверсная кинематика основана на понятии Goal - цель, то есть места, куда должен повернуться сустав. Это позволяет нам указать конечную позицию сустава при повороте. Самый простой способ запомнить это – понять что, прямая кинематика основана на вращении сустава, а инверсная кинематика основана на позиции сустава, в которой он должен оказаться в пространстве, когда мы вращаем его.

Давайте я вам быстро покажу пример. У меня здесь две одинаковые цепочки суставов. Первая цепочка суставов не имеет обратной кинематики, поэтому управление ею происходит через Forward kinematics, а на нашей правой цепочке у нас установлен IK Handle, позволяющий управлять суставами с использованием Inverse Kinematics. Я перейду к окну проекции вид сбоку. И я немного приближу модель в окне проекции, чтобы лучше видеть.

Еще раз, Forward Kinematics - это поворот. Я хочу выбрать конец этой цепочки суставов и переместить вот этот сустав в центр координат. Я буду вращать все эти суставы вокруг одной точки. Давайте сразу начнем это делать. Я нажму клавишу E, чтобы включить инструмент Rotate, и как видите, когда мы начинаем его вращать, то довольно непросто достичь цели при помощи одних только поворотов. Так что я поверну этот сустав вот так, а этот так, а этот снова поверну немного назад, и возможно нужно опять повернуть этот. Я сейчас делаю все на глаз, и не делаю слишком аккуратно при расположении этих суставов, потому что вращение и положение суставов не слишком совпадают друг с другом.

Inverse kinematics делает этот процесс гораздо более простым. Если мы хотим точно куда-то переместить эту цепочку с инверсной кинематикой, все, что мне нужно сделать, щелкнуть по этому крестику внизу, он называется IK Handle1. Теперь я могу нажать W, чтобы перейти к инструменту Move, и просто переместить мой сустав в цель.

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

Обычно Forward Kinematics дает нам более естественное перемещение, так как оно основано на поворотах, что очень натурально выглядит в анимации персонажей. Но оба метода имеют место быть. Я показал вам, как это работает, теперь давайте я покажу вам, как быстро их настроить. Давайте создадим новую сцену File / New Scene и получим пустое пространство. И перейдем к окну проекции вид сбоку. Я выберу Skeleton / Joint tool.

Давайте сделаем очень простую цепь суставов, состоящую из двух костей. Я щелкаю левой кнопкой здесь и создам сустав. Я немного смещусь сюда относительно центральной оси, и создам еще один сустав здесь. Мы получили небольшой угол здесь, который укажет Inverse kinematics, в какую сторону мы хотим поворачивать сустав. Мы делали это раньше, в предыдущей главе, и теперь я покажу вам, зачем мы это делаем. Сейчас у нас есть цепочка суставов, поэтому давайте установим Inverse kinematics на эту цепь.

Мы можем перейти в Skeleton, IK handle tool, или можно использовать вот этот значок, они оба работают одинаково. Теперь нам нужно выбрать первый сустав, из которого будем делать IK цепочку, пусть он будет верхним. И теперь последний сустав, он будет нижним. У нас есть промежуточные суставы, но это важно, что я именно выбираю сразу последний.

И у нас появился IKHandle1. Мы можем выбрать его, нажать W, и как видите, мой сустав посередине сгибается в этом направлении. Если бы я сделал мою цепь прямой, IKHandle бы не сработал, так как не понял бы, в каком направлении сгибать сустав, поэтому мы и сделали тут небольшой изгиб. Давайте заглянем в Аутлайнер. Видите, вот наши суставы.

А IKHandle - это отдельный объект и он не находится на цепочке суставов. Поэтому мы можем перемещать его отдельно и менять положение суставов. Вот основы того, как работать с IK Handles и инверсной кинематикой в Мауа.

Поэтому нужно запомнить, что у нас есть два способа управлять суставами, прямая кинематика и инверсная кинематика, и каждый имеет свои преимущества

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

В случае прямой кинематики каждый сустав просто поворачивается вручную, как это было сделано в предыдущем разделе с примером скелета. При повороте корневого суста­ ва цепи (например, плечевого сустава) вращательное движение передается по цепи сус­ тавов дальше вниз и перемещает все дочерние суставы. На рис. 8.9 представлена создан­ ная в предыдущем разделе структура руки с повернутым суставом плеча. Хотя создать такое движение относительно несложно и в Майя просто рассчитать его, для располо­ женных ниже по цепи суставов оно недостаточно точное. Если, например, необходимо прикоснуться запястьем к другому объекту, то сначала необходимо повернуть плечо, по­ том локоть, а потом, возможно, настроить поворот обоих суставов так, чтобы в точности

получить необходимое движение. И этот способ не только занимает больше времени для перемещения конечности. Так как вращение корневого сустава иерархии перемещает всю иерархию, в этом примере сустав запястья будет перемещаться при перемещении любых других расположенных выше по иерархии суставов, в результате чего по ходу анимации он будет плавно двигаться вокруг своей оси. Такой эффект определенно неже­ лателен, а управление им занимает много времени и сил. С другой стороны, прямая ки­ нематика идеальна для создания дугообразных движений, как у рук при плавании или ног при выполнении гимнастического упражнения "колесо", так что это средство имеет смысл держать в арсенале оснащения персонажей.

В то же время инверсная кинематика намного более сложная математически, но вместе с тем предусматривает точную регулировку суставов конечностей и, когда остальная часть иерархии уже установлена, помогает управлять движением этих суставов. В инверсной ки­ нематике движение сустава конечности (на самом деле управляющего положением сустава маркера (handle)) приводит к повороту суставов вверх по цепи, поэтому движение распро­ страняется по цепи в обратном (backward), или инверсном (inverse), направлении.

Инверсная кинематика использует маркеры инверсной кинематики (IK handle), или просто маркеры IK, и решатели инверсной кинематики (IK solver), или просто решатели IK. Маркер инверсной кинематики проходит по суставам, на которые распространяется его влияние, эти суставы называют цепью управляемой инверсной кинематикой (IK chain), и сквозь эту же цепь проходит линия маркера (handle wire). Управляющий вектор (handle vector) выходит из начального сустава и заканчивается в конечном, в ко­ тором располагается конечный исполнительный элемент (end effector). После добавления решателя IK в рассмотренную в предыдущем примере цепь суставов можно будет ани- мировать простым перемещением сустава запястья. При этом плечо и локоть будут вра­ щаться так, чтобы вся рука двигалась правильно, как показано на рис. 8.10.

Рис. 8.9. Прямая кинематика: при Рис. 8.10. Перемещение цепи сус- повороте сустава, старшего в тавов с помощью перемещения ко- иерархии, перемещается вся цепь печного исполнительного элемента суставов маркера инверсной кинематики

Чтобы выполнить правильный поворот всех суставов (от начального до конечного) цепи, управляемой инверсной кинематикой, при котором конечный сустав окажется на месте конечного исполнительного элемента, решатель IK обращается к позиции конеч­ ного исполнительного элемента цепи и выполняет необходимые вычисления. Когда ко­ нечный исполнительный элемент перемещается, решатель IK преобразует значения его перемещений в значения поворотов суставов и суставы соответственно обновляются. Обычно управляемая инверсной кинематикой цепь распространяется только на три сус-

тава, но суставов в ней может быть и больше, особенно если используется маркер инверс­ ной кинематики сплайна (IK Spline handle), который управляет лежащими в его основе суставами с помощью кривой. Среди реализованных в Maya решателей инверсной кине­ матики можно выделить четыре (и соответствующие типы инверсной кинематики): ре­ шатель ikrP для расчета инверсной кинематики вращения плоскости (IK rotat e Plane), решатель ikSC для расчета инверсной кинематики простой цепи (IK Single Chain), реша­ тель ikSpline для расчета инверсной кинематики сплайна (IK Spline) и решатель ikSpring для расчета инверсной кинематики пружины (IK Spring). Каждый тип реша­ теля IK имеет собственный тип маркера IK.


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

Никто, однако, не считает зазорным изучать анимацию годами, натыкаясь на каждом углу на справедливость поговорки «Век живи - век учись».

Если в общем, то скелетная анимация - это анимирование 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 принципов, заложенные



Рекомендуем почитать

Наверх