基本上我是在一个物理游戏中计算阻力。侧向运动需要 减少(如接近 0,而不仅仅是负数),但我不知道它在哪个方向行进,所以我不知道是增加阻力还是减去阻力。
(如果一个项目向右移动,它有正向力,向左移动,负向力)
现在我正在这样做:
if (objects[i]->force.x > 0)
objects[i]->force.x -= drag;
else
objects[i]->force.x += drag;
这很好用,但我觉得一定有更流畅的方法来做到这一点。
找到一种方法来确保它不会超过 0 也没什么坏处
最佳答案
如果您尝试模拟摩擦,最简单的方法是了解速度并使用数学模型或微分方程对其进行近似。
dx
-c * --
dt
基本上,摩擦力与速度成正比,方向相反。因此,您可以简单地计算摩擦力(或阻力),如下所示:
objects[i]->force = -drag_coefficient * objects[i]->velocity
如果您不知道速度,就很难得到好的结果,因为您可能有一个力向右推,而物体向左移动(因此您会向错误的方向施加阻力)。
编辑:
其实,并不是所有的摩擦力都取决于速度的大小(速度),干摩擦力常被称为只是取速度的方向考虑速度:
force = -drag_coefficient * sign(velocity)
然而,在计算上,当速度达到 0 时,这会变得不稳定,超过它并来回振荡。
另一种模型是用于湿摩擦的模型,即我在第一个示例中使用的模型:
force = -drag_coefficient * velocity
这意味着当你的物体运行得更快时,它会因摩擦而减慢更多。想一想空气的力量,当你运行时,你跑得越快,空气就越想减慢你的速度。
上述模型都不是 100% 准确的,但对于游戏来说它们应该绰绰有余
关于c++ - 有没有更优雅/更聪明/更简洁的方法让未知数更接近 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16484680/