2017-02-28 54 views
3

我正在写一个小游戏,上面是一些滑动物体的视图,比如冰壶或沙狐球。 (我碰巧在物理上使用PyMunk,但是因为这个问题一般是关于物理模拟的,所以不要担心语言的细节问题。) 在我开始调整我的小sim的所有值之前, '对,我想我最好检查一下,确保我至少能够模拟正确的速度曲线。然而,找到明确的答案已经变得比预期的难得多。什么类型的速度随时间变化曲线模拟物体在水平面上停止滑动?

模型A

要模拟的对象滑动停止,pymunk允许程序员设置space.damping的方式,其工作原理是这样(从API参考引用):“0.9手段的值,它每个身体每秒会失去10%的速度。“

这是有道理的,但似乎会产生与此基本形状的速度 - 时间曲线(不去管确切的数字):

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

换句话说,加速度随着时间的推移而降低。 (有些人可能更喜欢说“减速”或“内在加速度”减小,但在最纯粹的物理意义上,速度的任何变化都是'加速度',而在上面的图表中速度的变化随时间变小。)因为这样一条曲线将接近但从未穿过0,采用一个临界值,在该临界值之下,身体的速度被迫为0.Pymunk也提供了截止点的设置:space.idle_speed_threshold

这似乎很简单,但当我在我的小模拟中尝试过时,结果相当不令人满意。所以,我开始考虑下面的模型B.

B型

关于它的直觉思维,好像加速度会随时间而增加,使得这样的曲线:

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

如果我想跨级表推一本书它似乎首先保持了它的大部分速度,但随后很快就停止了(可能是因为摩擦会导致减速速度的增加?尽管这里的“为什么”并不重要)。 如果仅仅因为没有内置的方法,这在pymunk中实现起来有点难,但可以完成。 这并不是说我不信任花栗鼠/ pymunk开发者,但我不确定他们是否意味着阻尼来模拟我试图模拟的东西。

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

你可能会想“为什么这个人在编程网站上问一个物理问题?”,但是在查看过去四个小时的物理网站并且无处可去之后,我的希望是,因为物理建模足够普遍在编程这些日子里,SO社区中的某个人可能对此有所了解,他们可以随时分享。

我知道这种讨论对SO:how to calculate a negative acceleration? 其中两种类型的曲线是建议,但同时提问者得到了他的问题回答(有人帮他实现模型-B型曲线),社区没有达成一个关于哪个更“物理上准确”的共识。 (我还借了提问者的ASCII艺术的图表之一 - 谢谢。)

我也知道从pymunk陈列柜卡罗姆板模拟这个例子: https://github.com/samiranrl/Carrom_rl 这也采用了内置阻尼(上面的模型A)。它似乎为他们的目的正常工作。但可能是我们的人类观察者不会注意到模型A是不正确的,因为这些模型片段很长时间没有运动。模型A在我的模拟中尝试过时看起来不对,但后来我尝试了更长时间的慢镜头,所以也许它在那里更加引人注目。或者,对我而言,“看起来”是正确的(模型B)并不是正确的。任何想法都表示赞赏。谢谢!

回答

2

简短的答案是减速是恒定的。

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

的C代码演示了如何用约束轻松,正确地做到这一点的例子:https://github.com/slembcke/Chipmunk2D/blob/master/demo/Tank.c

+0

谢谢!我并没有预料到预期的实施将会受到限制,所以我会仔细研究tank.c,以了解你是如何在那里做到的。感谢您的帮助和链接。 –

2

@ slebcke的答案是正确的,我只是想阐述一下实际的物理一点。

一个简单的摩擦模型就是说,摩擦力是与物体“按压”在表面上的数量成比例的关系。也就是说,物体被压下越困难,它感觉到的摩擦就越大。用手指在桌子上玩,你会体验到同样的事情。

那么,我们该如何计算呢?我不知道你对vectors有多熟悉,所以我会尽量保持形式主义。我将假设我们正在查看的对象仅受重力的影响。

的对象是从牛顿定律(负的,因为它会“向下”)

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 

我们看到断裂距离以二次方增加。

+0

谢谢!我缺乏S.O. '声誉'指出你的回答是有帮助的,但确实有帮助。特别是,当设计允许用户选择他们如何听到他们发射滑动物体的代码时,关于制动距离以二次方增加的最终观察将是至关重要的。 –