Mag*_*xis 3 c++ math reduction simplification
基本上我正在研究物理游戏.需要减少侧向运动(如接近0,而不是变为负值),但我不知道它在哪个方向,所以我不知道是添加阻力还是减去阻力.
(如果物品向右移动,则具有正向力,向左移动,负向力)
现在我这样做:
if (objects[i]->force.x > 0)
objects[i]->force.x -= drag;
else
objects[i]->force.x += drag;
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但我觉得必须有一个更时尚的方式来做到这一点.
找到一种确保它不会超过0的方法也不会有什么坏处
如果您试图模拟摩擦,最简单的方法是知道速度并使用数学模型或微分方程来近似它.
dx
-c * --
dt
Run Code Online (Sandbox Code Playgroud)
基本上,摩擦力与速度和反方向成正比.因此,您可以简单地计算摩擦力(或阻力),如下所示:
objects[i]->force = -drag_coefficient * objects[i]->velocity
Run Code Online (Sandbox Code Playgroud)
如果您不知道速度,则很难获得良好的结果,因为您可能有一个向右推力,而物体向左移动(因此您将向正确的方向施加阻力).
实际上,并非所有类型的摩擦都取决于速度的大小(速度),干摩擦通常被称为仅考虑速度的方向:
force = -drag_coefficient * sign(velocity)
Run Code Online (Sandbox Code Playgroud)
然而,在计算上,当速度达到0时,它变得不稳定,过冲并且来回振荡.
另一个模型是用于湿摩擦的模型,这是我在第一个例子中使用的模型:
force = -drag_coefficient * velocity
Run Code Online (Sandbox Code Playgroud)
这意味着当你的物体运行得更快时,它会因摩擦而减慢.想想空气的力量,当你跑步时,你跑得越快,空气越慢,你越慢.
上述两种型号都不是100%准确,但对于游戏而言,它们应该足够了