Time 时间校正Verlet集成和太大的时间步长

Time 时间校正Verlet集成和太大的时间步长,time,physics,collision,verlet-integration,Time,Physics,Collision,Verlet Integration,我使用了一个时间校正的Verlet集成,可以在这里找到: 但是,当我的球在墙上(水平的墙上,球在上面,加速度向下)一段时间后,我的游戏无法正确识别碰撞,球就会落下。 如果我像1/60那样给deltatime加上一个固定的上限,它似乎会起作用 我认为问题是时间步长太大了。 但是时间修正的verlet集成是为了避免太大的时间步长,对吗? 如果是,为什么我需要时间上限?据我所知,时间修正的verlet积分仅在帧率波动时有用,但如果基本帧率太低,则无效。文章中给出的等式是错误的。当我推导它时,我得到:

我使用了一个时间校正的Verlet集成,可以在这里找到:

但是,当我的球在墙上(水平的墙上,球在上面,加速度向下)一段时间后,我的游戏无法正确识别碰撞,球就会落下。 如果我像1/60那样给deltatime加上一个固定的上限,它似乎会起作用

我认为问题是时间步长太大了。 但是时间修正的verlet集成是为了避免太大的时间步长,对吗?
如果是,为什么我需要时间上限?

据我所知,时间修正的verlet积分仅在帧率波动时有用,但如果基本帧率太低,则无效。

文章中给出的等式是错误的。当我推导它时,我得到:

x = x + (x – xl)*h/hl + a*h*(h + hl)/2
而不是他的,这是:

x = x + (x – xl)*h/hl + a*h^2
下面是一个使用他的图表的例子:

我不知道我的帧率是否太低,但我使用一个线程,每个周期我都会进行verlet集成。两个线程周期之间的增量不是固定的,而是波动的。可能是因为有时候帧率太低。如果是这样的话,使用cap是正确的?我添加了一个控制球何时改变单元格的函数。例如,当球将单元格从1更改为2时,函数将检查最后一个单元格是否有墙。如果为true,则将球移动到最后一个单元,其位置和最后一个位置设置为相等(碰撞到墙->速度=0)。但有时,如果我没有deltatime的限制,它就不起作用@L–m Tran DuyCan你能澄清变量代表什么吗?h是时间步持续时间(delta time),hl是上一个时间步(delta time...L代表“last”),x和xl是位置,a是加速度。另外,我有点像程序员,所以它不是一个真正的“等式”,更像是赋值操作,其中x的值被重新赋值。我已经很久没有研究这个问题了,所以我无法指出文章中的确切逻辑错误,但它就在某个地方,因为正如链接的图片所示,文章要么误用了它所演示的每一种集成方法,要么错误地推导了它。我只是展示了如何正确使用Verlet。如果我没记错的话,我很久以前就给文章的宿主网站发了一封电子邮件,说它有多么可怕的误导和错误,但看起来他们从未纠正或删除过它,真是太遗憾了。我希望这不会让太多人沮丧,让他们远离这个话题,拖延他们的学习。看看我刚刚发现的,第三方确认!好吧,它是通过应用而不是推导来确认的。