Gamedev LectureСтатьи

Лекция #18. Физическое моделирование твердых тел с шарнирами и контактами + аддон #1. [Лектор - Кеша]

Автор:

[будет аддон]
<Innochenti> да, лекция будет с маленькими перерывами, вот.
<Innochenti> Ну что, поехали.
<Innochenti> Наконец-то мы узнаем что означает матрица A из рассказов Xperiens'а. %)
<Innochenti> Значит про лекцию:
<Innochenti> Будет описано о создании физического моделирования симуляции твердых тел с контактами и шарнирами.
<Innochenti> Будем рассматривать поэтапно, т.е.:
<Innochenti> - движение твердых тел без шарниров и контактов.
<Innochenti> - движение твердых тел с шарнирами и без контактов.
<Innochenti> - движение твердых тел с шарнирами и контактами.
<Innochenti> Сейчас пойдут очень очевидные вещи.
<Innochenti> v - скорость центра масс, f - сумма всех сил, действующих на тело(g, силы Кориолиса и любые другие сторонние силы) и m -масса тела, то ускорение удовлетворяет условиям второго закона Ньютона:
<Innochenti>  f = m(dv/dt)
<Innochenti> Т.е. линейный импульс связан с линейной скоростью массой (скаляром), в то время как угловой импульс связан с угловой скоростью матрицей инерции I.
<Innochenti> t = d(Iw)/dt
<Innochenti> В координатах тела, матрица инерции I = const.
<Innochenti> Мировые координаты можно получить по такой формуле:
<Innochenti> Iworld = RIR^T, где R - матрица вращения.
<Innochenti> Тогда получим основные уравнения движения (закон Ньютона):
<Innochenti> f = mv'
<Innochenti> t = Iw'+|w|Iw
<Innochenti> |w|Iw можно пренебречь.
<Innochenti> Или если переписать в матричном виде:
<Innochenti> Изображение
<Innochenti> Понятно, что для n тел уравнения примут вид
<Innochenti> Изображение
<Innochenti> В этом уравнении неизвестными являются v'.
<Innochenti> Для того что бы найти положение тела в момент времени h, достаточно использовать метод Эйлера, т.е. x(t+h)=x0+hx'(t)
<Innochenti> Например, в ODE, doom3sdk, метод Эйлера.
<Innochenti> Так, это все очень хорошо.
<Innochenti> Как теперь это все записать в физическом симуляторе.
<Innochenti> 1. Вычисление внешних сил действующих на систему.
<Innochenti> for all bodies in system
<Innochenti> {
<Innochenti> T = T + w x ( I * w ) + other_torque_forces;
<Innochenti> F = F + other_forces;
<Innochenti> }
<Innochenti> 2. Численные методы решения ДУ:
<Innochenti> for all bodies in system
<Innochenti> {
<Innochenti> v(t+h)=v(t)+F/m*dt;
<Innochenti> w(t+h)=w(t)+I*T*dt;
<Innochenti> x(t+h)=x(t)+v(t+h)*dt;
<Innochenti> dq = { w(t+h),1}
<Innochenti> q(t+h)=q(t)+dq*dt/2
<Innochenti> }
<Innochenti> 3. Сбрасываем все внешние силы действующие на тело в ноль:
<Innochenti> for all bodies in system
<Innochenti> {
<Innochenti> F = 0;
<Innochenti> T = 0;
<Innochenti> }
<Innochenti> Все, первую часть лекции прошли.
<Innochenti> Думаю вопросов нет.
<Innochenti> Или есть?
<Innochenti> Поехали дальше.

