解释逐步到达目标位置背后的数学原理

Explain the math behind progressively reaching a target position

我正在尝试使物体位置到达另一个物体。不是直接使用两者的向量差,而是根据归一化的差向量向前移动。但是我看到有人用奇怪的方式计算它。

这是一些伪代码。假设 "A" 想搬到 B。

// called every frame
function update()
{
    Vec3 diff = B.position - A.position;
    diff/=100;   
    A.position = A.position + diff;
}

当然,到达目标位置的方法涉及阻尼。的确, 它需要一遍又一遍地迭代。无论如何,它终于到达了那个目标位置。那么它背后的数学原理是什么?我需要微积分来计算吗?

Zeno's paradox 的阴影。每一步之后,两个位置之间的剩余距离是上一步剩余距离的0.99倍,随着n趋于无穷大,(0.99)^n趋于零。远在无穷远之前,距离将缩小到小于一个像素。数据类型和舍入误差给出了一个复杂的因素,因为可以想象 diff 可能在两个位置相同之前下溢到 0(如果您使用浮点数来表示它们)。

好吧,你仍然在使用它们之间的矢量差,你只是在每一步向位置 B 移动 1% 的距离。距离大时步幅大,越近步幅越小。

这段代码有很酷的优点。希望它更快地接近:除以一个较小的数字。想让它接近得更慢:除以一个更大的数字。

此外,位置B可以是移动物体。 A 向 B 移动,B 移动。在下一步中,将重新计算向量,以便 A 移动到新的 B 位置。

两个很好的答案,但它们没有涉及算法背后的数学理论。该代码实际上描述了一个 linear first-order ordinary differential equation.

SO 不支持 Latex,因此我将其写为文本。 ODE 描述为:

da/dt = 1/100 * (-a + b)

我使用粗体表示法,因为 ab 可以是向量。如果按照上面的link,可以看到等式可以改写为

da/dt + p(t)*a = g(t)

其中 p(t) = 1/100g(t) = 1/100 * b。由此得出(再次link)mu(t)= exp(1/100 * t)和目标:

K = integral(1/100 * b(t) * exp(-1/100 * t) dt)

给出了一个通用的解决方案:

a(t) = K + C * exp(-1/100 * t)

,其中 KC 分别取决于 b 的值。 a 的初始值。如果 b(t) 是常数,则

a(t) = b + (a(0)-b)*exp(-1/100*t)

记住 exp(0) = 1 和 exp(-infinity) = 0

这是什么意思?

A 遵循从起点到 B 的指数路径:最初它行进速度很快,但越接近 B.

就会减慢

我提到的 link 显示了这样一个指数曲线的例子,对于一些不同的起点,都到 50: