2d - 什么类型的速度-时间曲线模拟在水平表面上滑动到停止的物体?

标签 2d physics game-physics chipmunk pymunk

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

A型

为了模拟物体滑动停止的方式,pymunk 允许程序员设置 space.damping ,它的工作原理是这样的(引自 API 引用):“0.9 的值意味着每个物体每秒将失去 10% 的速度。”

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

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

换句话说,加速度随着时间的推移而降低。 (有些人可能更喜欢说“减速度”或“负加速度”减少,但在最纯粹的物理学意义上,速度的任何变化都是“加速度”,在上图中,速度的变化随时间变小。)因为这样的曲线将接近但永远不会越过 0,使用一个截止点,在该截止点下, body 的速度被强制为 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?
其中建议了两种类型的曲线,但是当提问者回答了他的问题(有人帮助他实现了 Model-B 类型的曲线)时,社区并没有就哪种更“物理上准确”达成共识。 (我还为其中一张图表借用了提问者的 ASCII 艺术 - 谢谢。)

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

或者,也许对我来说“似乎”正确的东西(模型 B)毕竟是不正确的。任何想法表示赞赏。谢谢!

最佳答案

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

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

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

关于2d - 什么类型的速度-时间曲线模拟在水平表面上滑动到停止的物体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42516131/

相关文章:

c - 在循环中逐个字符读取二维数组

Java 2D 图像调整大小忽略双三次/双线性插值渲染提示 (OS X + linux)

c++ - WIN32 上 "iPhone"风格动画的最佳 2D 动画库/技术?

c++ - 两个类的 "Addition"

javascript - Phaser Box2d - 锁定一个方向的拖动

c# - 我可以在实现自己的 Vector2 结构的多个库中使用相同的 Vector2 结构吗?

javascript - 如何删除二维数组的 Angular 点索引?

unity3d - 每帧使用哪个公式进行拖动模拟?

python - 计算 Python 中感兴趣的频率 F 周围每个频带的能量

python - 如何让物体自行移动?