<Innochenti> II. Движение твердых тел с шарнирами и без контактов.
<Innochenti> Тут уже интереснее, потому что минимум можно моделировать шарниры. :)
<Innochenti> Вот примеры шарниров:
<Innochenti> Изображение
<Innochenti> Для учета в системе шарниров надо использовать закон Ньютона - Эйлера:
<Innochenti> Mv'=J^T*lambda +Fext
<Innochenti> Jv' = 0
<Innochenti> В этой системе неизвестными являются v' и lambda.
<Innochenti> Строки матрицы J содержат базисные вектора для силы связи.
<Innochenti> Размер матрицы J (cdof на n*6).
<Innochenti> cdof - количество ограниченных степеней свободы.
<Innochenti> n - количество тел в системе.
<Innochenti> lambda - множители Лагранжа (размерность = cdof), которые и есть величины сил.
<Innochenti> При этом, должно выполнятся условие: Jv' = 0
<Innochenti> т.е. якобиан данного шарнира содержит строки, которые как - то ограничивают ускорение(скорость) тела.
<Innochenti> зная lambda и J Якобиан для данного шарнира, мы получим силу ограничения: Fc=J^T*lambda.
<Innochenti> Теперь основная задача: как решить такую систему.
<Innochenti> пусть задана некая функция g(x), которая есть функция от пространства возможных координат твердых тел.
<Innochenti> проще говоря такая функция, которая убирает заданное число степеней свободы из системы.
<Innochenti> т.е. запрещает двигаться телу например в каком-то направлении, или плоскости, или относительно других тел.
<Innochenti> если g(x) = 0, то положение x твердого тела удовлетворяет связь.
<Innochenti> такие связи называются уравнения связи.
<Innochenti> если g(x)>=0, то неравенства связи.
<Innochenti> в данной части мы рассматриваем уравнения связи.
<Innochenti> поскольку мы ограничили положение тела, то ограничивается и его скорость.
<Innochenti> Найдем скорость взятием производной:
<Innochenti> dg(x)/dt = Jv
<Innochenti> матрица J - матрица связей Якоби, которая есть функцией текущей позиции тел вовлеченных во связи.
<Innochenti> ограничение на ускорение может быть найдено еще раз взятием производной:
<Innochenti> d(Jv)/dt = Jdv/dt + vdJ/dt = 0
<Innochenti> vdJ/dt можно пренебречь.
<Innochenti> связи ускорения и скорости используют ту же самую матрицу J, но связь ускорения содержит дополнительное слагаемое vdJ/dt.
<Innochenti> я это говорю потому, что когда мы будет делать шарниры, то достаточно брать производную один раз, а не два.
<Innochenti> тогда основное уравнение ограничения связей примет вид:
<Innochenti> Jdv/dt = 0
<Innochenti> и получим следующую систему:
<Innochenti>  Изображение
<Innochenti> Откуда v' находится по следующей формуле:
<Innochenti> Изображение
<Innochenti> найдя ускорение, подставим его в основное уравнения ограничения связей:
<Innochenti>  Изображение
<Innochenti> введем обозначения( о да, вот она матрица A! ):
<Innochenti>  Изображение
<Innochenti> получили СЛАУ:
<Innochenti> A*lambda=b
<Innochenti> которую надо решить относительно lambda.
<Innochenti> Найдя lambda, найдем и v'
<Innochenti> полученная систем уравнений обладает следующими особенностями:
<Innochenti> размерность столбца множителей Лагранжа lambda равна (6-dof), 6-dof = cdof
<Innochenti> где dof - число степеней в шарнире.
<Innochenti> Это означает, что чем больше степеней свободы в шарнире,
<Innochenti> тем меньше размер столбца множителей Лагранжа,
<Innochenti> и значит, тем меньшим получается размер разрешающей системы уравнений.
<Innochenti> кроме того, ее возможно разложить A = L*D*U, т.е. диагональ всегда будет ненулевая.
<Innochenti> и решать как показывал Экспа, или методом Краута.
<Innochenti> теперь все то же самое, только в дискретной форме
<Innochenti> поскольку мы будем использовать пошаговую схему работы, то запишем данное уравнение в дискретной форме, аппроксимируя ускорение конечной разностью:
<Innochenti>  Изображение
<Innochenti> при очень малых h.
<Innochenti> подставим ускорение во второй закон Ньютона:
<Innochenti> M(v(t+h)-v(t))/h=F
<Innochenti> поскольку F = J^T*lambda + Fext
<Innochenti> то, подставляя значения F в правую часть равенства M(v(t+h)-v(t))/h=F и выражая  получим v(t+h)
<Innochenti> получим:
<Innochenti> Изображение
<Innochenti> получили дискретную формулу для нахождения новой скорости в h время.
<Innochenti> теперь необходимо вывести дискретное значение lambda за h время.
<Innochenti> в дискретной форме основное условие ограничений записывается в таком виде:
<Innochenti> Jv(t+h)=0
<Innochenti> тогда подставляя в это уравнение Изображение , получим:
<Innochenti> Изображение
<Innochenti> и опять же СЛАУ, как в пред. случае.
<Innochenti> ну вот, думаю понятно, как заполнять матрицу масс M, да?
<Innochenti> теперь как заполнять матрицу J
<Innochenti> J матрица строиться из ациклического, неориентированного графа, который хранит информацию о связях между телами и шарнирами.
<Innochenti> Т.е. матрицу J можно задать как матрицу смежности между n телами и их k связями, в которой если i - е тело имеют j - связь, то их якобианы записываются в i - столбец и j ряд данной связи, иначе ставим нолики.
<Innochenti> например, пусть 5 тел скреплены шарнирами, как показано на рисунке:
<Innochenti> Изображение
<Innochenti> красные кружочки - шарниры.
<Innochenti> тогда матрицы J,M,J^T равны:
<Innochenti> Изображение
<Innochenti> Опять рассмотрим этапы в физ. симуляторе в псевдокоде:

Страницы: 1 2 3 Следующая »

18 марта 2006 (Обновление: 25 мар 2006)