首页 文章

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

提问于
浏览
3

我正在写一个小游戏,上面有一些滑动物体的视图,比如卷曲或沙狐球 . (我碰巧将PyMunk用于物理学,但由于这个问题一般是关于物理模拟,不要担心语言细节 . )在我开始调整我的小sim中的所有值以获得“感觉”正确的行为之前,我想我最好检查一下,确保我至少可以 Build 正确的速度曲线 . 然而,找到一个明确的答案已经证明比预期更难 .

Model 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.

Model B

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

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

如果我想象在一张水平表上推一本书,它似乎一开始就保持了它的大部分速度但是很快就停止了(可能是因为摩擦导致减速的速度增加了?虽然它的'为什么'不是这里非常重要 . 这在pymunk中实现起来有点困难,只是因为没有内置的方法,但它可以完成 . 这不是我不相信花栗鼠/ pymunk开发者,但我不确定它们是否意味着阻尼来模拟我想要模拟的东西 .

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?

你可能会想“为什么这个人在编程网站上询问一个物理问题?”,但是在过去四个小时看物理网站后无处可去,我的希望是,因为物理建模在编程中很常见, SO社区中的某些人可能事先已经知道了这一点,他们可以随时分享 .

我知道关于SO的讨论:how to calculate a negative acceleration?,其中建议了两种类型的曲线,但是当提问者回答他的问题时(某人帮助他实施了Model-B类型的曲线),社区没有达成共识这更像'physically accurate' . (我还借用了提问者的ASCII艺术作为其中一个图表 - 谢谢 . )

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

或者,或许对我来说似乎是正确的(模型B)并不是正确的 . 任何想法都表示赞赏 . 谢谢!

2 回答

  • 2

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

    一个简单的摩擦模型就是说摩擦力与表面上的物体的数量成正比 . 也就是说,物体被压下的越硬,它感觉到的摩擦就越大 . 用手指在 table 上玩,你会体验到同样的事情 .

    那么,我们如何计算呢?我不确定你对vectors有多熟悉,所以我会尽力保持形式主义 . 我看着它只受重力的影响 .

    物体的向下力来自牛顿定律(否定因为它向下'向下')

    F_object = -m*g
    

    这意味着法向力(由 table 给予物体的力)

    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
    

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

  • 2

    简短的回答是减速是恒定的 .

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

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

相关问题