Какие типы кривых зависимости скорости от времени моделируют объект, скользящий до полной остановки на ровной поверхности?

Я пишу небольшую игру с видом сверху на некоторые скользящие объекты, такие как керлинг или шаффлборд. (Я использую 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 выше). Кажется, для своих целей он отлично работает. Но может случиться так, что мы, люди-наблюдатели, не заметим, если модель А неверна, поскольку кусочки каррома не находятся в движении очень долго. Модель А выглядела неправильно, когда я пробовал ее в своей симуляции, но тогда, но я пытаюсь сделать гораздо более длинные и медленные снимки, так что, возможно, там это более заметно.

Или, может быть, то, что «кажется» мне правильным (Модель Б), в конце концов, не так. Любые мысли приветствуются. Спасибо!


person J.C.T.Seymour    schedule 28.02.2017    source источник


Ответы (2)


Короткий ответ заключается в том, что замедление является постоянным.

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

В демонстрационном коде C есть пример того, как это сделать легко и правильно с ограничениями: https://github.com/slembcke/Chipmunk2D/blob/master/demo/Tank.c

person slembcke    schedule 28.02.2017
comment
Спасибо! Я не ожидал, что предполагаемая реализация будет делать это с ограничениями, поэтому я внимательно изучу tank.c, чтобы узнать, как вы это сделали. Спасибо за помощь и ссылку. - person J.C.T.Seymour; 01.03.2017

Ответ @slebcke правильный, я просто хочу немного рассказать о реальной физике.

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

Итак, как мы это вычисляем? Я не уверен, насколько вы знакомы с векторами, поэтому я постараюсь сократить формализм. . Я собираюсь предположить, что объект, на который мы смотрим, находится под влиянием только гравитации.

Направленная вниз сила объекта определяется законом Ньютона (отрицательна, потому что он движется «вниз»).

F_object = -m*g 

что означает, что нормальная сила (сила, прикладываемая таблицей к объекту) равна

F_normal = -F_object = m*g

Что я уже говорил о трении, так это то, что

F_friction = k*F_normal

где k — некоторая константа от 0 до 1 (0 -> отсутствие трения, 1 -> максимальное трение). Поскольку F_normal в нашем сценарии зависит только от массы, она постоянна, и, следовательно, сила трения также постоянна. Наконец, просто примените эту силу в направлении, противоположном скорости, и вы получите простую модель того, как работает трение!


Итак, мой вопрос не в том, как реализовать любую из этих кривых в коде, а в том, какой тип кривой точно моделирует объект, скользящий до остановки на ровной поверхности?

Сам вопрос, вероятно, немного не по теме, но ответ (для этой модели), таким образом, заключается в линейном уменьшении скорости (поэтому ни ваша модель A, ни B). То есть постоянное трение -> постоянное замедление -> линейное снижение скорости. Однако из формулы

s = v*t = (v_0 + a*t)*t = v_0*t + a*t^2

мы видим, что разрывной путь увеличивается квадратично.

person pingul    schedule 01.03.2017
comment
Спасибо! Мне не хватает S.O. «репутация» указывает на то, что ваш ответ был полезным, но это действительно было полезно. В частности, наблюдение в конце о квадратичном увеличении тормозного пути будет иметь решающее значение при разработке кода, позволяющего пользователю выбирать, как он будет запускать скользящий объект. - person J.C.T.Seymour; 01.03.2017