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

时间:2017-02-28 18:24:49

标签: 2d physics game-physics chipmunk pymunk

我正在用一些滑动物体(如冰壶或沙狐球)的自上而下的视图写一个小游戏。 (我碰巧将PyMunk用于物理学,但由于这个问题一般是关于物理模拟的,所以不要担心语言细节。) 在我开始调整我的小卡片中的所有值以获得感觉'之前的行为之前是的,我想我最好先检查一下,确保我首先建立正确的速度曲线模型。然而,找到一个明确的答案已经证明比预期的要困难得多。

模型A

为了模拟对象滑动停止的方式,pymunk允许程序员设置space.damping,其工作原理如此(引用API参考):"值为0.9表示每个正文每秒会失去10%的速度。"

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

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

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

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

模型B

直观地思考,似乎加速度会随着时间的推移而增加,形成如下曲线:

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

如果我想象一本书在水平表上推动它似乎最初保持其大部分速度但是很快就停止了(可能是因为摩擦导致减速率增加了?虽然&#39 ;为什么它在这里不是那么重要)。 这在pymunk中实现起来有点困难,只是因为没有内置的方法,但是可以做到。 并不是说我不相信花栗鼠/ pymunk开发者,但我不确定它们是否意味着阻尼来模拟我试图模拟的东西。

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

你可能会想到"为什么这个人在编程网站上询问物理问题?",但在过去四个小时看物理网站后无处可去,我的希望是,因为物理这些天,编程在编程中很常见,SO社区中的某些人可能已经知道了他们可以轻松分享的事情。

我很清楚SO上的讨论:how to calculate a negative acceleration? 建议使用两种类型的曲线,但当提问者回答他的问题时(某人帮助他实施了Model-B型曲线),社区没有达成共识,哪个更符合物理准确度#39 ;。 (我还借用了提问者的ASCII艺术作为其中一个图表 - 谢谢。)

我也知道这个来自pymunk展示的carrom板模拟的例子: https://github.com/samiranrl/Carrom_rl 这也使用内置阻尼(上面的模型A)。它似乎对他们的目的很好。但是,如果模型A不正确,我们人类观察者可能不会注意到,因为卡罗姆碎片长时间没有运动。当我在我的模拟游戏中尝试它时,模型A看起来不对,但是,但是我想要更长,更慢的镜头,所以也许它在那里更明显。

或者,似乎'似乎'对我而言(模型B)毕竟不是正确的。任何想法都表示赞赏。谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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都没有)。也就是说,不断的fricton - >恒定减速 - >速度线性下降。但是,从公式

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

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