c++ - 有没有更优雅/更聪明/更简洁的方法让未知数更接近 0?

标签 c++ math reduction simplification

基本上我是在一个物理游戏中计算阻力。侧向运动需要 减少(如接近 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/

相关文章:

c++ - C/C++ 中的数学 - 舍入查询

C++ sin wave for pogo stick jumping公式

c - 进行最终还原的策略

algorithm - CUDA 中的 block 减少

c++ - 混淆后您的代码有多安全?

c++ - 张量积算法优化

c++ - 对结构成员使用泛型类型

c# - 从 .Net Standard 项目和 Native dll 创建一个 nuget 包

math - float 学有问题吗?

algorithm - 任何 NP 到 SAT。如何做到这一点并证明这是可能的?