解释逐步到达目标位置背后的数学原理
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)
我使用粗体表示法,因为 a
和 b
可以是向量。如果按照上面的link,可以看到等式可以改写为
da/dt + p(t)*a = g(t)
其中 p(t) = 1/100
和 g(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)
,其中 K
和 C
分别取决于 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:
我正在尝试使物体位置到达另一个物体。不是直接使用两者的向量差,而是根据归一化的差向量向前移动。但是我看到有人用奇怪的方式计算它。
这是一些伪代码。假设 "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)
我使用粗体表示法,因为 a
和 b
可以是向量。如果按照上面的link,可以看到等式可以改写为
da/dt + p(t)*a = g(t)
其中 p(t) = 1/100
和 g(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)
,其中 K
和 C
分别取决于 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: