什么类型的速度随时间变化的曲线模拟物体在水平面上滑动到静止状态?

What types of velocity-over-time curve models an object sliding to a halt on a level surface?

我正在编写一个小游戏,其中包含一些滑动对象的自上而下视图,例如冰壶或沙狐球。 (我碰巧在物理上使用 PyMunk,但由于这个问题是关于一般物理模拟的,所以不要担心语言细节。) 在我开始调整我的小 sim 中的所有值以获得 'feels' 正确的行为之前,我想我最好检查一下以确保我至少首先建模了正确的速度曲线。然而,事实证明,找到一个明确的答案比预期的要难得多。

型号A

为了模拟对象滑动停止的方式,pymunk 允许程序员设置 space.damping,其工作方式如下(引用自 API 参考):"A value of 0.9 means that each body will lose 10% of its velocity per second."

这是有道理的,但似乎会产生具有这种基本形状的速度随时间变化的曲线(不要介意确切的数字):

     |*
  v  |       
  e  | 
  l  | *               
  o  |  
  c  |  * 
  i  |    *
  t  |      *****     
  y  |           ****************
     ---------------------------*---- 
             time

换句话说,加速度会随着时间的推移而降低。 (有些人可能更愿意说 "deceleration" 或 "negetive acceleration" 减少,但在最纯粹的物理学意义上,速度的任何变化都是 'acceleration',并且在上面的图表中,速度的变化随着时间的推移变得越来越小。 ) 因为这样的曲线将接近但永远不会超过 0,所以采用了一个截止点,在该截止点下物体的速度被强制为 0。Pymunk 也提供了一个截止点设置:space.idle_speed_threshold.

这看起来很简单,但是当我在我的小模拟中尝试时给出了相当不令人满意的结果。于是,我开始考虑下面的模型B。

模型 B

凭直觉想想,加速度似乎会随着时间的推移而增加,形成这样的曲线:

     |********
  v  |        ******
  e  |              ****
  l  |                  ***
  o  |                     ***
  c  |                        **
  i  |                          **
  t  |                            *
  y  |                             *
     -------------------------------- 
             time

如果我想象将一本书推过一个关卡 table 看起来它一开始会保持大部分速度但很快就会停止(可能是因为摩擦导致减速率增加? 虽然它的 'why' 在这里并不那么重要)。 这在 pymunk 中实现起来有点困难,只是因为它没有内置方法,但它可以完成。 这并不是说我不信任 chipmunk/pymunk 开发人员,但我不确定他们是否打算用阻尼来模拟我正在尝试模拟的东西。

所以,我的问题不是如何在代码中实现这些曲线中的任何一条,而是 - 哪种类型的曲线可以准确地模拟物体在水平面上滑动停止?

你可能会想 "Why is this person asking a physics question on a programming website?",但是在过去四个小时浏览物理网站却一无所获之后,我希望,由于物理建模在如今的编程中已经足够普遍,因此 SO 社区中的某个人可能有这方面的先验知识,他们可以很容易地分享。

我知道关于 SO 的讨论:how to calculate a negative acceleration? 其中建议了两种类型的曲线,但是虽然提问者的问题得到了回答(有人帮助他实现了 Model-B 类型的曲线),但社区并未就哪种曲线更多 'physically accurate' 达成共识。 (我还为其中一张图表借用了那个提问者的 ASCII 艺术 - 谢谢。)

我也知道 pymunk 展示中的这个卡罗姆板模拟示例: https://github.com/samiranrl/Carrom_rl 这也使用内置阻尼(上面的模型 A)。它似乎可以很好地满足他们的目的。但如果模型 A 不正确,我们人类观察者可能不会注意到,因为卡罗姆部件不会长时间运动。当我在我的 sim 中尝试时,模型 A 看起来是错误的,但是后来,但我正在尝试更长、更慢的镜头,所以它可能在那里更引人注目。

或者,也许 'seems' 适合我的(模型 B)根本不适合。任何想法表示赞赏。谢谢!

简短的回答是减速度是恒定的。

将冰球固定在表面的力是恒定的(因为质量是恒定的,重力也是恒定的)。这意味着摩擦力是恒定的,因此减速度也是恒定的。

C 演示代码有一个示例,说明如何使用约束轻松正确地执行此操作:https://github.com/slembcke/Chipmunk2D/blob/master/demo/Tank.c

@slebcke 的回答是正确的,我只是想详细说明一下实际的物理学。

一个简单的摩擦模型是说摩擦 与表面上的物体 'presses' 的大小成正比 。也就是说,物体被压得越重,它感觉到的摩擦力就越大。用手指在 table 上弹奏,你也会有同样的体验。

那么,我们如何计算呢?我不确定你对 vectors 有多熟悉,所以我会尽量减少形式主义。我将假设我们正在查看的物体仅受重力影响。

物体向下的力来自牛顿定律(负数,因为它会'downwards')

F_object = -m*g 

表示法向力(table给物体的力)为

F_normal = -F_object = m*g

那么,前面说的摩擦就是

F_friction = k*F_normal

其中 k 是介于 0 和 1 之间的某个常数(0 -> 无摩擦,1 -> 最大摩擦)。由于 F_normal 在我们的场景中仅取决于质量,它是恒定的,因此摩擦力也是恒定的。最后,只需在速度 的相反方向施加此力 ,您就可以得到一个摩擦力工作原理的简单模型!


So, my question is not how to implement either of those curves in code, but rather - which type of curve accurately models an object sliding to a halt on a level surface?

这个问题本身可能有点跑题,但答案(对于这个模型)因此是速度线性下降(所以你的模型 A 和 B 都不是)。即,恒定摩擦力-> 恒定减速度-> 速度线性下降。但是,从公式

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

我们看到断裂距离呈二次方增长。