Я реализовал физический движок, основанный на концепциях в классическом тексте « Продвинутая физика персонажей » Томаса Якобсена. Трение обсуждается очень кратко в статье, и сам Якобсен отмечает, как «другие и лучшие модели трения, чем эта, могли и должны быть реализованы».
Как вообще можно реализовать правдоподобную модель трения поверх концепций из упомянутой статьи? И как можно найти найденное трение во вращении по кругу?
Я не хочу, чтобы этот вопрос был о моей конкретной реализации, а о том, как объединить идеи Якобсенса с более широкой системой трения в более общем плане. Но вот живая демонстрация, показывающая текущее состояние моего двигателя, который никак не обрабатывает трение: http://jsfiddle.net/Z7ECB/embedded/result/
Ниже показано изображение и пример того, как обнаружение столкновений может работать в двигателе на основе документа. В интеграции Verlet текущая и предыдущая позиция всегда сохраняется. На основании этого рассчитывается новая позиция. В каждом кадре я вычисляю расстояние между кругами и линиями. Если это расстояние меньше радиуса окружности, произошло столкновение, и окружность проецируется перпендикулярно от линии отклонения в соответствии с размером перекрытия (смещение на рисунке).
Скорость является неявной благодаря интеграции Verlet, поэтому изменение положения также меняет скорость. Что мне нужно знать, так это как-то определить величину трения на круге и переместить его назад параллельно линии, чтобы уменьшить его скорость.
источник
Ответы:
Вы должны взглянуть на статью Матиаса Мюллера и др. "Динамика, основанная на позициях". По сути, это то же самое, что и статья Якобсона, и он может дать вам больше информации о трении.
http://www.matthiasmueller.info/publications/posBasedDyn.pdf
Они утверждают, что трение в основном демпфирует скорость частицы в плоскости столкновения на некоторое скалярное значение.
Обратите внимание, что это не дает вам никаких эффектов кулоновского трения (величина импульса при столкновении не влияет на величину силы трения), но вы можете получить это, учитывая скорость частицы в плоскости столкновения.
источник
В «нормальном» двигателе с твердым телом вы бы моделировали трение как импульсы, перпендикулярные нормали. Я полагаю, что в этом контексте это означало бы, что вместо импульсов необходимо соответствующим образом установить положение затронутой частицы. С установленными ограничениями это должно, если я правильно понимаю статью, итеративно достигать состояния, в котором трение также влияет на вращение. Я предполагаю, что под «лучшей моделью» автор подразумевает лучший способ определения величины трения, чем линейная проекция взаимопроникновения. Это, однако, предположение с моей стороны, так как я никогда не реализовывал физику таким подходом.
РЕДАКТИРОВАТЬ:
Чтобы рассчитать величину сил трения, у вас есть значение смещения на вашем изображении. Поскольку вы используете верлет с фиксированным временным шагом, мы знаем, что на самом деле это смещение - это скорость, с которой контакт находился в направлении нормали контакта (ну, не совсем так, и я думаю, что именно это имеет в виду автор, делая лучшее приближение трения ). Знание скорости вдоль нормали контакта очень важно, так как мы можем использовать ее для определения импульса. Лучше всего применять трение в виде импульсов в каждом кадре, где есть контакт. Размер трения в осях, параллельных плоскости контакта, определяется коэффициентом трения (определяется материалами, например 0,7 для достаточно высокого трения). Максимальное трение, которое вы можете получить - это коэффициент трения, умноженный на смещение. Обратите внимание, что это значение может быть больше, чем фактическая скорость вдоль одной из осей. В этом случае у вас статическое трение, и частица вообще не должна двигаться по этой оси. Если значение меньше, чем это, частица будет немного двигаться, но будет замедлена, то есть динамическое трение.
источник