Параметрическая модель движения ног в анимации
Для чего это надо
В любой нетривиальной мультипликации существуют двигающиеся персонажи. Для их создания требуется отображать элементы ходьбы. В принципе, известно простое решение этой проблемы с помощью ключевых кадров. Автор рисует несколько ключевых положений ног, а компьютер создаёт промежуточные положения. Разнообразить полученные решения можно с помощью кривых, определяющих движение отдельных точек. Приложив определённые усилия, всегда можно добиться желаемого результата. Однако такой подход не всегда удобен. Предположим, что имеется несколько персонажей, и требуется придать каждому из них индивидуальную походку. В этой ситуации удобно пользоваться параметрической моделью, когда походка задаётся с помощью малого числа параметров. В этом случае достаточно хранить параметры для каждого характера и использовать их в нужном эпизоде для поделирования. Решение этой задачи предлагается в данной статье. Аналогичная модель строится для моделирования движения рук, поэтому ограничимся лишь анализом движения ног.
Полигональная модель ноги
Очевидно, что достаточно рассмотреть лишь полигональную модель, определяющую движение основных костей. Такая модель представлена на Fig.1. Здесь b,g,f означают длины бедра, голени и ступни соответственно. Углы α, β отсчитываются по часовой стрелке и являются отрицательными. Угол между голенью и стопой является постоянным и равен π/2. Стопа упирается в точку с координатами (x,y) на поверхности, а координаты суставов определяются уравнениями (1)
Здесь A,B,C положения трех суставов: пятки, колена, тазобедренного сустава.
Fig.1 Модель ноги
Ходьба носит периодический характер, поэтому нужно выделить какой-то момент, с начала которого будет моделироваться движение. В качестве такого момента берём положение ног, представленное на Fig.2 . В этот момент начинается поворот ступни передней ноги вокруг точки (x2,y2), а задняя нога начинает отрываться от поверхности. Эти точки определяют начала ступни на ногах. Заметим, что значения углов α, β не могут быть произвольными, поскольку обе ноги должны начинаться из одной точки, из тазобедренного сустава.
Fig.2 Начальное положение ног при моделировании ходьбы
Согласно (1), последнее условие означает, что должны быть выполнены равенства (2)
" > При известных углах β1 , β2 и положениях точек опоры из (1) находим значения B1, B2, а из векторного уравнения (2) получим два скалярных уравнения для вычисления углов α. Это делается с помощью вычислений, представленных на Snipp1 Snipp1
import numpy as np
Vec = (B_1 - B_2)/b
AngSum = -np.arctan(Vec[0]/Vec[1])
if AngSum >0: AngSum -=np.pi
AngDiff1 = np.arcsin(Vec[1]/(2*np.cos(AngSum)))
Alpha_1 = AngSum + AngDiff1
Alpha_2 = AngSum - AngDiff1
Здесь B_1= B1, B_2 = B2 -- векторы, подсчитанные согласно (1), а Alpha_1, Alpha_2 есть искомые α1 ,α2 соответственно.
Применение уравнений (1),(2) оказывается полезным и в других случаях, когда по некоторым известным параметрам требуется определить какой-либо другой ( например длину бедренной кости, когда известны все углы).
Динамика ног при ходьбе
Рассмотрим движение ног в течение одного шага. Начальное положение ног представлено на Fig.2 , конечным положением будет точно такое же, но только ноги поменяются местами. Для начальных углов используем обозначения: α10, α20, β10, β20. В течение одного шага угол α1, например, меняется в интервале от α10 до α20. Походка будет зависеть от совместных траекторий изменения всех этих углов. Прежде всего надо определиться с таймингом, с числом кадров необходимых для отображения одного шага. Обозначим это число через NumFrames. Чтобы получить возможность описать траектории изменения угла в виде малого числа параметров, используем квадратичную интерполяцию. Реализация этой интерполяционной функции имеется, например, в пакете scipy, это scipy.interpolate.interp1d. В представленном ниже скрипте показано, как эта функция используется для наших целей.
def calculateCurve(Beg,End,NumFrames,InterArg,InterVal):
Fun = interp1d([0,NumFrames*InterArg,NumFrames],
[Beg,InterVal,End],kind='quadratic')
return Fun
При постоянных значениях длин костей в модели ноги каждая траектория определяется пятью параметрами функции calculateCurve, возвращающей функию Fun(t). Эта функция для каждого значения t, где 0< t < NumFrames выдает нужное значение (угол). При этом Fun(0)=Beg, Fun(MunFrames-1) = End. Для того, чтобы имет возможность модифицировать траекторию, вводим ещё два параметра:InterArg < 1 и InterVal. Интерполированный сигнал обладает свойством Fun(NumFrames*InterArg)=InterVal. Эти два значения нужно подобрать таким образом, чтобы созданный сигнал как можно лучше аппроксимировал заданную траекторию. Это отдельная задача, и мы не рассматривает ее в данной статье. Нужно лишь следить за выполнением условия β < α, чтобы нога не приняла положение "коленками назад" (напомним, что все углы являются отрицательными).
Автор статьи использовал данную технику в своём ролике. Следует отметить, что качество анимации в этом ролике играет второстепенную роль. Пример анимации. Обратите внимание, что различаются походки женщины при движении к двери и от двери.
Andrey2007