阅读评论后,我想改变我的答案:将速度乘以 k < 1,如 k = 0.955,使其呈指数衰减。
解释(带有图表和可调方程!)如下......
我将您原始问题中的图表解释为显示速度保持在起始值附近,然后越来越快地下降。但是,如果你想象一本书滑过桌子,它会迅速从你身边移开,然后放慢速度,然后慢慢停下来。我同意@Chris Farmer要使用的正确模型是与速度成正比的阻力。我将采用这个模型并得出我上面建议的答案。我提前为这篇文章的长度道歉。我相信数学更好的人可以大大简化这一点。 另外,我直接将图表的链接放入其中,链接中有一些 SO 解析器不喜欢的字符。
网址现已修复。
我将使用以下定义:
x -> time
a(x) -> acceleration as a function of time
v(x) -> velocity as a function of time
y(x) -> position as a function of time
u -> constant coefficient of drag
colon : denotes proportionality
我们知道,由于阻力而产生的力与速度成正比。我们也知道力与加速度成正比。
a(x) : -u v(x) (Eqn. 1)
减号确保加速度与当前行进方向相反。
我们知道速度是综合加速度。
v(x) : integral( -u v(x) dx ) (Eqn. 2)
这意味着速度与其自身的积分成正比。我们知道e^x满足这个条件。所以我们假设
v(x) : e^(-u x) (Eqn. 3)
当我们求解方程中的积分时,指数中的阻力系数是这样的。2取消u返回方程。3.
现在我们需要弄清楚 的值u。正如所@BlueRaja指出的,e^x永远不会等于零,无论 x 是多少。但是对于足够负的 x,它接近于零。让我们考虑 1% 的原始速度被“停止” (您对阈值的想法),假设我们想在 x = 2 秒内停止(您可以稍后调整)。那么我们需要解决
e^(-2u) = 0.01 (Eqn. 4)
这导致我们计算
u = -ln(0.01)/2 ~= 2.3 (Eqn. 5)
让我们绘制图表v(x)。
看起来它在 2 秒内呈指数衰减到一个小值。到目前为止,一切都很好。
我们不一定要在 GUI 中计算指数。我们知道我们可以很容易地转换指数基,
e^(-u x) = (e^-u)^x (Eqn. 6)
我们也不想以秒为单位跟踪时间。我们知道我们有 20 毫秒的更新速率,所以让我们定义n一个滴答率为 50 滴答/秒的时间滴答。
n = 50 x (Eqn. 7)
用 Eqn 代入 u 的值。5 进入方程式。6,结合方程式。7,并代入Eqn。3,我们得到
v(n) : k^n, k = e^(ln(0.01)/2/50) ~= 0.955 (Eqn. 8)
让我们用我们新的 x 轴在 timeticks 中绘制它。
同样,我们的速度函数与在所需迭代次数中衰减到 1% 的东西成正比,并遵循“在摩擦影响下滑行”模型。我们现在可以将我们的初始速度乘以v0Eqn。8 得到任何时间步长 n 的实际速度:
v(n) = v0 k^n (Eqn. 9)
请注意,在实现中,没有必要跟踪 v0!我们可以将封闭形式转换v0 * k^n为递归得到最终答案
v(n+1) = v(n)*k (Eqn. 10)
这个答案满足了你不关心初始速度的约束——下一个速度总是可以只使用当前速度来计算。
值得检查以确保位置行为有意义。遵循这种速度模型的位置是
y(n) = y0 + sum(0..n)(v(n)) (Eqn. 11)
方程式中的总和。使用方程 9 的形式很容易求解11 。使用索引变量 p:
sum(p = 0..n-1)(v0 k^p) = v0 (1-k^n)/(1-k) (Eqn. 12)
所以我们有
y(n) = y0 + v0 (1-k^n)/(1-k) (Eqn. 13)
y0 = 0让我们用和绘制它v0 = 1。
于是我们看到一个急速的远离原点,顺着优美的海岸停了下来。我相信这个图表比你的原始图表更忠实地描述了滑动。
通常,您可以k使用等式进行调整
k = e^(ln(Threshold)/Time/Tickrate) (Eqn. 14)
where:
Threshold is the fraction of starting velocity at which static friction kicks in
Time is the time in seconds at which the speed should drop to Threshold
Tickrate is your discrete sampling interval
(感谢@poke您展示了 Wolfram Alpha 用于绘图 - 这非常甜蜜。)
旧答案
将速度乘以 k < 1,如 k = 0.98,使其呈指数衰减。