我正在写一个小游戏,上面是一些滑动物体的视图,比如冰壶或沙狐球。 (我碰巧在物理上使用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)并不是正确的。任何想法都表示赞赏。谢谢!
谢谢!我并没有预料到预期的实施将会受到限制,所以我会仔细研究tank.c,以了解你是如何在那里做到的。感谢您的帮助和链接。 –