Как реализовать трение в физическом движке на основе «Advanced Physics Physics»

8

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

Как вообще можно реализовать правдоподобную модель трения поверх концепций из упомянутой статьи? И как можно найти найденное трение во вращении по кругу?


Я не хочу, чтобы этот вопрос был о моей конкретной реализации, а о том, как объединить идеи Якобсенса с более широкой системой трения в более общем плане. Но вот живая демонстрация, показывающая текущее состояние моего двигателя, который никак не обрабатывает трение: http://jsfiddle.net/Z7ECB/embedded/result/


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

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

paldepind
источник
Очень хорошая статья! Какое у тебя сейчас трение?
Микаэль Хегстрем
Да. Это отличная статья. Это очень просто, но все же у меня есть целый движок, подходящий для моих целей и работающий на его основе. За исключением трения;)
paldepind
И хорошее видео тоже. Выглядит многообещающе!
Микаэль Хогстрем

Ответы:

4

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

http://www.matthiasmueller.info/publications/posBasedDyn.pdf

Они утверждают, что трение в основном демпфирует скорость частицы в плоскости столкновения на некоторое скалярное значение.

Обратите внимание, что это не дает вам никаких эффектов кулоновского трения (величина импульса при столкновении не влияет на величину силы трения), но вы можете получить это, учитывая скорость частицы в плоскости столкновения.

Cholesky
источник
1
Что если при подаче импульса на неподвижное тело вы проверяете определенный порог. Если компонент импульса на контактной поверхности ниже этого порога, вы можете установить его на ноль, чтобы имитировать эффекты статического трения . С тех пор динамическое трение именно так, как вы это описали. +1
теодрон
0

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

РЕДАКТИРОВАТЬ:

Чтобы рассчитать величину сил трения, у вас есть значение смещения на вашем изображении. Поскольку вы используете верлет с фиксированным временным шагом, мы знаем, что на самом деле это смещение - это скорость, с которой контакт находился в направлении нормали контакта (ну, не совсем так, и я думаю, что именно это имеет в виду автор, делая лучшее приближение трения ). Знание скорости вдоль нормали контакта очень важно, так как мы можем использовать ее для определения импульса. Лучше всего применять трение в виде импульсов в каждом кадре, где есть контакт. Размер трения в осях, параллельных плоскости контакта, определяется коэффициентом трения (определяется материалами, например 0,7 для достаточно высокого трения). Максимальное трение, которое вы можете получить - это коэффициент трения, умноженный на смещение. Обратите внимание, что это значение может быть больше, чем фактическая скорость вдоль одной из осей. В этом случае у вас статическое трение, и частица вообще не должна двигаться по этой оси. Если значение меньше, чем это, частица будет немного двигаться, но будет замедлена, то есть динамическое трение.

Микаэль Хегстрём
источник
Ты прав. Самое сложное, по крайней мере для меня, состоит в том, чтобы определить, как «правильно установить положение затронутой частицы».
paldepind
Ах, хорошо, тогда я вижу, где ты. У меня есть идея для решения, я отредактирую ответ
Микаэль Хогстрем
Это именно та техника, описанная в статье;). Я думаю, что я попробую осуществить это и пойду, если это достаточно хорошо для моего проекта все же.
paldepind
Ааа, я так думаю ... Похоже, что метод почти такой же, как для двигателя с твердым телом, просто учтите интеграцию верлетов и применяйте импульсы при изменении положения.
Микаэль Хогстрём