Я пишу небольшую игру с видом сверху на некоторые скользящие объекты, такие как керлинг или шаффлборд. (Я использую PyMunk для физики, но, поскольку этот вопрос касается физического моделирования в целом, не беспокойтесь о языковых особенностях.) Прежде чем я начну настраивать все значения в моем маленьком симе, чтобы получить поведение, которое «ощущается» правильным , я подумал, что мне лучше проверить, чтобы убедиться, что я, по крайней мере, моделирую правильную кривую скорости в первую очередь. Однако найти четкий ответ на этот вопрос оказалось значительно сложнее, чем ожидалось.
Модель А
Чтобы имитировать остановку объекта, pymunk позволяет программисту установить space.damping
, что работает следующим образом (цитата из справочника по API): «Значение 0,9 означает, что каждое тело будет терять 10% своей скорости в секунду. "
Это имеет смысл, но кажется, что это даст кривую зависимости скорости от времени с этой базовой формой (не говоря уже о точных числах):
|*
v |
e |
l | *
o |
c | *
i | *
t | *****
y | ****************
---------------------------*----
time
Другими словами, ускорение уменьшается со временем. (Некоторые могут предпочесть сказать, что «замедление» или «отрицательное ускорение» уменьшаются, но в самом чистом физическом смысле любое изменение скорости является «ускорением», и на графике выше изменение скорости со временем уменьшается.) Потому что такая кривая будет приближаться, но никогда не пересечет 0, используется отсечка, при которой скорость тела принудительно равна 0. Pymunk также предоставляет настройку для отсечки: space.idle_speed_threshold
.
Это кажется достаточно простым, но дало довольно неудовлетворительные результаты, когда я попробовал это в моей небольшой симуляции. Итак, я начал рассматривать Модель Б, приведенную ниже.
Модель Б
Думая об этом интуитивно, кажется, что ускорение будет увеличиваться со временем, образуя такую кривую:
|********
v | ******
e | ****
l | ***
o | ***
c | **
i | **
t | *
y | *
--------------------------------
time
Если я представлю, как толкаю книгу по ровному столу, то сначала она будет сохранять большую часть своей скорости, но затем очень быстро остановится (возможно, потому, что трение вызывает увеличение скорости замедления? Хотя «почему» это не так? тут не так важно). Это немного сложнее реализовать в pymunk хотя бы потому, что для этого нет встроенного метода, но это можно сделать. Дело не в том, что я не доверяю разработчикам бурундуков/пиманков, но я не уверен, что они имели в виду демпфирование для имитации того, что я пытаюсь имитировать.
Итак, мой вопрос не в том, как реализовать любую из этих кривых в коде, а в том, какой тип кривой точно моделирует объект, скользящий до полной остановки на ровной поверхности?
Вы можете подумать: «Почему этот человек задает вопрос по физике на веб-сайте по программированию?», но, просматривая веб-сайты по физике в течение последних четырех часов и ничего не добившись, я надеюсь, что, поскольку физическое моделирование достаточно распространено в программировании в наши дни, кто-то в сообществе SO может иметь предварительные знания об этом, которыми они могут легко поделиться.
Мне известно об этом обсуждении на SO: как рассчитать отрицательное ускорение? в котором предложены оба типа кривых, но, хотя задавший вопрос получил ответ на свой вопрос (кто-то помог ему реализовать кривую типа Model-B), сообщество не пришло к единому мнению о том, что является более «физически точным». (Я также позаимствовал ASCII-арт этого автора для одной из диаграмм - спасибо.)
Я также знаю об этом примере моделирования доски для каррома из витрины pymunk: https://github.com/samiranrl/Carrom_rl Здесь также используется встроенное демпфирование (модель A выше). Кажется, для своих целей он отлично работает. Но может случиться так, что мы, люди-наблюдатели, не заметим, если модель А неверна, поскольку кусочки каррома не находятся в движении очень долго. Модель А выглядела неправильно, когда я пробовал ее в своей симуляции, но тогда, но я пытаюсь сделать гораздо более длинные и медленные снимки, так что, возможно, там это более заметно.
Или, может быть, то, что «кажется» мне правильным (Модель Б), в конце концов, не так. Любые мысли приветствуются. Спасибо!